Konsep kata sandi asimetris
1. Perbedaan utama dari algoritma enkripsi simetris adalah bahwa kunci enkripsi dan dekripsi berbeda, satu adalah publik (kunci publik) dan yang lainnya rahasia (kunci pribadi). Ini terutama memecahkan masalah manajemen alokasi utama algoritma enkripsi simetris dan meningkatkan keamanan algoritma.
2. Efisiensi enkripsi dan dekripsi algoritma enkripsi asimetris relatif rendah. Dalam desain algoritma, algoritma enkripsi asimetris memiliki persyaratan ketat tentang panjang data terenkripsi. Misalnya, algoritma RSA mensyaratkan bahwa data yang akan dienkripsi tidak boleh lebih besar dari 53 byte.
3. Algoritma enkripsi asimetris terutama digunakan untuk bertukar kunci algoritma enkripsi simetris, daripada pertukaran data.
4. Java6 menyediakan dua algoritma yang menerapkan DH dan RSA. Bouncy Castle menyediakan dukungan algoritma e1gamal. Selain tiga algoritma di atas, ada juga algoritma ECC, dan saat ini tidak ada komponen sumber terbuka yang relevan untuk memberikan dukungan.
Dua kunci diperlukan untuk enkripsi atau dekripsi, dibagi menjadi kunci publik dan pribadi
Fitur: Keamanan Tinggi, Kecepatan Lambat
menggunakan
【Key Exchange (DH)】
Tanpa menentukan kunci umum, kedua belah pihak menghasilkan kunci dan tidak memberikan pekerjaan enkripsi. Enkripsi dan dekripsi juga membutuhkan algoritma enkripsi simetris lainnya untuk diimplementasikan.
Contoh Algoritma DH
impor javax.crypto.keyagreement; import javax.crypto.interfaces.dhprivateKey; import javax.crypto.interfaces.dhpublickey; import javax.crypto.spec.dhparameterspec; impor java.security.*; java.security.spec.x509encodedkeyspec; impor java.util.hashmap; import java.util.map; // 1 menghasilkan kunci sumber // 2 kunci publik sumber diserahkan ke target, dan target menghasilkan kunci publik dan pribadi pribadi melalui sumber. // 3 Kunci publik target diserahkan ke sumber // 4 kedua belah pihak menggunakan kunci publik pihak lain dan kunci pribadinya sendiri untuk menghasilkan kunci lokal // 5 jika kedua belah pihak menghasilkan kunci lokal sama, lengkapi kunci pertukaran kunci kelas publik dhutil {public static string public_key = "dh_public_key"; string final public static private_key = "dh_private_key"; /** * Hasilkan pasangan kunci sumber * @return * @throws Exception */peta statis public <string, objek> initsourceye () melempar pengecualian {// Buat instance keyPairgenerator, pilih algoritma dh algoritmenerator keypairgenererator = keypairgenerator.getInstance ("dh"););); // Inisialisasi panjang kunci, default 1024, rentang opsional 512-65536 & kelipatan 64 keypairgenerator.initialize (1024); // Hasilkan keypair keypair kunci keypair = keypairgenerator.generatePiPAIR (); Dhpublickey dhpublickey = (dhpublickey) keypair.getPublic (); Dhprivatekey dhprivateKey = (dhprivateKey) keypair.getprivate (); // Masukkan pasangan kunci ke peta peta <string, object> keymap = new HashMap <String, Object> (); keymap.put (public_key, dhpublickey); keymap.put (private_key, dhprivateKey); KETYMAP kembali; } / ** * Menghasilkan pasangan kunci target melalui kunci publik sumber * @param SourcePublickey * @return * @throws Exception * / peta statis public <string, objek> inittargetkey (byte [] sourcePublickey) melempar pengecualian {keyfactory keyfactory = keyfactory.getInstance ("dh"); // Gunakan kunci publik sumber, hasilkan keyspec, dan gunakan KeyFactory untuk menghasilkan informasi PublicKey Sumber X509EncodedKeySpec keyspec = X509EncodedKeySpec baru (SourcePublickey); Dhpublickey sourcePublic = (dhpublickey) keyfactory.generatePublic (keyspec); Dhparameterspec dhpublickEpeyparams = sourcePublic.getParams (); Keypairgenerator keypairgenerator = keypairgenerator.getInstance ("dh"); keypairgenerator.initialize (dhpublickeParams); Keypair keypair = keypairgenerator.generatePeyPair (); Dhpublickey dhpublickey = (dhpublickey) keypair.getPublic (); Dhprivatekey dhprivateKey = (dhprivateKey) keypair.getprivate (); // Masukkan pasangan kunci ke peta peta <string, object> keymap = new HashMap <String, Object> (); keymap.put (public_key, dhpublickey); keymap.put (private_key, dhprivateKey); KETYMAP kembali; } / *** Gunakan kunci publik satu pihak dan kunci pribadi pihak lain untuk menghasilkan kunci lokal* @return* / public static byte [] generatelocalsecretkey (byte [] apublickey, byte [] bprivateKey) pengecualian {keyfactory keyfactory = keyfactory.getinstance ("dh"); // Gunakan kunci publik, hasilkan keyspec, dan gunakan KeyFactory untuk menghasilkan informasi terkait publicKey x509EncodedKeyspec keyspec = X509EncodedKeySpec baru (Apublickey); PublicKey publicKey = keyfactory.generatePublic (keyspec); // Gunakan B Kunci Privat, Hasilkan B Informasi Terkait PrivateKey PKCS8EncodedKeySpec PKCS8EncodedKeySpec = PKCS8EncodedKeySpec baru (BprivateKey); PrivateKey privateKey = keyfactory.generatePrivate (pkcs8encodedkeyspec); // mengenkripsi publicKey A dan privateKey B melalui keyagreement keyagreement keyagreement = keyagreement.getInstance ("dh"); keyagreement.init (privateKey); keyagreement.dophase (publickey, true); return keyagreement.generateSecret ("aes"). getencoded (); // algoritma menggunakan algoritma enkripsi simetris (des, desede, aes) // return keyagreement.generateSecret (); // algoritma juga dapat digunakan untuk menghitung menggunakan metode default tanpa memilih algoritma} // Dapatkan byte kunci publik array byte statis publik [] getPublickey (peta <string, objek> peta) {return ((dhpublickey) peta.get (public_key)). Getencoded (); } // Dapatkan byte kunci privat array public static byte [] getprivateKey (peta <string, objek> peta) {return ((dhprivateKey) map.get (private_key)). GetEncoded (); } public static void main (string [] args) melempar Exception {byte [] source_public_key; byte [] source_private_key; byte [] source_local_key; byte [] target_public_key; byte [] target_private_key; byte [] target_local_key; Peta <String, Object> SourceKey = initsourcekey (); source_public_key = getPublickey (SourceKey); source_private_key = getPrivateKey (SourceKey); System.out.println ("Kunci Publik Sumber:"+Bytestohex.FrombyTestoHex (Source_Public_Key)); System.out.println ("Sumber Private Key:"+Bytestohex.FrombyTestoHex (Source_Private_Key)); Peta <String, Object> targetKey = inittargetKey (getPublickey (SourceKey)); target_public_key = getPublickey (targetKey); target_private_key = getprivatekey (targetKey); System.out.println ("Kunci Publik Target:"+bytestohex.frombytestoHex (target_public_key)); System.out.println ("Target Private Key:"+bytestohex.frombytestoHex (target_private_key)); source_local_key = generatelocalsecretkey (target_public_key, source_private_key); target_local_key = generatelocalsecretkey (source_public_key, target_private_key); System.out.println ("Sumber Kunci Lokal:"+Bytestohex.FrombyTestoHex (Source_Local_Key)); System.out.println ("Target Kunci Lokal:"+Bytestohex.FrombyTestOhex (target_local_key)); }}【Enkripsi/Dekripsi (RSA) 】【 Digital Signature (RSA)】
Algoritma RSA lebih lambat dari algoritma DH, dan semua lima huruf ini adalah huruf pertama dari nama manusia. Algoritma DH adalah sistem kriptografi asimetris pertama.
Algoritma RSA memiliki kecepatan komputasi yang lambat dan tidak cocok untuk mengenkripsi sejumlah besar data. Salah satu solusi adalah mencampur RSA dan metode enkripsi simetris, mengenkripsi data menggunakan metode enkripsi simetris, dan kunci enkripsi simetris dienkripsi menggunakan algoritma RSA. Karena kuncinya sangat singkat, waktunya tidak terlalu banyak. Faktanya, satu -satunya kelemahan dari metode enkripsi simetris adalah bahwa kuncinya sulit untuk dilewati, dan metode enkripsi simetris juga sulit untuk retak.
Skenario RSA yang berlaku:
(1) Server menghasilkan kunci publik dan kunci pribadi, dan mempublikasikan kunci publik.
(2) Klien menggunakan kunci publik untuk mengenkripsi data dan menyerahkannya ke server. Orang lain tidak dapat memahami data terenkripsi.
(3) Server menggunakan kunci pribadi untuk mendekripsi data dan melihat data yang dikirimkan oleh pengguna.
Dalam hal ini, kunci publik seperti kotak surat, dan semua orang dapat memasukkan pesan ke kotak surat ini, tetapi hanya mereka yang memiliki tombol kotak surat yang dapat membuka kotak dan melihat huruf di kotak surat ini.
Skenario RSA yang berlaku 2:
(1) Kaisar menghasilkan kunci publik dan kunci rahasia, dan mempublikasikan kunci publik.
(2) Kaisar mengeluarkan dekrit untuk memberi tahu dunia. Ada dua string angka di sudut kanan bawah dekrit. String pertama adalah string acak, dan string kedua adalah hasil enkripsi string pertama dengan kunci pribadi.
(3) Beberapa orang tidak percaya bahwa dekrit itu ditulis oleh kaisar, sehingga mereka mendekripsi string angka kedua menggunakan kunci publik. Setelah mendekripsi, mereka menemukan bahwa itu sama dengan rangkaian angka pertama, yang berarti bahwa itu memang ditulis oleh Kaisar. Karena kebanyakan orang tidak memiliki kunci, mereka tidak dapat mengenkripsi data yang dapat didekripsi dengan kunci publik.
Dalam hal ini, kunci publik digunakan untuk dekripsi dan kunci pribadi digunakan untuk enkripsi. Ini dapat digunakan untuk membuktikan bahwa pengumuman itu memang dikirim oleh seseorang. Itu setara dengan tanda tangan.
Faktanya, tidak perlu terlalu lama untuk tanda tangan. Secara umum, tanda tangan adalah panjang tetap. Jika Anda ingin memiliki panjang tetap, Anda dapat menggunakan algoritma MessageDigest, seperti seri MD5 dan SHA. Oleh karena itu, ada berbagai algoritma tanda tangan, seperti MD5 denganrsa, dll.
Contoh enkripsi/dekripsi RSA
Impor javax.crypto.cipher; impor java.security.keypair; impor java.security.keypeygenerator; impor java.security.publickey; impor java.security.interfaces.rsaprivateKey; impor java.security java.util.map;/*** Alat enkripsi RSA*/kelas publik rsautil {public static final string public_key = "rsa_public_key"; string final public static private_key = "rsa_private_key"; / ** * Kunci Inisialisasi * @return * @throws Exception */ Public Static Map <String, Object> InitKey () melempar Exception {keyPairGenerator keyPairGenerator = keypairgenerator.getInstance ("rsa"); keypairgenerator.initialize (1024); // 512-65536 & kelipatan dari 64 keypair keypair = keypairgenerator.generatePiepAir (); Rsapublickey publicKey = (rsapublickey) keypair.getPublic (); RsaprivateKey privateKey = (rsaprivateKey) keypair.getprivate (); Peta <String, Object> keymap = HashMap baru <String, Object> (); keymap.put (public_key, publickey); keymap.put (private_key, privateKey); KETYMAP kembali; } public static rsapublickey getPublickey (peta <string, object> keymap) {return (rsapublickey) keymap.get (public_key); } public static rsaprivateKey getprivateKey (peta <string, objek> keymap) {return (rsaprivateKey) keymap.get (private_key); } / ** * Enkripsi data menggunakan kunci publik * @param data * @param publicKey * @return * @throws Exception * / public static byte [] Encrypt (byte [] data, rsapublickey publicKey) melempar pengecualian {cipher cipher = cipher.getInstance ("rsa"); cipher.init (cipher.encrypt_mode, publickey); return cipher.dofinal (data); } / ** * Gunakan kunci pribadi untuk mendekripsi * @param data * @param privateKey * @return * @throws Exception * / public static byte [] decrypt (byte [] data, rsaprivate privateKey) melempar pengecualian {cipher cipher = cipher.getInstance ("rsa"); cipher.init (cipher.decrypt_mode, privateKey); return cipher.dofinal (data); } public static void main (string [] args) melempar Exception {string data = "jay chou-dongfeng break"; Peta <string, objek> keymap = initkey (); byte [] miwen = encrypt (data.getbytes (), getPublickey (keymap)); System.out.println ("Konten Terenkripsi:"+Bytestohex.FrombytestoHex (Miwen)); byte [] polos = dekripsi (miwen, getprivatekey (keymap)); System.out.println ("Konten Dekripsi:"+String Baru (Plain)); }}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.