it-swarm-id.com

Apakah ada contoh sederhana dari rutinitas enkripsi / dekripsi Asymmetric?

Saya dapat memahami kode Java, Perl dan JavaScript dengan sangat baik. Selebihnya, saya belum belajar, tapi saya kira saya bisa mencari cara membaca/menerjemahkan.

Saya ingin tahu apa yang paling sederhana dari rutinitas Asymmetric. Apakah terlalu rumit untuk ingin dikhawatirkan?

Saya benar-benar ingin tahu bagaimana mungkin untuk memiliki kunci enkripsi saja! Rasanya menakjubkan bagi saya bahwa itu bisa menolak rekayasa balik jadi saya ingin tahu cara kerjanya!

  1. Apakah terlalu rumit untuk itu?.
  2. Apa (salah satu) standar enkripsi Asymmetric sederhana yang paling sederhana yang bisa saya cari implementasinya?
  3. Jika Anda memiliki contoh kode minimal yang bagus.

Saya sudah memeriksa paragraf Wikipedia tentang Cara Kerja , tetapi tidak ada uraian matematis atau deskripsi implementasi, hanya banyak implementasi . Saya tidak benar-benar ingin memilih yang mana untuk dilihat secara acak, saya juga tidak ingin mengambil yang paling umum yang saya harapkan paling kuat dan paling rumit.

Adakah pikiran?

11
Bryan Field

Kredit diberikan kepada jawaban Jeff untuk detailnya dan jawaban Steve yang juga membantu. Kredit juga masuk ke jawaban tylerl yang menyertakan tautan ke Wikipedia untuk semua fungsi, terutama modInverse , juga menjelaskan titik awal yang ambigu untuk e. Terima kasih, Saya meningkatkan jawaban Anda, dan menggunakan informasi gabungan dari ketiga jawaban itu, saya menciptakan apa yang saya harap merupakan jawaban yang lebih baik.

Kunci untuk membuat rekayasa balik sangat mahal menggunakan kekuatan-dari . Akar kuadrat tidak begitu sulit, kekuatan 3 berarti Anda membutuhkan root potong dadu, tetapi kekuatan 34.051.489 cukup sulit. Ada operasi matematika lain yang sulit untuk direkayasa ulang. Ada juga beberapa cara untuk membuat Algoritma Asimetris, tetapi jawaban ini berfokus pada RSA. Yang tertua dan paling umum.

Algoritma RSA (berdasarkan the Java Kode )

Perhitungan di bawah ini harus dilakukan dengan integer presisi arbitrer . (Seperti BigInt atau BigInteger)

Membuat kunci:

  • Panjang kunci konstan adalah l.
  • Biasanya konstan e_start Dapat =3 Untuk kesederhanaan. Namun, 0x10001 Lebih umum, bagaimanapun, bilangan prima adalah yang terbaik (untuk alasan kinerja generasi kunci dan mungkin alasan lain).
  • p dan q adalah bilangan prima positif yang dihasilkan secara acak, yang membutuhkan hingga l bit untuk penyimpanan. (Agar ini tetap positif, bit pertama akan selalu 0)
  • n = p*q Ini digunakan untuk enkripsi dan dekripsi.
  • e dimulai sebagai e_start. Ini pada akhirnya akan menjadi bagian dari kunci enkripsi.
  • m = (p-1)*(q-1) digunakan untuk mengonversi e ke d, yang akan digunakan untuk dekripsi.
  • while(gcd(e,m)>1){e+=2} Ini diperlukan untuk langkah selanjutnya untuk bekerja.
  • d=modInverse(e,m) Ini melakukan operasi aritmatik standar. Mungkin tidak layak untuk diuji banyak, terutama jika bahasa pemrograman Anda memiliki built-in ini

Untuk mengenkripsi atau mendekripsi, pertama-tama konversi byte Anda ke integer presisi sewenang-wenang tunggal.

Enkripsi: encrypted=(plain^e)%n

Catatan: Jika plain>=n, Anda harus membagi plain menjadi dua atau lebih nilai yang lebih kecil dan mengenkripsi mereka secara terpisah.

Dekripsi: plain=(encrypted^d)%n

Enkripsi asimetris biasanya kurang efisien daripada enkripsi Symmetric. Terkadang enkripsi Asymmetric hanya digunakan untuk pertukaran kunci.

6
Bryan Field

Sejauh RSA berjalan, this memberikan contoh yang baik yang dapat diikuti dan menunjukkan contoh input dan output yang sesuai. Aplikasi demo ini akan memandu Anda melalui berbagai langkah dan memungkinkan Anda memeriksa pekerjaan. Terkadang hanya mengklik jalan Anda melalui sesuatu dalam langkah-langkah seperti itu akan membantu. Untuk artikel Wikipedia, Anda perlu melihat artikel algoritma aktual: RSA untuk matematika yang sesuai.

