Java에서 3DES 암호화 및 복호화 사용하기

현대 애플리케이션은 종종 민감한 데이터를 안전하게 처리할 수 있는 방법이 필요합니다. 여러분이 마주할 수 있는 인기 있는 암호화 알고리즘 중 하나는 3DES (Triple Data Encryption Standard)입니다. Java에서 3DES를 사용하여 문자열을 암호화 및 복호화하려고 할 때, 개발자들 사이에서 흔히 발생하는 문제인, 메시지를 원래 형태로 복호화할 수 없는 상황을 겪을 수 있습니다. 이 포스트에서는 Java에서 3DES 암호화 및 복호화를 올바르게 사용하는 방법을 이해하는 데 도움을 드립니다.

문제

어떤 문자열을 암호화하는 코드, 예를 들어 “kyle boon” 문자열을 암호화하는 코드를 작성했다고 가정해 보세요. 암호화 메소드를 실행한 후 그 결과를 디코딩하려고 하지만 원래 문자열을 다시 얻지 못합니다. 많은 개발자들이 비슷한 어려움에 직면하는데, 이는 종종 바이트 배열을 잘못 처리하거나 코드에서 중요한 단계를 생략하기 때문입니다.

한 개발자는 이렇게 말했습니다: “Java에서 3DES를 사용하여 문자열을 인코딩하는 모든 메소드는 원래 문자열로 복호화할 수 없습니다.” 이 흔한 실수는 대개 바이트 배열과 문자열 표현 방식에 대한 오해에서 비롯됩니다.

해결책

Java에서 3DES 암호화 및 복호화의 간단하고 수정된 구현을 살펴보겠습니다. 이 코드를 사용하면 텍스트 입력을 암호화하고 원래 텍스트로 쉽게 복호화할 수 있습니다.

단계별 코드 설명

  1. Import:

    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;
    
  2. 클래스 정의:

    public class TripleDESTest {
    
  3. 메인 메소드: 메인 메소드에서는 먼저 암호화할 텍스트를 정의합니다.

    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);
        System.out.println(decodedtext); // "kyle boon"
    }
    
  4. 암호화 메소드: 이 메소드는 3DES 알고리즘을 사용하여 입력 메시지를 암호화합니다:

    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");
        return cipher.doFinal(plainTextBytes);
    }
    
  5. 복호화 메소드: 이 메소드는 암호화 과정을 되돌립니다:

    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"); // 바이트 배열을 문자열로 변환
    }
    

주요 사항

  • 바이트 배열을 올바르게 처리: 복호화할 때 new String(plainText, "UTF-8")를 사용하여 바이트 배열을 문자열로 변환하는 것을 확인하세요. 이 방법은 toString()을 호출하는 것보다 유용하며, 쓰레기 출력을 방지할 수 있습니다.

  • Base64 인코딩: 암호화된 바이트 배열을 텍스트 매체를 통해 전송할 계획이 있다면 Base64 인코딩을 사용하는 것이 좋습니다. 복호화 시에 올바르게 디코딩하는 것도 중요합니다.

  • 예외 처리: 이 코드는 다양한 암호화 오류를 처리하기 위한 예외 처리를 포함하고 있어, 코드를 더욱 견고하게 만들어 줍니다.

이제 여러분은 Java 애플리케이션에서 3DES 암호화 및 복호화를 사용하기 위한 명확하고 효과적인 접근 방식을 갖추게 되었습니다. 위의 설명과 코드 스니펫을 따르면 이 강력한 암호화 방법을 성공적으로 구현할 수 있습니다.