Bagaimana cara saya menggunakan penyulitan/penyahsulitan 3DES dalam Java tanpa pengekodan Base64?
Isu:
Kod Java pengguna untuk penyulitan dan penyahsulitan 3DES gagal menyahsulit data dikodkan kembali kepada rentetan asal. Walaupun mengalih keluar pengekodan dan penyahkodan Base64, kod itu masih menghadapi masalah.
Penyelesaian:
Setelah menyemak kod yang disediakan, nampaknya ralat mungkin tidak terletak pada Base64 pengekodan atau proses penyahkodan tetapi sebaliknya dalam pengendalian output tatasusunan bait daripada penyulitan proses.
Kod Disemak:
Kod yang disemak berikut termasuk pembersihan kecil dan memaparkan "kyle boon" dengan betul sebagai rentetan yang dinyahkod:
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); 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[] plainText = decipher.doFinal(message); return new String(plainText, "UTF-8"); } }
Atas ialah kandungan terperinci Mengapakah kod penyulitan/penyahsulitan Java 3DES saya gagal menyahsulit data yang dikodkan kembali kepada rentetan asal walaupun selepas mengalih keluar pengekodan dan penyahkodan Base64?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!