• [정보보호개론] 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.

    반응형

    댓글