Rumah >Java >javaTutorial >Mengapa penyulitan dan penyahsulitan 3DES di Jawa biasanya gagal menyahsulit teks sifir kembali kepada rentetan asal, dan bagaimana isu ini boleh diselesaikan?
Biasanya, masalah biasa berlaku apabila menggunakan 3DES untuk menyulitkan dan menyahsulit rentetan dalam Java, mengakibatkan ketidakupayaan untuk berjaya menyahsulit teks sifir Kembalikan rentetan asal. Artikel ini menyediakan contoh kod ringkas yang boleh menyulitkan dan menyahsulit rentetan dan memulihkannya kepada rentetan asal.
Dalam soalan asal, kod yang diberikan mempunyai ralat berikut:
Kod yang diperbetulkan adalah seperti berikut:
import java.security.MessageDigest; import java.util.Arrays; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class TripleDESTest { public static void main(String[] args) throws Exception { String text = "kyle boon"; byte[] codedtext = new TripleDESTest().encrypt(text); String decodedtext = new TripleDESTest().decrypt(codedtext); System.out.println(codedtext); // this is a byte array, you'll just see a reference to an array System.out.println(decodedtext); // This correctly shows "kyle boon" } public byte[] encrypt(String message) throws Exception { final MessageDigest md = MessageDigest.getInstance("md5"); final byte[] digestOfPassword = md.digest("HG58YZ3CR9" .getBytes("utf-8")); final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); for (int j = 0, k = 16; j < 8;) { keyBytes[k++] = keyBytes[j++]; } final SecretKey key = new SecretKeySpec(keyBytes, "DESede"); final IvParameterSpec iv = new IvParameterSpec(new byte[8]); final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key, iv); final byte[] plainTextBytes = message.getBytes("utf-8"); final byte[] cipherText = cipher.doFinal(plainTextBytes); final String encodedCipherText = new sun.misc.BASE64Encoder() .encode(cipherText); return cipherText; } public String decrypt(byte[] message) throws Exception { final MessageDigest md = MessageDigest.getInstance("md5"); final byte[] digestOfPassword = md.digest("HG58YZ3CR9" .getBytes("utf-8")); final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); for (int j = 0, k = 16; j < 8;) { keyBytes[k++] = keyBytes[j++]; } final SecretKey key = new SecretKeySpec(keyBytes, "DESede"); final IvParameterSpec iv = new IvParameterSpec(new byte[8]); final Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); decipher.init(Cipher.DECRYPT_MODE, key, iv); final byte[] encData = new sun.misc.BASE64Decoder().decodeBuffer(message); final byte[] plainText = decipher.doFinal(encData); return new String(plainText, "UTF-8"); } }
Selepas menggunakan langkah pengekodan dan penyahkodan Base64 yang betul, kod tersebut boleh berjaya menyulitkan dan menyahsulit rentetan dan memastikan hasil yang didekripsi dipulihkan dengan betul kepada rentetan asal.
Atas ialah kandungan terperinci Mengapa penyulitan dan penyahsulitan 3DES di Jawa biasanya gagal menyahsulit teks sifir kembali kepada rentetan asal, dan bagaimana isu ini boleh diselesaikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!