Artikel ini menjelaskan fungsi enkripsi dan dekripsi yang diimplementasikan oleh Java berdasarkan algoritma enkripsi DES Symmetric. Bagikan untuk referensi Anda, sebagai berikut:
Kategori terkait enkripsi des:
Securerandom diwarisi dari kelas java.util.random
Ada tiga jenis konstruktor kelas ini, berikut ini adalah dua contoh:
SecureRandom () membangun generator nomor acak aman (RNG) yang mengimplementasikan algoritma bilangan acak default.
Securerandom (byte [] seed) Membangun generator nomor acak aman (RNG) yang mengimplementasikan algoritma bilangan acak default.
Deskeyspec digunakan untuk menghasilkan konten kunci dari kunci menggunakan kunci asli.
Deskeyspec memiliki dua konstruktor:
Deskeyspec (byte [] kunci) membuat objek deskeyspec menggunakan 8 byte pertama di kunci sebagai konten kunci dari tombol DES.
Kunci deskeyspec (byte [], int offset) membuat objek deskeyspec, menggunakan 8 byte pertama dalam kunci yang dimulai dengan dan berisi offset sebagai konten kunci dari kunci des-ede.
SecretKeyFactory, pabrik utama yang digunakan untuk mengonversi kunci (kunci enkripsi OPIC dari kunci tipe) ke spesifikasi kunci (representasi transparan dari materi kunci yang mendasari), dan sebaliknya. Pabrik Kunci Rahasia hanya beroperasi pada kunci rahasia (simetris).
Objek Secretkey, Objek Kunci Rahasia, Menghasilkan Kunci Rahasia dengan memanggil metode yang dihasilkan (ruang desktop deskeyspec) dari pabrik kunci rahasia
Kelas Cipher menyediakan fungsi kata sandi untuk enkripsi dan dekripsi, dan memperoleh instance dengan memanggil Cipher's GetInstance ("Des")
Objek Cipher memanggil metode init () untuk menginisialisasi objek. Parameter spesifik dari metode init () ditentukan sesuai dengan situasi spesifik, termasuk konstanta yang dienkripsi dan didekripsi.
Akhirnya, hubungi metode dofinal () Cipher untuk enkripsi dan dekripsi.
Di sini saya ingin mengajukan pertanyaan kepada Anda. Apakah itu jenis pengkodean pertama menggunakan base64encoder atau tipe kedua org.apache.commons.codec.binary.base64 encoding, ketika mengonversi string ke byte dan byte ke string, UTF-8/GBK dan pengkodean lain diperlukan untuk mengkode. Apakah itu diterjemahkan?
1. Gunakan sun.misc.base64decoder dan base64encoder untuk decoding dan encoding
Paket com.soufun.com; Impor java.io.ioException; impor java.security.nosuchalgorithmException; impor java.security.securerandom; impor java.util.date; impor javax.crypto.cipher; impor javax.crypto.srypto. javax.crypto.spec.deskeyspec; // import 64-bit encoding matahari impor matahari. Saat ini, Anda dapat menghapus paket JRE Anda dan mengimpornya lagi. */kelas publik desutil {// tentukan metode enkripsi private final static string des = "des"; Private Final Static String UTF8 = "GBK"; SecretkeyFactory static keyfactory = null; static {coba {keyfactory = SecretkeyFactory.getInstance ("des"); } catch (nosuchalgorithMexception e) {// todo auto-generated catch block e.printstacktrace (); }} public static void main (string [] args) melempar Exception {long begin = new date (). getTime (); Data String = "Tes Enkripsi AAADS"; // Catatan: Selama proses enkripsi dan dekripsi DES, panjang kunci harus kelipatan 8. string key = "qazwsxed"; System.err.println (Encrypt (Data, Key)); System.err.println (Decrypt (Encrypt (Data, Key), Key)); Long End = Tanggal baru (). GetTime (); System.out.println (end-begin); } / ** * Deskripsi Enkripsi sesuai dengan nilai kunci * @param data * @param Kunci Kunci Kunci Byte Array * @Return * @throws Exception * / Public Static String Encrypt (Data String, Kunci String) Melempar Pengecualian {// Gunakan encoding yang ditentukan untuk mendapatkan konten yang akan dienkripsi. Secara umum, kunci rahasia adalah huruf atau angka tanpa menentukan pengkodean, tetapi spesifikasinya juga dapat menjadi byte [] bt = enkripsi (data.getbytes (utf8), key.getbytes (utf8)); // Catatan: Saat mengenkripsi dan dekripsi, gunakan Sun's Base64Encoder () untuk pengkodean dan decoding, jika tidak akan ada kode yang kacau. Saya memiliki kode kacau di sini, jadi saya menggunakan base64Encoder () untuk pengkodean dan decoding string strs = base64Encoder baru (). Encode (bt); mengembalikan strs; } / ** * Deskripsi Decrypt Menurut nilai kunci * @param Data * @param Kunci Kunci Kunci Byte Array * @Return * @throws IoException * @throws Exception * / Public Static String Decrypt (data string, string Key) melempar IOException, Exception {if (data == null) return null; // Catatan: Saat mengenkripsi dan mendekripsi, gunakan Sun's Base64Encoder () untuk pengkodean dan decoding, jika tidak akan ada base base64decoder decoder = base64decoder () baru; byte [] buf = decoder.decodebuffer (data); byte [] bt = decrypt (buf, key.getbytes ()); mengembalikan string baru (bt, utf8); } / ** * Deskripsi Enkripsi Menurut nilai kunci * @param Data * @param Kunci Enkripsi Kunci Byte Array * @return * @throws Exception * / private static byte [] enkripsi (byte [] data, byte [] lemparan pengecualian {// menghasilkan sumber acak tepercaya Secure securerandom sr = newerdandom () (); // Buat objek deskeyspec dari data kunci asli, yaitu, konten kunci dari kunci yang membuat kunci deskeyspec dks = deskeyspec baru (kunci); // Pabrik utama digunakan untuk mengonversi kunci (kunci enkripsi OPIC dari kunci tipe) ke spesifikasi kunci (representasi transparan dari materi kunci yang mendasari), dan sebaliknya. Pabrik Kunci Rahasia hanya beroperasi pada kunci rahasia (simetris). // Gunakan mode singleton sebagai gantinya di sini // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance (des); // Hasilkan objek SecretKey (kunci) sesuai dengan spesifikasi kunci yang disediakan (materi kunci). Secretkey SecureKey = KeyFactory.GenerateSecret (DKS); // Objek Cipher sebenarnya menyelesaikan operasi enkripsi, dan kelas ini menyediakan fungsi kata sandi untuk enkripsi dan dekripsi. Cipher cipher = cipher.getInstance (des); // Inisialisasi cipher ini dengan kunci dan sumber acak. Encrypt_mode digunakan untuk menginisialisasi cipher ke dalam konstanta untuk mode enkripsi. cipher.init (cipher.encrypt_mode, SecureKey, sr); // eksekusi formal pengembalian operasi enkripsi cipher.dofinal (data); } /** * Description Decrypt according to key value* @param data * @param key Encryption key byte array* @return * @throws Exception */ private static byte[] decrypt(byte[] data, byte[] key) throws Exception { // Generate a trusted random number source SecureRandom sr = new SecureRandom(); // Buat objek deskeyspec dari data kunci asli, yaitu, konten kunci dari kunci yang membuat kunci deskeyspec dks = deskeyspec baru (kunci); // Pabrik utama digunakan untuk mengonversi kunci (kunci enkripsi OPIC dari kunci tipe) ke spesifikasi kunci (representasi transparan dari materi kunci yang mendasari), dan sebaliknya. Pabrik Kunci Rahasia hanya beroperasi pada kunci rahasia (simetris). // Gunakan mode singleton sebagai gantinya di sini // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance (des); // Hasilkan objek SecretKey (kunci) sesuai dengan spesifikasi kunci yang disediakan (materi kunci). Secretkey SecureKey = KeyFactory.GenerateSecret (DKS); // Kelas Cipher menyediakan fungsi kata sandi untuk enkripsi dan dekripsi. Cipher cipher = cipher.getInstance (des); // decrypt_mode digunakan untuk menginisialisasi cipher ke dalam konstanta dalam mode dekripsi. cipher.init (cipher.decrypt_mode, SecureKey, sr); // Pengembalian Operasi Dekripsi Formal Cipher.Dofinal (Data); }}2. Gunakan org.apache.commons.codec.binary.base64 untuk mendekode dan encode
Paket com.soufun.com; Impor java.io.ioException; impor java.security.nosuchalgorithmException; impor java.security.securerandom; impor java.util.date; impor javax.crypto.cipher; impor javax.crypto.srypto. javax.crypto.spec.deskeyspec; impor org.apache.commons.codec.binary.base64;/** *@penulis whd * */kelas publik desutil {// tentukan metode enkripsi string statis final private des = "des"; Private Final Static String UTF8 = "GBK"; SecretkeyFactory static keyfactory = null; static {coba {keyfactory = SecretkeyFactory.getInstance ("des"); } catch (nosuchalgorithMexception e) {// todo auto-generated catch block e.printstacktrace (); }} public static void main (string [] args) melempar Exception {long begin = new date (). getTime (); Data String = "Tes Enkripsi AAADS"; // Catatan: Selama proses enkripsi dan dekripsi DES, panjang kunci harus kelipatan 8. string key = "qazwsxed"; System.err.println (Encrypt (Data, Key)); System.err.println (Decrypt (Encrypt (Data, Key), Key)); Long End = Tanggal baru (). GetTime (); System.out.println (end-begin); } / ** * Deskripsi Enkripsi Menurut nilai kunci * @param Data * @param Kunci Kunci Kunci Byte Array * @Return * @Throws Exception * / Public Static String Encrypt (Data String, Kunci String) Melempar Pengecualian {// Gunakan encoding yang ditentukan untuk mendapatkan konten yang akan dienkripsi. Secara umum, kunci adalah huruf atau angka tanpa menentukan pengkodean, tetapi yang ditentukan juga dapat menjadi byte [] bt = enkripsi (data.getbytes (utf8), key.getbytes ()); // yang pertama menggunakan sun.misc.base64encoder; Ini dikodekan, tetapi dikatakan bahwa menggunakan org.apache.commons.codec.binary.base64 lebih baik, jadi coba string strs = base64.encodeBase64String (BT); mengembalikan strs; } / ** * Deskripsi Decrypt Menurut nilai kunci * @param Data * @param Kunci Kunci Kunci Byte Array * @Return * @throws IoException * @throws Exception * / Public Static String Decrypt (string data, string Key) melempar ioException, pengecualian {if (data == null) return null; // Gunakan org.apache.commons.codec.binary.base64 untuk mendekode byte [] buf = base64.decodebase64 (data); byte [] bt = decrypt (buf, key.getbytes ()); mengembalikan string baru (bt, utf8); } /** * Description Encrypt according to key value* @param data * @param key Encryption key byte array* @return * @throws Exception */ private static byte[] encrypt(byte[] data, byte[] key) throws Exception { // Generate a trusted random number source SecureRandom sr = new SecureRandom(); // Buat objek deskeyspec dari data kunci asli, yaitu, konten kunci dari kunci yang membuat kunci deskeyspec dks = deskeyspec baru (kunci); // Pabrik utama digunakan untuk mengonversi kunci (kunci enkripsi OPIC dari kunci tipe) ke spesifikasi kunci (representasi transparan dari materi kunci yang mendasari), dan sebaliknya. Pabrik Kunci Rahasia hanya beroperasi pada kunci rahasia (simetris). // Gunakan mode singleton sebagai gantinya di sini // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance (des); // Hasilkan objek SecretKey (kunci) sesuai dengan spesifikasi kunci yang disediakan (materi kunci). Secretkey SecureKey = KeyFactory.GenerateSecret (DKS); // Objek Cipher sebenarnya menyelesaikan operasi enkripsi, dan kelas ini menyediakan fungsi kata sandi untuk enkripsi dan dekripsi. Cipher cipher = cipher.getInstance (des); // Inisialisasi cipher ini dengan kunci dan sumber acak. Encrypt_mode digunakan untuk menginisialisasi cipher ke dalam konstanta untuk mode enkripsi. cipher.init (cipher.encrypt_mode, SecureKey, sr); // eksekusi formal pengembalian operasi enkripsi cipher.dofinal (data); } /** * Description Decrypt according to key value* @param data * @param key Encryption key byte array* @return * @throws Exception */ private static byte[] decrypt(byte[] data, byte[] key) throws Exception { // Generate a trusted random number source SecureRandom sr = new SecureRandom(); // Buat objek deskeyspec dari data kunci asli, yaitu, konten kunci dari kunci yang membuat kunci deskeyspec dks = deskeyspec baru (kunci); // Pabrik utama digunakan untuk mengonversi kunci (kunci enkripsi OPIC dari kunci tipe) ke spesifikasi kunci (representasi transparan dari materi kunci yang mendasari), dan sebaliknya. Pabrik Kunci Rahasia hanya beroperasi pada kunci rahasia (simetris). // Gunakan mode singleton sebagai gantinya di sini // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance (des); // Hasilkan objek SecretKey (kunci) sesuai dengan spesifikasi kunci yang disediakan (materi kunci). Secretkey SecureKey = KeyFactory.GenerateSecret (DKS); // Kelas Cipher menyediakan fungsi kata sandi untuk enkripsi dan dekripsi. Cipher cipher = cipher.getInstance (des); // decrypt_mode digunakan untuk menginisialisasi cipher ke dalam konstanta dalam mode dekripsi. cipher.init (cipher.decrypt_mode, SecureKey, sr); // Pengembalian Operasi Dekripsi Formal Cipher.Dofinal (Data); }}Unduh alamat paket yang digunakan dalam 1 dan 2:
Unduh: sun.misc.base64decoder.
Unduh: Encoding Base64 Apache, Decoder.
3. Tidak ada pengkodean yang digunakan, paket decoding
Paket com.soufun.com; Impor java.io.ioException; impor java.security.nosuchalgorithmException; impor java.util.date; import java.util.hashmap; impor java.util.map; impor javax.crypto.cipher; impor javax.crypto; impor javax.crypher. javax.crypto.secretkeyfactory; import javax.crypto.spec.deskeyspec; impor javax.crypto.spec.ivparameterspec;/** *@penulis whd * */kelas publik descrypt {static Secretkeyfactory SecretKeyFactory = null; // cipher "algoritma/pola/pengisian" string final statis cipher = "des/cbc/pkcs5padding"; static {try {// dapatkan proyek kunci rahasia SecretkeyFactory = SecretkeyFactory.getInstance ("des"); } catch (nosuchalgorithMexception e) {e.printstacktrace (); }} // Tentukan konstanta, encoding format private static final string utf8 = "gbk"; /** Wadah untuk cache objek*/ statis abstrak kelas cache {private final peta innercache = new hashMap (); CreateValue Objek Abstrak yang Dilindungi (Kunci Objek) melempar pengecualian; objek publik get (tombol objek) melempar pengecualian {nilai objek; disinkronkan (innercache) {value = innercache.get (key); if (value == null) {value = new creationplaceHolder (); innercache.put (tombol, nilai); }} if (value instance creationplaceHolder) {disinkronkan (nilai) {creationplaceHolder progress = (creationplaceHolder) value; if (progress.value == null) {progress.Value = createValue (key); disinkronkan (innercache) {innercache.put (key, progress.value); }} return progress.value; }} nilai pengembalian; } static final class creationplaceHolder {nilai objek; }} / * * hex-> str & str &> hex * / public static byte [] stringToHex (string ss) {// string konversi kami byte digest [] = byte baru [ss.length () / 2]; untuk (int i = 0; i <digest.length; i ++) {string bytestring = ss.substring (2 * i, 2 * i+2); int bytevalue = integer.parseint (bytestring, 16); Digest [i] = (byte) bytevalue; } return Digest; } public static string hextoString (byte b []) {stringBuffer hexString = new stringBuffer (); untuk (int i = 0; i <b.length; i ++) {string plaintext = integer.toHexString (0xff & b [i]); if (plaintext.length () <2) {hexString.append ("0"); } hexString.append (plaintext); } return hexString.toString (); } private static byte [] _convertKeyiv (string text) melempar ioException {if (text.length () == 8) {return text.getbytes (utf8); } if (text.startswith ("0x") && text.length () == 32) {byte [] hasil = byte baru [8]; untuk (int i = 0; i <text.length (); i+= 2) {if (text.charat (i ++) == '0' && text.charat (i ++) == 'x') {coba {hasil [i / 4] = (byte) integer.parseint (text.substring (i, i+2), 16); } catch (exception e) {lempar ioException baru ("txt '" + text + "' tidak valid!"); }}} hasil pengembalian; } lempar ioException baru ("txt '" + text + "' tidak valid!"); } /** Secretkey & ivparameterspec's cache* / private static cache Secretkeyspecs = new cache () {Objek yang dilindungi CreateValue (kunci objek) melempar pengecualian {SecretKey SecretKeyObj = null; Coba {SecretKeyObj = SecretKeyFactory.GenerateSecret (baru deskeyspec (_convertKeyiv ((string) key))); } catch (Exception e) {E.PrintStackTrace (); } return Secretkeyobj; }}; private static cache ivparamspecs = baru cache () {createValue objek protected (tombol objek) melempar Exception {ivparameterspec ivoBj = null; ivobj = ivparameterspec (_convertKeyiv ((string) key); mengembalikan ivobj; }}; /** Enkripsi & Dekripsi*/ Public Static String Encrypt (String Text, String Authkey, String Authiv) {SecretKey SecretkeyObj = Null; Ivparameterspec ivoBj = null; coba {SecretkeyObj = (SecretKey) Secretkeyspecs.get (AuthKey); ivobj = (ivparameterspec) ivparamspecs.get (authiv); } catch (Exception e) {E.PrintStackTrace (); } byte [] data = null; coba {data = text.getbytes (utf8); } catch (Exception e) {E.PrintStackTrace (); } byte [] authToken = null; coba {authToken = encrypt (data, Secretkeyobj, ivobj); } catch (Exception e) {E.PrintStackTrace (); } return hextoString (authToken); } public static byte [] encrypt (byte [] data, Secretkey Secretkey, ivparameterspec iv) melempar pengecualian {cipher cipher = cipher.getInstance (cipher); cipher.init (cipher.encrypt_mode, Secretkey, iv); return cipher.dofinal (data); } public static String Decrypt (String hexString, String Authkey, String Authiv) melempar Exception {SecretKey SecretkeyObj = null; Ivparameterspec ivoBj = null; coba {SecretkeyObj = (SecretKey) Secretkeyspecs.get (AuthKey); ivobj = (ivparameterspec) ivparamspecs.get (authiv); } catch (Exception e) {E.PrintStackTrace (); } String text = decrypt (hexString, secretkeyobj, ivobj); mengembalikan teks; } public static string decrypt (pesan string, Secretkey Secretkey, ivparameterspec iv) melempar Exception {byte [] data = stringToHeHex (pesan); return decrypt (Data, Secretkey, IV); } public static String Decrypt (byte [] Data, Secretkey Secretkey, ivparameterspec iv) melempar pengecualian {cipher cipher = cipher.getInstance (cipher); cipher.init (cipher.decrypt_mode, Secretkey, iv); byte [] retbyte = cipher.dofinal (data); mengembalikan string baru (retbyte); } public static void main (string [] args) melempar Exception {long begin = new date (). getTime (); String authkey = "w8f3k9c2"; String authiv = "w8f3k9c2"; String text = "tes enkripsi aaades"; // 140CB412BA03869F // 140CB412BA03869F // Enkripsi string teks asli EncryptedText = Encrypt (Text, Authkey, Authiv); System.out.println ("EncryptedText:" + EncryptedText); // Kembalikan string ciphertext plaintext = decrypt (encryptedText, authkey, authiv); System.out.println ("Plaintext:" + Plaintext); // 2A329740CE15F549BE64190B183A5BE2 Long End = Tanggal baru (). GetTime (); System.out.println (end-begin); }}PS: Teman yang tertarik dengan enkripsi dan dekripsi juga dapat merujuk pada alat online dari situs ini:
Deteksi Online Keamanan Kata Sandi:
http://tools.vevb.com/password/my_password_safe
Generator Kata Sandi Kekuatan Tinggi:
http://tools.vevb.com/password/createStrongPassword
Alat enkripsi/dekripsi URL Tornado, dan Tornado:
http://tools.vevb.com/password/urlrethunder
Alat Enkripsi Algoritma Hash/Hash Online:
http://tools.vevb.com/password/hash_encrypt
Online MD5/Hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160 Alat Enkripsi:
http://tools.vevb.com/password/hash_md5_sha
Online SHA1/SHA224/SHA256/SHA384/SHA512 Alat Enkripsi:
http://tools.vevb.com/password/sha_encode
Saya harap artikel ini akan membantu pemrograman Java semua orang.