Enkripsi adalah untuk mengubah data informasi asli menggunakan algoritma khusus, sehingga bahkan jika pengguna yang tidak berwenang mendapatkan informasi terenkripsi, ia masih tidak dapat memahami konten informasi karena ia tidak tahu metode dekripsi. Ini umumnya dibagi menjadi enkripsi dua arah dan enkripsi satu arah, sedangkan enkripsi bi-way dibagi menjadi enkripsi simetris dan enkripsi asimetris (beberapa bahan secara langsung membagi enkripsi menjadi enkripsi simetris dan enkripsi asimetris).
Arti umum dari enkripsi dua arah adalah untuk membentuk ciphertext setelah enkripsi plaintext, yang dapat dikembalikan ke plaintext melalui algoritma. Enkripsi satu arah hanya melakukan perhitungan pencernaan pada informasi, dan tidak dapat menghasilkan teks biasa melalui algoritma. Sebenarnya, enkripsi satu arah tidak dapat dianggap sebagai jenis enkripsi, tetapi harus dianggap sebagai algoritma Digest.
Secara khusus:
Sistem harus tersedia dan tidak dapat diterjemahkan secara non-matematis.
Sistem tidak harus dirahasiakan dan dapat dengan mudah jatuh ke tangan musuh.
Kuncinya harus ditukar dan dihafal tanpa menulis, dan kedua belah pihak dapat mengubah kunci.
Sistem ini dapat digunakan untuk telekomunikasi.
Sistem ini dapat mentransfer posisi, dan fungsinya harus dicapai tanpa melalui beberapa orang.
Sistem ini mudah digunakan dan tidak mengharuskan pengguna terlalu banyak bekerja atau memiliki banyak aturan.
1. Penyedia kode metode enkripsi utama
JDK: Kode ini ada dalam paket JRE/lib/jce.jar di direktori instalasi Java;
CC: org.apache.commons.codec disediakan oleh Apache
Halaman Beranda: http://commons.apache.org/proper/commons-codec/
BC: org.bounceCastle
Halaman Beranda: http://www.bouncycastle.org/java.html
Pada dasarnya JDK yang biasa digunakan sudah cukup.
2. Algoritma Base64
1. Menilai dari kompleksitas algoritma enkripsi sekarang, Base64 malu untuk mengatakan bahwa itu dienkripsi, tetapi itu cukup untuk orang yang tidak memahami komputer sama sekali. Pengkodean Base64 tidak dapat dibaca, yaitu, data yang dikodekan tidak akan dilihat secara langsung oleh manusia dengan mata telanjang.
Pengkodean Base64 umumnya digunakan untuk pemrosesan URL, atau apa pun yang Anda tidak ingin orang biasa ketahui secara sekilas dapat diproses dengan pengkodean Base64 dan kemudian diposting di internet.
Paket com.amuro.strategy.base64; impor java.util.base64; impor com.amuro.strategy.istrategy;/** * algoritma base64 didasarkan pada 64 karakter dasar, dan hanya 64 karakter {@Author @Author Amuro * */Kelas Publik Basis Kelas Public. encodeBytes = base64.getEncoder (). encode (src.getbytes ()); mengembalikan string baru (encodeBytes); } public String decode (string src) {byte [] decodeBytes = base64.getDecoder (). decode (src.getbytes ()); mengembalikan string baru (decodebytes); }}2. Tabel korespondensi pengkodean base64
3. Algoritma pencernaan pesan (pesan pencernaan)
Pencernaan pesan juga disebut digital digest. Ini adalah nilai unik yang sesuai dengan panjang tetap dari pesan atau teks, dan dihasilkan oleh fungsi enkripsi hash satu arah yang bertindak pada pesan. Resistensi konflik fungsi hash memungkinkan teks biasa berubah sedikit, bahkan jika hanya satu huruf paragraf yang diubah, nilai yang berbeda akan dihasilkan setelah algoritma hashing. Unidectionality dari algoritma hash membuat tidak mungkin untuk menemukan dua pesan input yang berbeda dengan nilai hash yang sama secara komputasi. Oleh karena itu, nilai hash dari data, yaitu, pencernaan pesan, dapat memverifikasi integritas data.
Dengan kata -kata sederhana, setiap bagian data harus unik seperti manusia. Apa pengidentifikasi uniknya? Bagi manusia, saat ini sidik jari, dan apa sidik jari dari data? Itu benar, string ini yang dihasilkan oleh algoritma Digest pesan. Misalnya, ketika kami mendaftarkan situs web, klien mengirimkan kata sandi yang kami masukkan ke server, yang seharusnya menjadi konten setelah pemrosesan pesan pencernaan. Bahkan jika server rusak, Hack tidak akan dapat mengetahui apa kata sandi pengguna yang sebenarnya. Namun, dikatakan bahwa MD5 dan SHA telah dikompromikan sekarang, sehingga Anda dapat Google.
1. Md5
Paket com.amuro.strategy.message_digest; impor java.security.messagedigest; impor java.security.nosuchalgorithmexception; impor org.apache.commons.codec.binary.hex; Implement istrategy {public string encode (string src) {try {messageDigest md = messageDigest.getInstance ("md5"); byte [] encodebytes = md.digest (src.getbytes ()); return hex.encodeHexString (encodeBytes); } catch (nosuchalgorithMexception e) {e.printstacktrace (); } return null; } public string decode (string src) {throw runtimeException baru ("md5 no decode"); }}2. Sha
Paket com.amuro.strategy.message_digest; impor java.security.messagedigest; impor java.security.nosuchalgorithmException; impor org.apache.commons.codec.binary.Hex; haspeathor @author @aUro.aUthor @aUthor @aTHOR @AnRETHOM; mengimplementasikan istrategy {public string encode (string src) {try {messageDigest md = messageDigest.getInstance ("sha"); md.update (src.getbytes ()); return hex.encodeHexString (md.digest ()); } catch (nosuchalgorithMexception e) {e.printstacktrace (); } return null; } public string decode (string src) {lempar runtimeException baru ("sha no decode"); }} 4. Enkripsi Simetris <BR /> Menggunakan metode enkripsi sistem kriptografi satu kunci, kunci yang sama dapat digunakan sebagai enkripsi dan dekripsi informasi pada saat yang sama. Metode enkripsi ini disebut enkripsi simetris, juga dikenal sebagai enkripsi kunci tunggal. Karena enkripsi dan dekripsi menggunakan kunci yang sama, bagaimana cara meneruskan kunci ke dekriptor dengan aman menjadi masalah yang harus diselesaikan. Tentu saja, keuntungan dari keamanan rendah adalah volume perhitungan kecil, kecepatan enkripsi cepat dan efisiensi enkripsi yang tinggi.
Namun, komputer modern telah lama berhenti peduli tentang tingkat komputasi ini, dan keamanan adalah hal yang paling penting.
1. Des
DES, nama lengkap adalah "Standar Enkripsi Data", dan nama Cina -nya adalah "Standar Enkripsi Data", adalah algoritma blok yang menggunakan enkripsi kunci. Algoritma DES adalah sistem kriptografi simetris dalam sistem kriptografi, juga dikenal sebagai Standar Enkripsi Data Amerika. Ini adalah algoritma enkripsi sistem kriptografi simetris yang dikembangkan oleh IBM di Amerika Serikat pada tahun 1972. Plaintext dikelompokkan dengan 64 bit, dan kuncinya sebenarnya adalah 56-bit Metode enkripsi 56-bit yang ada satu-satunya yang dimasukkan ke 1, masing-masing nomor 1, So NoD-bit. substitusi atau ditukar untuk membentuk metode enkripsi grup ciphertext.
Paket com.amuro.strategy.des; import javax.crypto.cipher; impor javax.crypto.keygenerator; import javax.crypto.secretkey; import javax.deskeyspec.hexmacy; import javax.crypto.spec.deskeyspec; com.amuro.strategy.istrategy;/** * * @author amuro * */kelas publik Desstrategy mengimplementasikan istrategy {private cipher cipher; Private Secretkey GenerateKey; Public String Encode (String SRC) {coba {KeyGenerator keyGenerator = keyGenerator.getInstance ("des"); keygenerator.init (56); // ukuran Secretkey Secretkey = keygenerator.generateKey (); byte [] keybytes = Secretkey.getEncoded (); Deskeyspec deskeyspec = deskeyspec baru (keybytes); SecretKeyFactory SecretkeyFactory = SecretkeyFactory.getInstance ("des"); GenerateKey = SecretKeyFactory.GenerateSecret (deskeyspec); cipher = cipher.getInstance ("des/ecb/pkcs5padding"); cipher.init (cipher.encrypt_mode, generatey); byte [] resultBytes = cipher.dofinal (src.getbytes ()); return hex.encodeHexString (resultBytes); } catch (Exception e) {E.PrintStackTrace (); } return null; } public string decode (string src) {coba {cipher.init (cipher.decrypt_mode, generateKey); byte [] hasil = hex.decodehex (src.tochararray ()); mengembalikan string baru (cipher.dofinal (hasil)); } catch (Exception e) {E.PrintStackTrace (); } return null; }}2. 3des3des, juga dikenal sebagai "triple des", disebut "algoritma enkripsi data triple", yang setara dengan menerapkan algoritma enkripsi DES tiga kali untuk setiap blok data. Karena daya komputasi komputer yang ditingkatkan, panjang kunci dari kata sandi DES asli menjadi mudah dipaksakan; 3DES dirancang untuk memberikan metode yang relatif sederhana untuk menghindari serangan serupa dengan meningkatkan panjang kunci DES, daripada merancang algoritma cipher blok baru.
Paket com.amuro.strategy.des; import javax.crypto.cipher; impor javax.crypto.keygenerator; import javax.crypto.secretkey; import javax.drypto.secretkeyfactory; import javax.crypto.spec com.amuro.strategy.istrategy; kelas publik _3desstrategy mengimplementasikan istrategy {private cipher cipher; Private Secretkey GenerateKey; Public String Encode (string src) {coba {keygenerator keygenerator = keygenerator.getInstance ("desede"); keygenerator.init (168); // ukuran Secretkey Secretkey = keygenerator.generateKey (); byte [] keybytes = Secretkey.getEncoded (); Desedekeyspec deskeyspec = desedekeyspec baru (keybytes); SecretKeyFactory SecretkeyFactory = SecretkeyFactory.getInstance ("Desede"); GenerateKey = SecretKeyFactory.GenerateSecret (deskeyspec); cipher = cipher.getInstance ("desede/ecb/pkcs5padding"); cipher.init (cipher.encrypt_mode, generatey); byte [] resultBytes = cipher.dofinal (src.getbytes ()); return hex.encodeHexString (resultBytes); } catch (Exception e) {E.PrintStackTrace (); } return null; } public string decode (string src) {coba {cipher.init (cipher.decrypt_mode, generateKey); byte [] hasil = hex.decodehex (src.tochararray ()); mengembalikan string baru (cipher.dofinal (hasil)); } catch (Exception e) {E.PrintStackTrace (); } return null; }}3. AESAES, nama lengkap adalah "Standar Enkripsi Lanjutan", nama Cina adalah "Standar Enkripsi Lanjutan". Ini juga dikenal sebagai metode enkripsi Rijndael dalam kriptografi. Ini adalah standar enkripsi blok yang diadopsi oleh pemerintah federal AS. Sebagai generasi baru standar enkripsi data, algoritma enkripsi AES menyatukan keunggulan keamanan yang kuat, kinerja tinggi, efisiensi tinggi, kemudahan penggunaan dan fleksibilitas. Desain AES memiliki tiga panjang kunci: 128, 192, 256 bit. Secara relatif, kunci 128 AES adalah 1021 kali lebih kuat dari Kunci 56 DES.
Paket com.amuro.strategy.des; impor javax.crypto.cipher; impor javax.crypto.keygenerator; impor javax.crypto.secretkey; impor javax.crypto.spec.secretkeyspec; impor org.apache.commons.codec. -nycategy; Impore.amat.amat.amat. mengimplementasikan istrategy {private cipher cipher; Private Secretkey GenerateKey; Public String Encode (String SRC) {coba {KeyGenerator keyGenerator = keyGenerator.getInstance ("aes"); keygenerator.init (128); // ukuran Secretkey Secretkey = keygenerator.generateKey (); byte [] keybytes = Secretkey.getEncoded (); GenerateKey = SecretKeyspec baru (KeyBytes, "AES"); cipher = cipher.getInstance ("AES/ECB/PKCS5PADDING"); cipher.init (cipher.encrypt_mode, generatey); byte [] resultBytes = cipher.dofinal (src.getbytes ()); return hex.encodeHexString (resultBytes); } catch (Exception e) {E.PrintStackTrace (); } return null; } public string decode (string src) {coba {cipher.init (cipher.decrypt_mode, generateKey); byte [] hasil = hex.decodehex (src.tochararray ()); mengembalikan string baru (cipher.dofinal (hasil)); } catch (Exception e) {E.PrintStackTrace (); } return null; }} 4. Pbe
PBE, nama lengkap "Enkripsi Basis Kata Sandi", adalah algoritma enkripsi berbasis kata sandi. Karakteristiknya adalah bahwa kata sandi digunakan sebagai pengganti kunci, dan kata sandi dikelola oleh pengguna sendiri. Nomor acak hash beberapa enkripsi dan metode lain untuk memastikan keamanan data.
Algoritma PBE tidak memiliki konsep kunci, dan memperlakukan kata sandi sebagai kunci. Karena panjang kunci mempengaruhi keamanan algoritma dan tidak nyaman untuk memori, sangat berbeda bagi kami untuk secara langsung menggunakan kata sandi yang kami gunakan di sini, yang nyaman untuk memori kami. Namun, kata sandi sederhana mudah habis dengan metode kamus, jadi kami telah menambahkan beberapa "garam" ke kata sandi di sini. Kombinasi garam dan kata sandi ini sulit untuk retak. Pada saat yang sama, kami menggabungkan garam dan kata sandi dan mengulanginya berkali -kali dengan algoritma Digest pesan untuk membangun bahan dasar dari vektor inisialisasi utama, membuat penguraian menjadi lebih sulit.
Paket com.amuro.strategy.pbe; impor java.security.securerandom; impor javax.crypto.cipher; impor javax.crypto.secretkey; import javax.crypto.secretkey; impor javax.crypto.secretkeyfactory; impor javax. javax.crypto.spec.pbeparameterspec; impor org.apache.commons.codec.binary.hex; impor com.amuro.strategy.istrategy;/** * Enkripsi Berbasis Kata Sandi (Kata Sandi), Simetri + Pesan CIPHER YOURTHER AMURO * */Kelas Publik Pbestrate Implements; Private Secretkey GenerateKey; Private Pbeparameterspec Pbeparameterspec; Public String Encode (String SRC) {coba {Securerandom SecureRandom = new SecureRandom (); byte [] Salt = Securerandom.generateseed (8); String Password = "Amuro"; Pbekeyspec pbekeyspec = pbekeyspec baru (kata sandi.tochararray ()); SecretKeyFactory SecretkeyFactory = SecretkeyFactory.getInstance ("pBewithMd5anddes"); GenerateKey = SecretKeyFactory.GenateSecret (pbekeyspec); pbeparameterspec = pbepparameterspec baru (garam, 100); cipher = cipher.getInstance ("pbewithmd5anddes"); cipher.init (cipher.encrypt_mode, generatey, pbeparameterspec); byte [] resultBytes = cipher.dofinal (src.getbytes ()); return hex.encodeHexString (resultBytes); } catch (Exception e) {E.PrintStackTrace (); } return null; } public string decode (string src) {coba {cipher.init (cipher.decrypt_mode, generatey, pbeparameterspec); byte [] hasil = hex.decodehex (src.tochararray ()); mengembalikan string baru (cipher.dofinal (hasil)); } catch (Exception e) {E.PrintStackTrace (); } return null; }} 5. Enkripsi asimetris <BR /> Algoritma enkripsi asimetris membutuhkan dua kunci untuk mengenkripsi dan mendekripsi, yaitu kunci publik dan kunci pribadi. Satu hal yang perlu diperhatikan adalah bahwa kunci publik dan kunci pribadi haruslah pasangan. Jika data dienkripsi dengan kunci publik, maka hanya kunci pribadi yang sesuai yang dapat didekripsi, dan sebaliknya. Karena enkripsi dan dekripsi menggunakan dua kunci yang berbeda, algoritma ini disebut algoritma enkripsi asimetris.
1. RSA
Faktanya, RSA muncul pada awal 1978, dan itu adalah algoritma pertama yang dapat digunakan untuk enkripsi data dan tanda tangan digital. Mudah dimengerti dan dioperasikan dan juga sangat populer. Prinsipnya seperti yang dijelaskan dalam proses kerja di atas. Algoritma RSA didasarkan pada fakta teori bilangan yang sangat sederhana: mudah untuk melipatgandakan dua bilangan prima yang besar, tetapi sangat sulit untuk memfaktorkan produk mereka, sehingga produk dapat diungkapkan sebagai kunci enkripsi.
Paket com.amuro.strategy.asymmetric; impor java.security.keyfactory; impor java.security.keypair; java.security.interfaces.rsapublickey; impor java.security.spec.pkcs8encodedkeyspec; impor java.security.spec.x509encodedkeyspec; Impor javax.crypto.cipher; import org.apache.commons.codecatated RSAStrategy mengimplementasikan istrategy {private rsapublickey rsapublickey; pribadi rsaprivate rsaprivateKey; Public String Encode (String src) {coba {// inisialisasi keyPairGenerator keyPairGenerator = keyPairGenerator.getInstance ("rsa"); keypairgenerator.initialize (512); Keypair keypair = keypairgenerator.generatePeyPair (); rsapublickey = (rsapublickey) keypair.getPublic (); rsaprivateKey = (rsaprivateKey) keypair.getprivate (); // Kunci Pribadi Dekripsi Kunci Publik PKCS8EncodedKeySpec PKCS8EncodedKeyspec = PKCS8EncodedKeyspec baru (rsaprivateKey.getEncoded ()); KeyFactory keyFactory = keyFactory.getInstance ("RSA"); PrivateKey privateKey = keyfactory.generatePrivate (pkcs8encodedkeyspec); Cipher cipher = cipher.getInstance ("rsa"); cipher.init (cipher.encrypt_mode, privateKey); byte [] resultBytes = cipher.dofinal (src.getbytes ()); // Dekripsi Kunci Pribadi Enkripsi Kunci Publik // X509EncodedKeySpec X509EncodedKeyspec = // X509EncodedKeySpec baru (rsapublickey.getencoded ()); // keyfactory ke pubernur = keyfactory.getInstance ("rsa");//publickey = pubernur = KeyFactory.getInstance ("rsa");//publickey = pubernur = keyfactory.getInstance ("rsa");//publickey = publickey = publickey = Keyfactory.getInstance ("rsa");//publickey = publickey = pubernur = Keyfactory.getInstance ("rsa"); KeyFactory.GeneratePublic (x509Encodedkeyspec); // cipher cipher = cipher.getInstance ("rsa"); // cipher.init (cipher.encrypt_mode, publickey); // byte [] resultBytes = cipher.dofinal (SRC.Ege.); return hex.encodeHexString (resultBytes); } catch (Exception e) {E.PrintStackTrace (); } return null; } public string decode (string src) {coba {// enkripsi kunci privat dekripsi kunci publik x509Encodedkeyspec x509encodedkeyspec = new X509Encodedkeyspec (rsapublickey.getencoded ()); KeyFactory keyFactory = keyFactory.getInstance ("RSA"); PublicKey publicKey = keyfactory.generatePublic (x509Encodedkeyspec); Cipher cipher = cipher.getInstance ("rsa"); cipher.init (cipher.decrypt_mode, publickey); byte [] resultBytes = cipher.dofinal (hex.decodehex (src.tochararray ())); // Dekripsi Kunci Pribadi Enkripsi kunci publik // pkcs8encodedkeyspec pkcs8encodedkeyspec // = new pkcs8encodedkeyspec (rsaprivateKey.getEncoded ()); // keyfactory keyfactory = keyfactory.getinstance ("rsa"); rsailyky = rsailyky = rsailykey = rsingky = getinstancy ("rsacykey = rsingky = getInstancy (" rsacyky = keyfactory.generate -private (pkcs8encodedkeyspec); // cipher cipher = cipher.getInstance ("rsa"); // cipher.init (cipher.decrypt_mode, privateKey); // byte [] resultsbytes = cipher.dofinal (hex. hex. mengembalikan string baru (resultBytes); } catch (Exception e) {E.PrintStackTrace (); } return null; }} 2. Algoritma DH
DH, nama lengkap "Diffie-Hellman", adalah metode untuk memastikan bahwa kunci bersama dengan aman melintasi jaringan yang tidak aman, yang sering disebut protokol konsensus kunci. Sebuah ide yang diusulkan oleh Diffie dan Hellman, pendiri sistem kriptografi kunci publik. Sederhananya, ini untuk memungkinkan dua pengguna untuk bertukar informasi di media publik untuk menghasilkan "konsisten" dan kunci yang dapat dibagikan. Artinya, Party A menghasilkan sepasang kunci (kunci publik, kunci pribadi), dan partai B menghasilkan pasangan kunci partai B (kunci publik, kunci pribadi) berdasarkan kunci publik partai A.
Mengambil ini sebagai garis dasar sebagai dasar untuk kerahasiaan transmisi data, kedua belah pihak menggunakan algoritma enkripsi simetris yang sama untuk membangun kunci lokal (SecretKey) untuk mengenkripsi data. Dengan cara ini, setelah algoritma kunci (SecretKey) lokal dapat dioperasikan, Pihak A dan Pihak B mengungkapkan kunci publik mereka, mengenkripsi data menggunakan kunci publik pihak lain dan kunci pribadi yang baru saja dihasilkan, dan pada saat yang sama, mereka dapat menggunakan kunci publik pihak lain dan kunci pribadi mereka sendiri untuk mendekripsi data. Tidak hanya kedua pihak A dan B, mereka dapat diperluas ke komunikasi data bersama multi-partai, yang melengkapi komunikasi yang aman dari data interaktif jaringan!
Paket com.amuro.strategy.asymmetric; impor java.security.keyfactory; impor java.security.keypair; impor java.security.keypairgenerator; impor java.security.privatekey; impor java.security.publickey; impor java.security.security java.util.objects; import javax.crypto.cipher; impor javax.crypto.keyagreement; impor javax.crypto.secretkey; import javax.crypto.interfaces.dhpublickey; impor javax.crypto.spec.dhparpacs.dhpublickey; org.apache.commons.codec.binary.hex; impor com.amuro.strategy.istrategy; kelas publik dhstrategy mengimplementasikan istrategy {private cipher cipher; secretkey secretkey pribadi; Public String Encode (String SRC) {coba {// inisialisasi kunci pengirim keypairgenerator senderKeYPairGenerator = keyPairGenerator.getInstance ("dh"); senderkeypairgenerator.initialize (512); KeyPair senderkeypair = senderkeypairgenerator.generatePiPAir (); PrivateKey senderprivateKey = senderkeypair.getprivate (); byte [] senderpublickeybytes = senderkeypair.getpublic (). getEncoded (); // kunci publik pengirim // inisialisasi kunci penerima, gunakan kunci kunci public receiverKeyFactory = keyfactory.getInstance ("dh"); X509Encodedkeyspec x509Encodedkeyspec = new X509EncodedKeyspec (senderpublickeybytes); PublicKey ReceiverPublickey = receiverKeyFactory.generatePublic (X509EncodedKeySpec); Dhparameterspec dhparameterspec = ((dhpublickey) receiverpublickey) .getParams (); Keypairgenerator receiverkeypairgenerator = keypairgenerator.getInstance ("dh"); receiverkeypairgenerator.initialize (dhparameterspec); Keypair receiverkeypair = receiverkeypairgenerator.generatePiey (); PrivateKey receiverprivateKey = receiverkeypair.getprivate (); byte [] receiverpublickeybytes = receiverkeypair.getpublic (). getEncoded (); KeyGreement ReceiverKeyAgreement = keyagreement.getInstance ("dh"); receiverKeyAgreement.init (receiverprivateKey); receiverKeyAgreement.dophase (receiverpublickey, true); receiversecretkey = receiverkeyagreement.generateSecret ("des"); // Pengirim dapat mengenkripsi dengan mendapatkan kunci publik penerima. KeyFactory senderKeyFactory = keyfactory.getInstance ("dh"); X509EncodedKeySpec = baru X509EncodedKeySpec (ReceiverPublicKeyBytes); Publickey senderpublickey = senderkeyfactory.generatePublic (x509Encodedkeyspec); KeyAGREEMENT SENDERKEYAGREEMENT = keyagreement.getInstance ("dh"); senderkeyagreement.init (senderprivateKey); senderkeyagreement.dophase (senderpublickey, true); Secretkey SendersecretKey = senderKeyAgreement.generateSecret ("des"); if (objects.equals (receiversecretkey, sendersecretkey)) {cipher = cipher.getInstance ("des"); cipher.init (cipher.encrypt_mode, sendersecretkey); byte [] hasil = cipher.dofinal (src.getbytes ()); return hex.encodeHexString (hasil); }} catch (Exception e) {e.printstacktrace (); } return null; } public string decode (string src) {coba {cipher.init (cipher.decrypt_mode, receiversecretkey); byte [] hasil = hex.decodehex (src.tochararray ()); mengembalikan string baru (cipher.dofinal (hasil)); } catch (Exception e) {E.PrintStackTrace (); } return null; }} 6. Enkripsi asimetris sertifikat tanda tangan digital sudah sangat aman, tetapi ada kelemahan lain:
Server A menerbitkan kunci publiknya. Komputer saya mengenkripsi data dengan kunci publik Server A dan kemudian mengirimkannya ke Server A. Pada saat ini, Server B menginvasi komputer saya dan mengganti kunci publik yang saya gunakan untuk mengenkripsi dengan kunci publiknya, sehingga data yang saya kirim akan retak oleh kunci pribadi Server B. Bagaimana cara mencegah kunci publik menjadi dirusak?
Ya, kami memikirkan ringkasan pesan sebelumnya. Ketika server A melemparkan kunci publik kepada saya, dia juga pergi ke CA untuk melamar sertifikat digital. Bahkan, ini terutama ringkasan pesan dari kunci publik. Dengan sertifikat ini, ketika saya mengenkripsi dengan kunci publik, pertama -tama saya dapat memverifikasi apakah kunci publik saat ini dikonfirmasi untuk dikirimkan kepada saya oleh server A.
Ini semacam RSA:
Paket com.amuro.strategy.signature; impor java.security.keyfactory; impor java.security.keypair; impor java.security.keypairgenerator; impor java.security.privatekey; impor java.security.publickey; impor java.security. java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;public class RSASign{ public static boolean verifySign(String src) { try { KeyPairGenerator keyPairGenerator = Keypairgenerator.getInstance ("RSA"); keypairgenerator.initialize (512); Keypair keypair = keypairgenerator.generatePeyPair (); PublicKey rsapublickey = (rsapublickey) keypair.getPublic (); PrivateKey rsaprivateKey = (rsaprivateKey) keypair.getprivate (); Pkcs8encodedkeyspec pkcs8encodedkeyspec = pkcs8encodedkeyspec baru (rsaprivateKey.getEncoded ()); KeyFactory keyFactory = keyFactory.getInstance ("RSA"); PrivateKey privateKey = keyfactory.generatePrivate (pkcs8encodedkeyspec); Signature Signature = Signature.getInstance ("md5withrsa"); Signature.Initsign (privateKey); Signature.update (src.getbytes ()); // menghasilkan byte byte tanda tangan byte [] Signbytes = Signature.sign (); X509Encodedkeyspec x509Encodedkeyspec = new X509EncodedKeySpec (rsapublickey.getencoded ()); keyFactory = keyfactory.getInstance ("RSA"); PublicKey publicKey = keyfactory.generatePublic (x509Encodedkeyspec); Signature = Signature.getInstance ("md5withrsa"); Signature.Initverify (publicKey); Signature.update (src.getbytes ()); boolean isverified = Signature.Verify (SignBytes); return isverified; } catch (Exception e) {E.PrintStackTrace (); } return false; }} Mengenai penggunaan tanda tangan digital dan algoritma enkripsi asimetris, saya juga melihat contoh yang bagus, dan saya akan membaginya dengan Anda:
Sayangnya, saya membeli terlalu banyak buku bulan ini dan saya tidak bisa mengeluarkannya sampai akhir bulan. Saya kebetulan bertemu Clark di QQ:
1-2-3: "Clark, saya butuh 200 tael perak, dapatkah saya meminjamkannya kepada saya?"
Clark: "Tidak masalah. Saya akan mentransfer uang kepada Anda sekarang. Tolong beri saya IOU."
1-2-3: "Terima kasih banyak. Saya akan menulis kepada Anda.
Kemudian, saya membuat dokumen kata baru, menulis IOU, dan menyimpannya. Lalu, apa yang harus saya lakukan? Saya tidak dapat mengirim IOU langsung ke Clark karena alasan:
1. Saya tidak dapat menjamin bahwa Clark tidak akan mengubah "200 taels perak" menjadi "2000 taels perak" setelah menerima IOU.
2. Jika saya melewatkan hutang, Clark tidak dapat membuktikan bahwa saya menulis IOU.
3. Dokumen kata biasa tidak dapat digunakan sebagai bukti tuntutan hukum.
Untungnya, saya telah mengajukan permohonan sertifikat digital. Saya pertama kali mengenkripsi IOU dengan kunci pribadi saya, dan kemudian mengirim ciphertext terenkripsi ke Clark di QQ. Setelah Clark menerima ciphertext IOU, ia mengunduh kunci publik saya di situs web Pusat Sertifikasi Sertifikat Digital, dan kemudian menggunakan kunci publik saya untuk mendekripsi ciphertext. Dia menemukan bahwa itu memang ditulis sebagai "200 Taels of Borrowed Silver", sehingga Clark dapat meminjamkan uang kepada saya dengan percaya diri. Saya tidak akan khawatir bahwa Clark akan merusak IOU saya, karena:
1. Karena ciphertext yang saya kirim ke Clark, Clark tidak dapat memodifikasinya. Clark dapat memodifikasi IOU yang didekripsi, tetapi Clark tidak memiliki kunci pribadi saya, sehingga tidak dapat meniru saya mengenkripsi IOU. Ini disebut tamper-tahan.
2. Karena IOU dienkripsi dengan kunci pribadi saya, ada dan hanya kunci publik saya yang dapat didekripsi. Sebaliknya, IOU yang dapat didekripsi dengan kunci publik saya harus dienkripsi dengan kunci pribadi saya, dan hanya saya memiliki kunci pribadi saya, sehingga Clark dapat membuktikan bahwa IOU ini ditulis oleh saya. Ini disebut anti-hutang.
3. Jika saya terus tidak membayar uang, Clark menggugat saya di pengadilan, dan dokumen kata ini dienkripsi dengan kunci pribadi saya dapat digunakan sebagai sertifikat Cheng Tang. Karena negara kita telah mengeluarkan "Hukum Tanda Tangan Elektronik Republik Rakyat Tiongkok", yang membuat tanda tangan digital efektif secara hukum.
Anda harus memperhatikan bahwa IOU ini yang dienkripsi dengan kunci pribadi saya memiliki karakteristik gangguan dan anti-hutang, dan dapat digunakan sebagai sertifikat Chengtang, yang sama dengan efek "penandatanganan" IOU ini. Ngomong -ngomong, proses "Enkripsi IOU dengan kunci pribadi saya" disebut Digital Signature.
Ini adalah artikel ringkasan, yang menulis beberapa teknologi enkripsi Java yang umum digunakan dan kode inti di sini untuk referensi oleh teman.