Enkripsi dan Dekripsi Data Menggunakan RSA Public dan Private Key yang dihasilkan oleh OpenSSL di Java
Apa itu RSA: Algoritma Enkripsi Kunci Publik RSA dikembangkan pada tahun 1977 oleh Ron Rivest, Adi Shamirh dan Len Adleman di (Massachusetts Institute of Technology). Penamaan RSA berasal dari nama -nama yang mengembangkan mereka bertiga. RSA adalah algoritma enkripsi kunci publik yang paling berpengaruh saat ini. Ini mampu menahan semua serangan kriptografi yang diketahui sejauh ini dan telah direkomendasikan oleh ISO sebagai standar enkripsi data kunci publik. Saat ini, metode enkripsi ini banyak digunakan dalam perbankan online, tanda tangan digital, dan kesempatan lainnya. Algoritma RSA didasarkan pada fakta teori bilangan yang sangat sederhana: sangat mudah untuk melipatgandakan dua bilangan prima yang besar, tetapi sangat sulit untuk memfaktorkan produk pada waktu itu, sehingga produk dapat diungkapkan sebagai kunci enkripsi.
APA ITU OPENSSL: Sejumlah algoritma kriptografi, standar infrastruktur kunci publik, dan protokol SSL, dan mungkin fitur -fitur menarik ini akan memberi Anda gagasan untuk menerapkan semua algoritma dan standar ini. Jika demikian, saat mengungkapkan kekaguman Anda, saya masih tidak dapat membantu tetapi mengingatkan Anda: ini adalah proses yang menakutkan. Karya ini tidak lagi sederhana seperti membaca beberapa monograf kriptografi dan dokumen protokol, tetapi lebih memahami setiap detail dari semua algoritma, standar dan dokumen protokol ini, dan menerapkan definisi dan proses ini satu per satu dengan karakter C yang mungkin Anda kenal. Kami tidak tahu berapa banyak waktu yang Anda perlukan untuk melakukan pekerjaan yang menyenangkan dan mengerikan ini, tetapi tentu saja ini bukan satu atau dua tahun. OpenSSL adalah koleksi algoritma yang menggabungkan banyak algoritma keamanan, yang ditulis oleh dua pria hebat, Eric A. Young dan Tim J. Hudson, sejak 1995. Melalui perintah atau perpustakaan pengembangan, kami dapat dengan mudah menerapkan aplikasi algoritma publik standar.
Salah satu latar belakang aplikasi hipotetis saya:
Dengan popularitas internet seluler, aplikasi yang dikembangkan untuk perangkat seluler muncul satu demi satu. Aplikasi ini sering disertai dengan fungsi pendaftaran pengguna dan verifikasi kata sandi. Ada bahaya tersembunyi dalam keamanan dalam "transmisi jaringan" dan "akses log aplikasi". Kata sandi adalah data sensitif untuk pengguna, dan pengembang perlu mengambil tindakan pencegahan keamanan sebelum aplikasi diluncurkan. Penanganan yang tidak tepat dapat menyebabkan masalah seperti serangan jahat oleh pesaing bisnis dan litigasi oleh mitra pihak ketiga.
Meskipun algoritma RSA memiliki banyak manfaat, tidak ada contoh lengkap di Internet untuk menggambarkan cara mengoperasikannya. Izinkan saya memperkenalkannya di bawah ini:
1. Gunakan OpenSSL untuk menghasilkan kunci pribadi dan publik
Saya menggunakan sistem Linux dan menginstal paket OpenSSL. Harap verifikasi bahwa OpenSSL diinstal pada mesin Anda. Informasi berikut akan muncul saat menjalankan perintah:
[root@chaijunkun ~]# openssl version -a OpenSSL 1.0.0-fips 29 Mar 2010 built on: Wed Jan 25 02:17:15 GMT 2012 platform: linux-x86_64 options: bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx) compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector - -param = ssp -buffer -size = 4 -m64 -mtune = generik -wa, -noexecStack -dmd32_reg_t = int -dopenssl_ia32_sse2 -dopenssl_bn_asm_mont -dsha1_asm -dsha2566_asm -dsh_mont -mont -mont -Dwirlpool_asm openssldir: "/etc/pki/tls" Mesin: AESNI DYAMNIC
Pertama menghasilkan kunci pribadi:
[root@chaijunkun ~]# openssl genrsa -out rsa_private_key.pem 1024 Menghasilkan kunci pribadi RSA, modulus panjang 1024 bit .................. +++++++++++++ E adalah 65537 (0x10001)
Perintah ini memungkinkan OpenSSL untuk secara acak menghasilkan kunci pribadi, dan panjang enkripsi adalah 1024 bit. Panjang terenkripsi mengacu pada batas teoritis dari panjang maksimum yang diizinkan "informasi terenkripsi", yaitu, batas panjang teks biasa. Ketika parameter ini meningkat (misalnya, 2048), panjang plaintext yang diizinkan juga akan meningkat, tetapi juga akan menyebabkan peningkatan cepat dalam kompleksitas komputasi. Panjang yang disarankan adalah 1024 bit (128 byte).
Mari kita lihat konten kunci pribadi:
[root@chaijunkun ~]# cat rsa_private_key.pem ----- mulai rsa kunci pribadi ----- miicwwibaakbgqchdzcjw/rwgfwnxunbkp7/4e8w/uMxx2jk6qeen69t6n2r1i/l mcyDT1xr/T2AHGOiXNQ5V8W4iCaaeNawi7aJaRhtVx1uOH/2U378fscEESEG8XDq ll0GCfB1/TjKI2aitVSzXOtRs8kYgGU78f7VmDNgXIlk3gdhnzh+uoEQywIDAQAB AOGAAEKK76CSSP7K90MWYWP18GHLZRU+VehFT9BPV67CGLG1OWFBNTFYQSPVSTFM U2LWN5HD/ICV+EGAJ4FOLXDM43KT4WYZNOABSZCKKXS6URCOFN3KT4WYZNOABSZKCKKXS6URCI8KT4WYZNOABSZCKXSS6URCI8KT4WYZNOABSZCKXSS6URCI8NAFNAY4 Phu2te7vi4ldkw9df1fya+dscslnadaun3ohb5jqgl+ls5ecqdufuxxn3uqgykk IHYSLL9LAKEAWGH4JXXXEIAUFMSGJOI3QPJQGVUMKX0W96MCPCWV3FSEW7W1/MSI SUTKJP5BBVJFVFWFMAHYLJDP7W+NEBWKBWJAYBZ/EB5NAZALJDP7W+NEBWKBWJAYBZ/EB5NAZAZA4A4MC7MC8MAJMC8MAJMC8MAJ8MC8MAJMCD8MAJAJAJAJYBZ/EB5NAZA4A4MC7MC7MC7 EgplwSJi/MKHRB48Xz2vyUciwywnmfxpApa3yDgQWskQDGy /ybxbd16qvixjvnt6qjabli6zx9gyrwnu6akpdahd8qjwonnnfnlqhue4wepevkm cysg+embk2ggsxntrzlwjlfx7vhmpqntc8ynmx1kfw == ----- end-end-end-end-end-end-end-end-end-end-end-end-end-end-end-end-end-
Kontennya adalah semua karakter ASCII standar, dengan tanda yang jelas pada awal dan garis akhir, dan data kunci pribadi yang sebenarnya adalah karakter yang tidak teratur di tengah.
Tambahan pada 24 Maret 2015: File kunci pada akhirnya akan menyimpan data melalui pengkodean Base64. Anda dapat melihat bahwa panjang setiap baris konten file utama di atas sangat teratur. Hal ini disebabkan oleh ketentuan dalam RFC2045: aliran output yang dikodekan harus direpresentasikan dalam baris masing -masing tidak lebih dari 76 karakter. Dengan kata lain, data yang dikodekan oleh Base64 tidak akan melebihi 76 karakter per baris, dan perlu dibagi berdasarkan baris untuk data ultra-panjang.
Selanjutnya, hasilkan kunci publik berdasarkan kunci pribadi:
[root@chaijunkun ~]# openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout menulis kunci rsa
Mari kita lihat konten kunci publik:
[root@chaijunkun ~]# cat rsa_public_ley.pem ----- mulai kunci publik ----- migfma0gcsqgsib3dqebaquaa4gnanadcbiqkbgqchdzcjw/rwgfwnxunbk7/4e8w /Umxx2jk6qeen69t6n2r1i/lmcydt1xr/t2ahgoixnq5v8w4icaaenaWi7ajarht vx1uoh/2u378fsceeseg8xdqll0gcfb1/tjki2aitvszxoTrs8kgu78/tjki2aitvszxoTrs8kgu78/tjki2aitvszxoTrs8kl0gcfb1/tjki2aitvszxoTrs8kl0gcfb1/tjki2aitvszxoTrs8kl0gcfb1/ Xilk3gdhnzh+uoeqywidaqab ---- Akhiri kunci publik ----
Pada saat ini, kunci pribadi tidak dapat digunakan secara langsung, jadi PKCS#8 encoding diperlukan:
[root@chaijunkun ~]# openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt
Perintah tersebut menunjukkan bahwa file kunci input pribadi adalah rsa_private_key.pem, dan file kunci privat output adalah pkcs8_rsa_private_key.pem, dan tidak ada enkripsi sekunder yang digunakan (-nocrypt)
Mari kita lihat apakah file kunci pribadi yang dikodekan berbeda dari file kunci pribadi sebelumnya:
[root@chaijunkun ~]# cat pkcs8_rsa_private_key.pem
----- Mulailah Kunci Pribadi ----- Miicdqibadanbgkqhkig9w0baqefaascal8wggjbageaaogbakepnypd+taaxcfg 6dsqnv/h7zd9szfhaotqoqsfr23o3zhwl8uzzinpxgv9pyacy6jcr23ozhwl8uzzinpxgv9pyacy6jcfr23ozhwl8uzzinpxgv9pyacy6jcfr23ozhwl8uzzinpxgv9pyacy6jcfr23ozhwl8uzzinpxgv9pyacy6 1RCLTOLPGG1XHW44F/ZTFVX+XWQRIQBXCOQWXQYJ8HX9OMOJZQK1VLNC61GZYRIA ZTVX/TWYM2BCIWTEB2GFOH66GRDLAGMBAAECGYBP4QTVOJKYN u768SF9P0GlXrtwYuDWjAVue0VhBI9WxMWZTaVafkcP8hxX4QZqPh84td0zjcq3j DLOegAFJkIorGzq5FyK7ydBoU1TLjFV459c8dTZMTu+LgsOTD11/V/Jr4NJxIudo Mbq3c4chmooyv4uzkqjbanr+7fc3e6ozgqtoesqpspqljbsdf9e4x4edfuoecckj dvvloooAzvthfaiup+h3fk4hxrpalbehiidhiux2ucqqqqqcCchiphfdcmdmdm 6Leqkmoa+6YpfRb3oxykLBXcWx7DtbX+ayKy5OQmnkEG+MW8XB8wAdiUl0/tb6cQ FaRvAkBhvP94Hk0DMDinFVHlWYJ3xy4pongSA8vCyMj+aSGtvjzjFnZXK4gIjBjA 2Z9EkDFioBBAWQP2DLDGUX2VXZ8BAKBYMUIH+KBSV76CNEDWLHFLQJLKGENVQTVX TB0TUW8AVLABAXW34/5SI+NUB1HMBGYTK/T/IFCEPXPBWLGO+E3PAKZL Fae7oaqkmad3xcny6ec180tae57hz6ks+sylkwb4gzyacxc22vmtyksxhtueamo 1nmlzi2zfuox ----- Akhir kunci pribadi ----
Pada titik ini, pasangan kunci yang tersedia telah dihasilkan. Kunci pribadi menggunakan pkcs8_rsa_private_key.pem, dan kunci publik menggunakan rsa_public_key.pem.
Ditambahkan pada 20 Mei 2014: Baru -baru ini, saya menemukan perlunya enkripsi RSA, dan pihak lain mengharuskan mereka hanya dapat menggunakan file kunci pribadi yang tidak dikodekan oleh PKC#8 yang dihasilkan pada langkah pertama. Kemudian, saya memeriksa dokumen yang relevan dan mengetahui bahwa file kunci pribadi yang dihasilkan pada langkah pertama adalah format PKCS#1. Format ini sebenarnya didukung oleh Java, tetapi saya hanya menulis dua baris kode lagi:
RsaprivateKeyStructure asn1privkey = baru rsaprivateKeystruktur ((asn1 sequence) asn1Sequence.FrombyTeArray (prikeyData)); RsaprivateKeySpec rsaprivkeyspec = rsaprivateKeyspec baru (asn1privkey.getModulus (), asn1privkey.getprivateExponent ()); KeyFactory keyFactory = keyFactory.getInstance ("RSA"); PrivateKey prikey = keyfactory.generatePrivate (rsaprivkeyspec); Pertama -tama baca file kunci pribadi PKCS#1 (perhatikan bahwa Anda menghapus konten komentar di awal tanda minus), dan kemudian menggunakan base64 untuk memecahkan kode string baca untuk mendapatkan prikeyData, yang merupakan parameter dalam baris kode pertama. Baris terakhir mendapatkan kunci pribadi. Tidak ada perbedaan dalam penggunaan berikutnya.
Referensi: https://community.oracle.com/thread/1529240?start=0&tstart=0
2. Tulis kode java untuk mengujinya
Tambahan 23 Februari 2012: JDK standar hanya ditentukan dalam JCE (JCE (JCE (Java Cryptography Extension) adalah seperangkat paket yang menyediakan kerangka kerja dan implementasi untuk enkripsi, pembuatan kunci dan negosiasi, dan algoritma yang dikurangi dan pemasangan. Antarmuka, tetapi implementasi internal perlu disediakan oleh diri mereka sendiri atau oleh pihak ketiga. Versi, Anda dapat menemukan versi yang sesuai di halaman unduhan sebelumnya.
Mari kita lihat kode yang saya terapkan:
paket net.csdn.blog.chaijunkun; impor java.io.bufferedReader; impor java.io.ioException; impor java.io.inputstream; impor java.io.inputStreamReader; impor java.security.invalidkeyException; impor java.security.keyfactory; impor java.security.keypair; impor java.security.keypairgenerator; impor java.security.nosuchalgorithmException; impor java.security.securerandom; impor java.security.interfaces.rsaprivateKey; impor java.security.interfaces.rsapublickey; impor java.security.spec.invalidkeyspecexception; impor java.security.spec.pkcs8encodedkeyspec; impor java.security.spec.x509encodedkeyspec; impor javax.crypto.badpaddingException; impor javax.crypto.cipher; impor javax.crypto.illegalblocksizeException; impor javax.crypto.nosuchpaddingException; impor org.bouncycastle.jce.provider.bouncycastleprovider; impor sun.misc.base64decoder; kelas publik rsaencrypt {private static final string default_public_key = "migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqchdzcjw/rwgfwnxunbkp7/4e8w"/r " + + "/UMXX2JK6QEEN69T6N2R1I/LMCYDT1XR/T2AHGOIXNQ5V8W4ICAAENAWI7AJARHT" + "/R" + "VX1UOH/2U378FSCEESEG8XDQLL0GCFB1/TJKI28FSESEG8XDQLL0GCFB1/TJKI2.PRYKYGUM8S8SDQUL0 "/r" + "xilk3gdhnzh + uoeqywidaqab" + "/r"; Private Static Final String Default_Private_Key = "miicdqibadanbgkqhkig9w0baqefaascal8wggjbageaogbakepnypd + taaxcfg" + "/r" + "6dsqnv/h7zd9szfhaotqoqsfr23o3zhwl8uzzinpxgv9pyacy6jc1dlxxbiijpp4" + "/r" + "1rcltolpgg1xhw44f/ztfvx + xwqriqbxcoqwxqyj8hx9omojzqk1vlnc61gzyria" + "/r" + "ZTVX/TWYM2BCIWTEB2GFOH66GRDLAGMBAAECGYBP4QTVOJKYNUT3SBDJY/XWAETM" + "/R" + "U768SF9P0GLXRTWYUDWJAVUE0VHBI9WXMWZTAVAFKCP8HXX4QZQPH84TD0ZJCQ3J" + "/R" + "DloegafjKiorgzq5fyk7ydbou1tljfv459c8dtzmtu + lgsotd11/v/jr4njxiudo" + "/r" + "MBQ3C4CHMOOYV4UZKQJBANR + 7FC3E6OZGQTOESQPSPQLJBSDF9E4X4EDFUOECCKJ" + "/R" + "DVVLOOOZVTHFAIUP + H3FK4HXRPALINBEIDHIUX2UC2UC2UC2UCHCHCHC4HXRPALINBEIDHRIUX2 "/r" +"6leqkmoa +6ypfrb3oxyklbxcwx7dtbx +ayky5oqmnkeg +mw8xb8wadiul0/tb6cq" +"/r" + "Farvakbhvp94HK0DMdinfvhlwyj3xy4pongsa8vcymj + asgtvjzjfnzxk4gijbJa" + "/r" + "2z9Ekdfiobbawqp2dldgux2vxz8bkbyMuih + KbsV76Kp2DLDGUX2VXZ8BY "/r" + "tb0tuw8avlabaxw34/5si + nub1hmbgytk/t/ifcepxpbwlgo + e3pakagwlpnh0zh" + "/r" + "Fae7oaqkmad3xcny6ec180tae57hz6ks + sylkwb4ggzyacxc22vmtyksxhtueamo" + "/r" + "1nmlzi2zfuox" + "/r"; / *** Kunci pribadi*/ Private rsaprivateKey privateKey; / *** Kunci publik*/ Private RSAPublickey PublicKey; / *** Set private ke string*/ private static final char [] hex_char = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; / *** Dapatkan kunci pribadi* @return objek kunci pribadi saat ini*/ publik rsaprivate getprivateKey () {return privateKey; } / *** Dapatkan kunci publik* @return objek kunci publik saat ini* / public rsapublickey getPublickey () {return publicKey; } / *** Pasangan kunci yang dihasilkan secara acak* / public void gamatePair () {keyPairGenerator keyPairgen = null; coba {keyPairgen = keyPairGenerator.getInstance ("rsa"); } catch (nosuchalgorithMexception e) {e.printstacktrace (); } keypairgen.Initialize (1024, new SecureRandom ()); Keypair keypair = keypairgen.generatePeyPair (); this.privateKey = (rsaprivateKey) keypair.getprivate (); this.publickey = (rsapublickey) keypair.getPublic (); } / *** Muat tombol publik dari aliran input dalam file* @param dalam aliran input kunci publik* @throws pengecualian pengecualian yang dihasilkan saat memuat kunci publik* / public void loadpublickey (inputStream in) melempar Exception {coba {bufferedReader Br = new BufferedReader (inputStreamReAder {in BufferedReader; String readline = null; StringBuilder SB = StringBuilder baru (); while ((readline = br.readline ())! = null) {if (readline.charat (0) == '-') {lanjut; } else {sb.append (readline); SB.Append ('/r'); }} loadPublickey (sb.toString ()); } catch (ioException e) {lempar pengecualian baru ("Kesalahan Baca Aliran Data Kunci Publik"); } catch (nullpointerexception e) {lempar pengecualian baru ("aliran input kunci publik kosong"); }} / *** Muat tombol publik dari string* @param publicystrytr Public Key Data String* @throws Exception Exception Dihasilkan Saat Memuat Kunci Publik* / Public Void LoadPublickey (String PublicKeystr) melempar Exception {coba {Base64Decoder Base64Decoder = base64decoder (); byte [] buffer = base64decoder.decodebuffer (publiceYstr); KeyFactory keyFactory = keyFactory.getInstance ("RSA"); X509Encodedkeyspec keyspec = new X509EncodedKeySpec (buffer); this.publickey = (rsapublickey) keyfactory.generatePublic (keyspec); } catch (nosuchalgorithMexception e) {lempar pengecualian baru ("Nothing Algorithm"); } catch (InvalidkeyspecException e) {lempar pengecualian baru ("kunci publik ilegal"); } catch (ioException e) {lempar pengecualian baru ("Kesalahan Baca Konten Data Kunci Publik"); } catch (nullpointerException e) {lempar pengecualian baru ("Data kunci publik kosong"); }} / *** Muat tombol pribadi dari file* @param keyfileName nama file kunci pribadi* @return apakah itu berhasil* @throws Exception* / public void loadPrivateKey (inputStream in) melempar Exception {coba {buferedReader BR = BufferedReader baru (new inputStreamReader (in)); String readline = null; StringBuilder SB = StringBuilder baru (); while ((readline = br.readline ())! = null) {if (readline.charat (0) == '-') {lanjut; } else {sb.append (readline); SB.Append ('/r'); }} loadPrivateKey (sb.toString ()); } catch (ioException e) {lempar pengecualian baru ("Kesalahan membaca data kunci pribadi"); } catch (nullpointerexception e) {lempar pengecualian baru ("aliran input kunci pribadi kosong"); }} public void loadPrivateKey (String privateKeyStr) melempar Exception {try {base64Decoder base64Decoder = base64decoder baru (); byte [] buffer = base64decoder.decodebuffer (privateKeystr); Pkcs8encodedkeyspec keyspec = pkcs8encodedkeyspec baru (buffer); KeyFactory keyFactory = keyFactory.getInstance ("RSA"); this.privateKey = (rsaprivateKey) keyfactory.generatePrivate (keyspec); } catch (nosuchalgorithMexception e) {lempar pengecualian baru ("tidak ada algoritma ini"); } catch (InvalidkeyspecException e) {lempar pengecualian baru ("Private Key Illegal"); } catch (ioException e) {lempar pengecualian baru ("Kesalahan Baca Konten Data Kunci Pribadi"); } catch (nullpointerexception e) {lempar pengecualian baru ("data kunci pribadi kosong"); }} / *** Proses enkripsi* @param publickey kunci publik* @param plaintextData data plaintext* @return* @Throws Pengecualian informasi selama proses enkripsi* / public byte [] Encrypt (rsapublicey publickey, byte [] plaintextData byte) lemparan pengecuali "); } Cipher cipher = null; coba {cipher = cipher.getInstance ("rsa", new BoundcastLeprovider ()); cipher.init (cipher.encrypt_mode, publickey); byte [] output = cipher.dofinal (plaintextData); output pengembalian; } catch (nosuchalgorithmException e) {lempar pengecualian baru ("algoritma enkripsi nothis"); } catch (nosuchpaddingException e) {e.printstacktrace (); kembali nol; } catch (InvalidKeyException e) {lempar pengecualian baru ("Kunci publik enkripsi ilegal, silakan periksa"); } catch (ilegalblocksizeException e) {lempar pengecualian baru ("Panjang placktext ilegal"); } catch (badpaddingException e) {lempar pengecualian baru ("data placktext rusak"); }} / *** Proses dekripsi* @param privateKey pribadi Kunci pribadi* @param cipherdata data ciphertext* @return plaintext* @throws informasi pengecualian selama proses dekripsi* / byte publik [] decrypt (rsaprivate privateKey, byte [] cipherdata byte {rsapripkey (cipherdata (] cipherdata {rsaprickey {if (] cipherdata {rsapripkey (cipherdata {ciphere (] newkkey {cipherkey {ifickey {ifickey {ifickey { kosong, silakan atur "); } Cipher cipher = null; coba {cipher = cipher.getInstance ("rsa", new BoundcastLeprovider ()); cipher.init (cipher.decrypt_mode, privateKey); byte [] output = cipher.dofinal (cipherdata); output pengembalian; } catch (nosuchalgorithMexception e) {lempar pengecualian baru ("Tidak ada algoritma dekripsi"); } catch (nosuchpaddingException e) {e.printstacktrace (); kembali nol; } catch (InvalidKeyException e) {lempar pengecualian baru ("Kunci pribadi dekripsi ilegal, silakan periksa"); } catch (ilegalblocksizeException e) {lempar pengecualian baru ("Cryptotext Length adalah ilegal"); } catch (badpaddingException e) {lempar pengecualian baru ("data cryptotext rusak"); }} / *** byte data ke hexadecimal string* @param data input data* @return hexadecimal konten* / public static string bytearraytoString (byte [] data) {stringBuilder stringBuilder = new stringBuilder (); untuk (int i = 0; i <data.length; i ++) {// Keluarkan empat digit tinggi byte sebagai indeks untuk mendapatkan pengidentifikasi heksadesimal yang sesuai. Perhatikan bahwa stringbuilder shift kanan yang tidak ditandatangani (hex_char [(data [i] & 0xf0) >>> 4]); // Keluarkan empat bit byte yang lebih rendah sebagai indeks untuk mendapatkan hexadecimal identifikasi hexadecimal stringBuilder.append (hex_char [(data [i] & 0x0f)])); if (i <data.length-1) {stringBuilder.append (''); }} return stringBuilder.toString (); } public static void main (string [] args) {rsaencrypt rsaencrypt = rsaencrypt () baru; //rsaencrypt.genkeypair (); // Muat kunci publik coba {rsaencrypt.loadpublickey (rsaencrypt.default_public_key); System.out.println ("Memuat kunci publik berhasil"); } catch (Exception e) {System.err.println (e.getMessage ()); System.err.println ("Memuat kunci publik gagal"); } // Memuat kunci pribadi coba {rsaencrypt.loadprivateKey (rsaencrypt.default_private_key); System.out.println ("Memuat kunci pribadi berhasil"); } catch (Exception e) {System.err.println (e.getMessage ()); System.err.println ("Memuat kunci pribadi gagal"); } // test string string encryptstr = "test string chaijunkun"; coba {// enkripsi byte [] cipher = rsaencrypt.encrypt (rsaencrypt.getpublickey (), encryptstr.getbytes ()); // decrypt byte [] plaintext = rsaencrypt.decrypt (rsaencrypt.getprivateKey (), cipher); System.out.println ("Ciphertext Length:"+ Cipher.Length); System.out.println (rsaencrypt.bytearraytoString (cipher)); System.out.println ("Panjang Plaintext:"+ Plaintext.Length); System.out.println (rsaencrypt.bytearraytoString (plaintext)); System.out.println (string baru (plaintext)); } catch (Exception e) {System.err.println (e.getMessage ()); }}} Dalam kode, saya menyediakan dua cara untuk memuat kunci publik dan pribadi.
Baca dengan Stream: Cocok untuk metode mendapatkan InputStream dengan sumber daya pengindeksan ID dalam aplikasi Android;
Baca dengan String: Seperti yang ditunjukkan pada kode, simpan konten kunci berdasarkan garis ke konstanta statis dan impor kunci dengan jenis string.
Jalankan kode di atas dan informasi berikut akan ditampilkan:
1 64 57 C8 E3 46 A7 CE 57 31 AC CD 21 89 89 8f C1 24 C1 22 0c CB 70 6A 0D FA C9 38 80 BA 2E E1 29 02 ED 45 9E 88 E9 23 09 87 AF AC AC 61 03 3C A1 81 56 A5 A5 DE C4 79 A AC AC 61 03 3C A1 81 56 A5 A5 DE C4 79 AC AC 61 03 3C A1 81 56 A5 A5 9f fd 22 87 9e de b1 f4 e8 b2 Teks polos Panjang: 22 54 65 73 74 20 53 74 72 69 6e 67 20 63 68 61 69 6a 75 6e 6b 75 6e Tes Chaijunkun
Dalam fungsi utama saya mengomentari "rsaencrypt.genkeypair ()", yang digunakan untuk secara acak menghasilkan pasangan kunci (hanya menghasilkan, menggunakan, bukan menyimpan). Ketika tombol file tidak digunakan, Anda dapat mengomentari kode yang memuat tombol, mengaktifkan metode ini, atau menjalankan kode.
Perbedaan antara memuat kunci publik dan memuat kunci pribadi adalah bahwa ketika kunci publik dimuat, X509EncodedKeySpec (instruksi kunci yang dikodekan X509), dan ketika kunci pribadi dimuat, PKCS8Encodedkeyspec (PKCS#8-ecody Instruksi Kunci).
Ditambahkan pada 22 Februari 2012: Selama pengembangan perangkat lunak Android, ditemukan bahwa kode di atas tidak berfungsi dengan baik. Alasan utamanya adalah bahwa kelas Sun.misc.base64Decoder tidak ada dalam paket pengembangan Android. Karena itu, Anda perlu mencari kode sumber Rt.jar di internet. Adapun kode sumber dalam SRC.ZIP JDK, ini hanya bagian dari kode sumber di JDK, dan kode kelas di atas tidak ada. Setelah mencari dan menambahkan, kode di atas berfungsi dengan baik dalam aplikasi Android. Ini berisi kode yang sesuai untuk kelas ini. Selain itu, kelas ini juga tergantung pada ceformatException, cestreamEx EXTRIONDed, karakterdecoder dan kelas karakterenCoder dan definisi pengecualian.
Ditambahkan pada 23 Februari 2012: Pada awalnya, saya menulis artikel ini untuk mengimplementasikan enkripsi dan dekripsi RSA tanpa mengandalkan paket pihak ketiga mana pun, tetapi saya mengalami masalah nanti. Karena objek cipher harus dibuat dalam enkripsi metode enkripsi dan metode dekripsi dekripsi, objek ini hanya dapat memperoleh instance melalui getInstance. Ada dua jenisnya: yang pertama adalah menentukan hanya algoritma dan bukan penyedia; yang kedua adalah menentukan keduanya. Pada awalnya, kode masih dapat berjalan, tetapi Anda akan menemukan bahwa hasil dari setiap enkripsi berbeda. Belakangan, ditemukan bahwa kunci publik dan pribadi yang digunakan oleh objek sandi dihasilkan secara internal, bukan kunci publik dan pribadi yang ditentukan dalam kode. Anehnya, kode ini yang tidak menentukan penyedia dapat berjalan melalui aplikasi Android, dan hasil dari setiap enkripsi adalah sama. Saya pikir selain beberapa fungsi pengembangan sistem di Android SDK, itu juga mengimplementasikan fungsi JDK. Ini mungkin telah memberikan penyedia yang sesuai di JDK sendiri, yang membuat hasil enkripsi sama setiap saat. Ketika saya menambahkan penyedia Bouncycastle seperti kode sampel di Internet, hasil dari setiap enkripsi adalah sama.
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!