문제:
3DES 암호화를 사용하여 문자열을 암호화하고 해독할 수 없습니다. 코드 구현 시 반복되는 오류로 인해 발생합니다.
해결 방법:
문제를 해결하려면 제공된 코드를 분석해 보겠습니다.
public class TripleDESTest { // ... public byte[] encrypt(String message) { // ... final byte[] plainTextBytes = message.getBytes("utf-8"); final byte[] cipherText = cipher.doFinal(plainTextBytes); final String encodedCipherText = new sun.misc.BASE64Encoder().encode(cipherText); return cipherText; } // ... }
Base64 인코딩 오해:
처음에는 코드에 final String encodeCipherText = new sun.misc.BASE64Encoder().encode(cipherText); 줄이 포함되었습니다. Base64에서는 암호문을 반환하기 전에 인코딩합니다. 그러나 복호화 방법에서는 Base64 인코딩이 사용되지 않았기 때문에 암호문은 바이트 배열로 직접 반환되어야 합니다.
원시 바이트 배열 인쇄:
코드는 암호화된 데이터와 해독된 데이터를 모두 바이트 배열로 인쇄합니다. System.out.println(codedtext); 및 System.out.println(decodedtext);. 바이트 배열은 사람이 읽을 수 있는 값으로 렌더링되지 않으므로 의미 있는 출력을 제공하지 않습니다. 실제 복호화된 텍스트를 표시하려면 new String(plainText, "UTF-8")을 사용하여 문자열로 변환하세요.
수정된 코드:
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(decodedtext); } 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"); } }
위 내용은 Java 3DES 암호화/암호 해독이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!