Java에서 3DES 암호화 및 복호화 사용하기
현대 애플리케이션은 종종 민감한 데이터를 안전하게 처리할 수 있는 방법이 필요합니다. 여러분이 마주할 수 있는 인기 있는 암호화 알고리즘 중 하나는 3DES (Triple Data Encryption Standard)입니다. Java에서 3DES를 사용하여 문자열을 암호화 및 복호화하려고 할 때, 개발자들 사이에서 흔히 발생하는 문제인, 메시지를 원래 형태로 복호화할 수 없는 상황을 겪을 수 있습니다. 이 포스트에서는 Java에서 3DES 암호화 및 복호화를 올바르게 사용하는 방법을 이해하는 데 도움을 드립니다.
문제
어떤 문자열을 암호화하는 코드, 예를 들어 “kyle boon” 문자열을 암호화하는 코드를 작성했다고 가정해 보세요. 암호화 메소드를 실행한 후 그 결과를 디코딩하려고 하지만 원래 문자열을 다시 얻지 못합니다. 많은 개발자들이 비슷한 어려움에 직면하는데, 이는 종종 바이트 배열을 잘못 처리하거나 코드에서 중요한 단계를 생략하기 때문입니다.
한 개발자는 이렇게 말했습니다: “Java에서 3DES를 사용하여 문자열을 인코딩하는 모든 메소드는 원래 문자열로 복호화할 수 없습니다.” 이 흔한 실수는 대개 바이트 배열과 문자열 표현 방식에 대한 오해에서 비롯됩니다.
해결책
Java에서 3DES 암호화 및 복호화의 간단하고 수정된 구현을 살펴보겠습니다. 이 코드를 사용하면 텍스트 입력을 암호화하고 원래 텍스트로 쉽게 복호화할 수 있습니다.
단계별 코드 설명
-
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;
-
클래스 정의:
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); System.out.println(decodedtext); // "kyle boon" }
-
암호화 메소드: 이 메소드는 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); }
-
복호화 메소드: 이 메소드는 암호화 과정을 되돌립니다:
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 암호화 및 복호화를 사용하기 위한 명확하고 효과적인 접근 방식을 갖추게 되었습니다. 위의 설명과 코드 스니펫을 따르면 이 강력한 암호화 방법을 성공적으로 구현할 수 있습니다.