Dari segi implementasi, Anda dapat menggabungkan ini dengan jelas dalam Java dalam di bawah 30 baris .

Untuk pemahaman Anda, tidak ada yang namanya kunci enkripsi saja. Sebaliknya, ada dua kunci yang sama yang membalikkan operasi mitra mereka. Kami sewenang-wenang menetapkan salah satu pasangan sebagai pribadi dan satu sebagai publik. Hal-hal yang dienkripsi dengan satu kunci dapat didekripsi dengan kunci lainnya. Ini adalah prinsip yang digunakan dengan penandatanganan.

Ini bukan masalah rekayasa anti-terbalik yang membuat kunci aman, melainkan konsep matematika yang Anda tidak bisa cukup memeriksa ruang tombol besar (ketika kunci menggunakan ruang angka yang sangat besar) untuk menemukan kunci yang cocok. Tidak ada percepatan nyata untuk pekerjaan anjak piutang.

Ada algoritma kunci asimetris lainnya untuk dipelajari, tetapi saat Anda menatap ke atas, saya akan mencoba memahami RSA, yang tertua dan paling umum, pertama.

13
Jeff Ferland

Saya mengumpulkan demonstrasi RSA menggunakan python (python sangat mudah dibaca bahkan jika Anda belum pernah melihatnya). Kode ini cukup panjang sehingga tidak muat pada satu halaman, tetapi cukup singkat sehingga Anda dapat membaca dan memahaminya dalam beberapa menit.

Karena enkripsi/dekripsi dapat diselesaikan dalam satu perintah bawaan - exp(PLAINTEXT,KEY,MODULUS) - Saya juga melalui seluruh proses derivasi kunci juga.

Anda akan menemukan kode di sini: https://Gist.github.com/1239116

Ketika Anda menjalankan kode, ia meminta Anda untuk memberi masukan dalam bentuk >12345 atau <12345, Dimana > awalan mengatakannya untuk menerapkan kunci pribadi ke nomor tersebut, sementara < memberitahukannya untuk menerapkan kunci publik. Demi kesederhanaan, itu hanya mengkodekan angka; tetapi begitu Anda memilikinya, penyandian data acak hanyalah masalah memformat.

6
tylerl

Sebenarnya, matematika di sekitarnya cukup sederhana, seperti yang saya mengerti. Anda mengambil nilai dengan kekuatan bilangan prima rediculously besar (ribuan digit) dan melakukan mod dari nomor lain.

Jadi untuk mengenkripsi Anda memiliki sesuatu seperti: EncryptedBits = (PlainText ^ YourPublicKey)% Modulus

Dan untuk mendekripsi Anda memiliki sesuatu seperti: PlainText = (EncryptedBits ^ YourPrivateKey)% Modulus

Saya menemukan dokumen yang cukup mudah dibaca di sini: http://mathaware.org/mam/06/Kaliski.pdf

Saya tidak yakin tentang perpustakaan yang harus dilihat.

5
Steve

Jika Anda menginginkan solusi Perl yang lucu dan minimal, ada yang klasik oleh Adam Back from 1995 :

Itu dicetak pada t-shirt, termasuk barcode untuk membuatnya terbaca oleh komputer, bersama dengan pernyataan " T-shirt ini adalah Munition " . Pernyataan itu akurat di AS sebelum kriptografi yang kuat adalah direklasifikasi pada tahun 1996 tidak lagi secara teknis menjadi "amunisi". Tetapi masih ilegal untuk mengekspor kriptografi yang kuat dari AS sampai Peraturan Administrasi Ekspor (EAR) direvisi pada tahun 20 :

Perangkat lunak ini juga telah didistribusikan sebagai tato, tanda tangan email, label surat, dan dalam banyak bentuk lainnya, dan bahkan muncul (dalam bentuk buram) di New York Times (artikel, tanpa foto, online di Antara Peretas dan Tempat yang Sulit ). Versi 2-baris yang lebih baru adalah:

print pack"C*",split/\D+/,`echo "16iII*o\[email protected]{$/=$z;[(pop,pop,unpack"H*",<>
)]}\EsMsKsN0[lN*1lK[d2%Sa2/d0<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<J]dsJxp"|dc`

Perhatikan bahwa pendekatan asli bergantung pada program Unix "dc" untuk aritmatika presisi sewenang-wenang. Versi murni-Perl, dengan anotasi, ada di

2
nealmcb