> Java > java지도 시간 > 본문

Java 3DES 암호화/암호 해독이 실패하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-11 00:18:02
원래의
512명이 탐색했습니다.

Why Is My Java 3DES Encryption/Decryption Failing?

Java에서 3DES 암호화/암호 해독 문제 해결

문제:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