-
[정보보호개론] Java로 AES 복호화 프로그램 만들기Study/Java 2021. 4. 2. 15:16반응형
문제
1. BASE64로 인코딩된 key값, iv값, 암호화된 문자열 ciphertext가 주어졌습니다.
2. 주어진 코드
key : 8iE3bf1se6N76HGPP8S0Xw==
iv : cHml3oX848/0uBwDJtChOA==
ciphertext : QDr9NZNG9Bgc3TTnfRuqjjzf/kVSYwbP7F9mR4GQZ/IneIh7HTc/xnwzEeVBcH3pPlIbLFySKZruedJc9X87CGNDJ1f2Dat8BR3Ypbei5Q42xc306/AkSuGsjfqbX9/ELxmdKn7MyvY/Jbc0v0AJHV6odgNzygKRRrFJcUIF/50=3. 암호화 모드는 AES/CBC/PKCS5PADDING 입니다.
4. 위 정보를 가지고 Plain Text를 구해야 합니다.
문제풀이방법
이 문제를 풀기 위해서는 주어진 코드가 BASE64로 인코딩 되어있다는 점을 알아야 합니다.
따라서 주어진 코드를 전부 BASE64로 디코딩 한 후, AES/CBC/PKCS5PADDING에 맞게 디코딩을 한번 더 하시면 됩니다.
구현한 코드
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.util.Base64; import java.util.Base64.Decoder; public class AES { public void run() throws Exception { String key = "8iE3bf1se6N76HGPP8S0Xw=="; String iv = "cHml3oX848/0uBwDJtChOA=="; String c = "QDr9NZNG9Bgc3TTnfRuqjjzf/kVSYwbP7F9mR4GQZ/IneIh7HTc/xnwzEeVBcH3pPlIbLFySKZruedJc9X87CGNDJ1f2Dat8BR3Ypbei5Q42xc306/AkSuGsjfqbX9/ELxmdKn7MyvY/Jbc0v0AJHV6odgNzygKRRrFJcUIF/50="; //bytes로 변환 byte[] byteKey = key.getBytes(); byte[] byteIv = iv.getBytes(); byte[] byteC = c.getBytes(); //bytes에서 base64로 디코딩 byte[] decodedByteKey = base64Decode(byteKey); byte[] decodedByteIv = base64Decode(byteIv); byte[] decodedByteC = base64Decode(byteC); //base64로 디코딩된 bytes들을 decode 메소드로 넘겨주고 결과값을 answer로 받음 String answer = decode(decodedByteC, decodedByteKey, decodedByteIv); System.out.println(answer); } public byte[] base64Decode(byte[] bytes) { //base64로 변환해주는 메소드 Decoder decoder = Base64.getDecoder(); byte[] decodedBytes = decoder.decode(bytes); return decodedBytes; } public String decode(byte[] decodedByteC ,byte[] decodedByteKey, byte[] decodedByteIv) throws Exception{ //c를 디코드 하기 위한 메소드 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); //cipher 모드 설정 SecretKeySpec key = new SecretKeySpec(decodedByteKey, "AES"); //cipher에 사용할 key 생성 IvParameterSpec iv = new IvParameterSpec(decodedByteIv); //cipher에 사용할 iv 생성 cipher.init(Cipher.DECRYPT_MODE, key, iv); //cipher에 key와 iv, 모드 넣고 초기화 String decodedString = new String(cipher.doFinal(decodedByteC)); //디코딩할 문장 넣고 return 받기 return decodedString; //플레인 텍스트 } public static void main(String[] args) throws Exception { AES aes = new AES(); aes.run(); } }
정답 (Plain Text)
Hello world of AES encryption. A secret between two is a secret of God; a secret among three is everybody's secret.
반응형'Study > Java' 카테고리의 다른 글
[정보보호개론] Java로 RSA 암호문 해독하기 (RSA 복호화) (0) 2021.04.07 [Java] 클래스 메소드 vs 인스턴스 메소드 (자바 static 관련) (0) 2021.02.23 [Java] main메소드에서 "Cannot make a static reference to the non-static method run() from the type main" 오류 해결법 (0) 2020.12.08 [Java] 자바 스윙 JTextField 꾸미기 (0) 2020.12.08 [Java] 자바 스윙 JButton 꾸미기 (둥근 버튼) (10) 2020.11.21