본문으로 바로가기

목차

    0. AES 암호화 들어가기 전에

    AES 알고리즘

    0.1. AES(Advanced Encryption Standard) 암호화란?

    DES의 안전성에 대해 여러 가지 공격 방법들이 발표되며 미국의 NIST 기관에서 고안한 암호 알고리즘입니다.
    - AES 암호 알고리즘은 DES를 대체한 암호 알고리즘이며 암호화와 복호화 과정에서 동일한 키를 사용하는 대칭 키 알고리즘입니다.

    - AES는 대입 치환 SPN(Substitution-Permutation Network)을 사용하여 암호화하는 방법이고 전체 bit를 암호화하는 방식을 사용합니다.

    - 128비트 암호화 블록, 다양한 키의 길이(128/192/256 비트)를 갖춘 대칭형 암호 알고리즘입니다.

    - AES-128, AES-192, AES-256(키의 길이 16byte, 24byte, 32byte)

    - 사용하는 키에 따라 실행하는 라운드 수가 다릅니다. 

      (128bit 키 사용 시에는 10라운드, 192bit에서는 12라운드, 256bit에서는 14라운드를 실행합니다.)

    0.2. 대칭키 암호 알고리즘

    하나의 키로 암호화와 복호화를 모두 수행하는 것을 말합니다.
    - 암호문을 작성할 때 사용하는 암호키와 암호문을 해독할 때 사용하는 해독 키가 같습니다. 따라서 이 키는 절대로 외부에 유출되지 않도록 관리해야 하여 비밀키(Secret Key)라고 부릅니다.
    - 암호화와 복호화에 쓰이는 키 크기가 상대적으로 작고 암호 알고리즘 내부 구조가 단순하여, 시스템 개발 환경에 용이하고, 비대칭키에 비해 암호화와 복호화 속도가 빠릅니다.
    - 교환 당사자간에 동일한 키를 공유해야 하기 때문에 키 관리의 어려움이 있고, 잦은 키 변경이 있는 경우에 불편함을 초래합니다. 

    0.3. 준비하기

    - 암호화에 Java 기본 라이브러리(javax.crypto.spec.SecretKeySpec, javax.crypto.spec.IvParameterSpec, javax.crypto.Cipher)를 사용합니다.

    - 필자의 자바 환경: java-1.8.0-openjdk-1.8.0.242

    - 암호화 한 값을 출력(인코딩)을 위해 Apache Commons 라이브러리를 사용합니다(다운로드 필요!).

     

    프로젝트 자바 추가, 변경 및 적용을 모를 경우 아래의 링크를 참조해주세요.

     

    [Spring] STS 4 (Spring Tool Suite 4) JRE 변경 (installed JREs) - JDK 변경, 추가

    목차 0. 설정에 들어가기 전에 - JRE 란? : Java Runtime Environment : 자바로 만들어진 프로그램을 실행시켜주는 환경을 구성해주는 도구입니다. - JDK 란? : Java Development Kit : JRE와 Java 바이트코드..

    veneas.tistory.com

     

    [Spring] STS 4 (Spring Tool Suite 4) 프로젝트 자바 버전 변경하기 - Windows 10

    목차 0. 설정에 들어가기 전에 - 개발할 환경의 JDK를 추가, 변경하지 않았다면 아래의 링크를 참고하세요. (JDK,JRE를 변경 및 추가했다는 가정하에 아래의 설정이 진행됩니다.) [Spring] STS 4 (Spring Too

    veneas.tistory.com

    Apache Commons 라이브러리 링크: http://mvnrepository.com/artifact/commons-codec/commons-codec/1.9

    프로젝트에 다운로드한 라이브러리 추가하기

     

    [Eclipse] 프로젝트에 jar 파일 추가하는 방법 (자바 라이브러리 추가)

    목차 0. jar파일 이란? - JAR(Java Archive, 자바 아카이브)는 여러 개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스(텍스트, 그림 등) 및 메타데이터를 하나의 파일로 모아서 자바 플랫폼

    veneas.tistory.com


    1. AES 암호화 알고리즘(설명)

    - AES 암호화에 들어가기 전에 필요한 설명들을 기술하였습니다. 소스만 보실 경우엔 2번 항목을 보시면 됩니다.

    1.1. AES 암호화에 필요한 요소

    - AES 암호화에 필요한 요소로는 비밀키, 블록 암호 운용 방식, 패딩 기법이 있습니다.

    1.1.1 비밀키, 대칭키(Secret Key)

    비밀키는 평문(plain text)을 암호화하는 데 사용되며 사용자 외에는 절대로 외부에 노출되어서는 안 됩니다.

    AES의 종류가 무엇이냐에 따라 비밀키의 길이가 달라지게 됩니다.

      - AES128 : 키값 16 bytes(128bit)
      - AES192 : 키값 24 bytes(192bit)
      - AES256 : 키값 32 bytes(256bit)

    1.1.2. 블록 암호 운용 방식(Block Cipher Mode)

    - 블록 암호란 평문을 일정한 크기의 블록으로 잘라낸 후 각 블록을 암호화하는 방식입니다. 만약 암호화하려는 정보가 블록의 길이보다 길 경우에는 특정한 운용 모드가 사용된다. (ECB, CBC, OFB, CFB, CTR... )

    - 블록들을 어떻게 암호화할지 정해야 하는데, 이때 블록들의 암호화 방식을 운용 방식이라 부릅니다.

    - 메시지의 길이가 n비트보다 작다면 n비트 블록을 만들기 위해 패딩(padding)이 추가됩니다.

    - 블록 암호 구조에는 Feistel구조SPN구조가 있습니다. (Feistel구조 = DES, SPN = AES)

     

    1. ECB(electronic codebook) mode

     

    ECB mode

    - 운용 방식 중 가장 간단한 구조를 가지며, 암호화하려는 메시지를 여러 블록으로 나누어 각 블록을 독립적으로 암호화하는 방식입니다. 

    - 장점은 각 블록을 독립적으로 암호화를 하는 방식은 간단하고 병렬 처리를 할 수 있다는 장점이 있습니다.

    - 취약점은 키가 고정되어있을 경우 평문 내에서 동일한 블록들은 암호화한 결과 또한 동일하다입니다.  

    - 한 개의 블록만 해독되면 나머지 블록도 해독이 되는 단점을 가지고 있습니다.

      (만약 암호화 메시지를 여러 부분으로 나누었을 때 두 블록이 같은 값을 가진다면, 암호화한 결과 역시 같습니다. 반복 공격에 취약한 성질을 가집니다.)

    - 일반적인 파일에서는 이 취약점이 큰 의미가 없지만, bmp 파일에서는 이 취약점으로 인해 그림의 배경과 피사체를 구분할 수 있게 될 수도 있습니다. 

    - Replay Attack에 취약

     

    2. CBC(cipher-block chaining) mode

     

    CBC mode


    IV로 인해 같은 평문도 암호문이 다르게 생성 됨

    - 암호 블록체인(CBC) 방식은 1976년 IBM에 의해 개발되었습니다.

    - 평문의 각 블록은 XOR연산을 통해 이전 암호문과 연산되고 첫 번째 암호문에 대해서는 이전 블록이 없기 때문에 IV(Initial Vector)가 암호문 대신 사용됩니다. 이때, IV는 제2의 키가 될 수 있습니다.

    - CBC 방식은 현재 널리 사용되는 운용 방식 중 하나이다. 

    - AES/CBC 방식 같은 경우 128비트의 고정된 블록 단위로 암호화를 수행하게 되는데, CBC mode는 이전에 암호화했던 블록과 XOR 연산을 한 다음에 암호화를 수행합니다. 그런데 첫 블록은 이전 암호화 블록이 없기 때문에 이를 위해 IV(initializatidon vector)를 이용합니다. AES는 128비트(16바이트) 단위로 암호화하기 때문에 IV의 크기도 16바이트 크기가 필요합니다. 따라서 매번 다른 IV를 생성하면 같은 평문이라도 다른 암호문을 생성할 수 있습니다.

    - IV는 암호를 복호화할 사람에게 미리 제공되어야 하고 키와 달리 공개되어도 상관없습니다. 미리 송신자와 수신자 간에 IV를 어떤 것으로 사용할지 정해두거나 파일에 IV를 기록해두는 방식으로 IV를 공유합니다.

    - Bit-flipping Attack에 취약합니다.

    1.1.3. 패딩 기법(padding)

    - 블록 암호화를 진행하기 위해서는 패딩 기법이 필요한데 패딩 기법이란 데이터를 특정 크기로 맞추기 위해서, 특정 크기보다 부족한 부분의 공간을 의미 없는 문자들로 채워서 비트수를 맞추는 것입니다.

    - AES는 128비트의 블록단위로 암호화를 수행하는데 128비트보다 작은 블록이 생길 경우 부족한 부분을 특정 값으로 채워야 합니다. 이러한 작업을 패딩이라고 하며 대표적으로 PKCS5PKCS7 방식이 있습니다.

     

    1. PKCS#5 Padding

    - PKCS#5는 암호 블록 사이즈가 8바이트에 맞춰져 있습니다.

    - 예시
      1) 1바이트 데이터 + 7바이트 패딩
          AA __ __ __ __ __ __ __

       = 블록의 크기만큼 맞추려면 7바이트가 부족하므로 07을 7번 패딩 합니다.

    AA 07 07 07 07 07 07 07

      2) 2바이트 데이터 + 6바이트 패딩
          AA BB __ __ __ __ __ __

      = 블록의 크기만큼 맞출려면 6바이트가 부족하므로 06을 6번 패딩 합니다.

    AA BB 06 06 06 06 06 06

      3) 원본 데이터 길이가 블록의 배수인 경우(블록 크기가 8이라면 8의 배수 = 8, 16, 24,...)

          AA BB CC DD EE FF GG HH

      = 8바이트가 블록일 경우 원본 데이터 길이가 8의 배수인 경우 뒤에 08을 8번 패딩 합니다.

    AA BB CC DD EE FF GG HH
    08 08 08 08 08 08 08 08

     

    2. PKCS#7 Padding

    - AES 같은 현대적인 암호화 알고리즘은 128, 192, 256 같은 훨씬 더 긴 길이의 키를 사용하며 블록 크기도 8byte가 아닌 16 bytes를 사용하므로 나오게 된 표준입니다.

    - PKCS#5의 확장 개념으로 개수만 늘어났을 뿐 방식은 PKCS#5와 같으며 PKCS#7이 8바이트 사이즈를 가질 때 PKCS#5와 동일합니다.

    - PKCS#7는 암호 블록 사이즈가 최대 16바이트까지 가능합니다.

    - PKCS#7은 패딩이 최대 [10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10] 16개까지 가능합니다.

    - 128비트(16바이트) 이상의 블록 암호화 알고리즘들이 속속 발표되면서 이에 따른 패딩 방식에 대한 표준입니다.

    - PKCS#5는 8바이트 고정길이, PKCS#7은 1~255바이트의 가변 길이입니다.

    ★ 자바에서는 패딩 방식을 입력할 때 PKCS#5와 PKCS#7을 구분하지 않고 PKCS5 Padding이라고 입력한다.

    1.2. AES 암호화에 필요한 자바 클래스

    - javax.crypto.spec.SecretKeySpec: 비밀키를 만들기 위해 사용합니다.
    - javax.crypto.spec.IvParameterSpec: CBC 모드의 IV를 만들기 위해 사용합니다.
    - org.apache.commons.codec.binary.Hex(Base64): Hex Base64 Encode Decode를 위해 사용합니다.(다운로드 필요!)
    - javax.crypto.Cipher: 자바에서 암호화, 복호화 기능을 제공하는 Cipher 클래스입니다.

     

    SecretKeySpec 비밀키 생성

    private SecretKeySpec secretKey;
    private IvParameterSpec IV;
    
    //SecretKey
    this.secretKey = new SecretKeySpec(reqSecretKey.getBytes("UTF-8"), "AES");
    
    //IV
    this.IV = new IvParameterSpec(iv.getBytes());

     

    Cipher 객체 인스턴스화

    Cipher 객체를 인스턴스화 하기 위해서는 static getInstance 메서드를 호출하고, 원하는 변환 형태의 이름을 전달합니다.

    //Cipher 객체 인스턴스화
    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");

     

    Cipher 초기화(Initialization)

    Cipher 객체를 초기화하기 위해서 키 또는 증명서(Certificate) 그리고 Cipher의 작동 모드를 나타내는 opmode와 함께 init() 메서드를 호출

     

    이용 가능한 cipher 작업 모드 목록
      : ENCRYPT_MODE: cipher 객체를 암호화 모드로 초기화한다. 
      : DECRYPT_MODE: cipher 객체를 복호화 모드로 초기화한다. 
      : WRAP_MODE: cipher 객체를 key-wrapping 모드로 초기화한다. 
      : UNWRAP_MODE: cipher 객체를  key-unwrapping 모드로 초기화한다.

    //Cipher 객체 인스턴스화(Java에서는 PKCS#5 = PKCS#7이랑 동일)
    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
    
    //Cipher 객체 초기화(암호화)
    c.init(Cipher.ENCRYPT_MODE, secretKey, IV);
    //Cipher 객체 인스턴스화(Java에서는 PKCS#5 = PKCS#7이랑 동일)
    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
    
    //Cipher 객체 초기화(복호화)
    c.init(Cipher.DECRYPT_MODE, secretKey, IV);

    Encrpytion/Decryption doFinal()

    Cipher 객체를 초기화한 후에, 암호화 또는 복호화 작업을 위해 doFinal() 메서드를 호출할 수 있습니다.

    해당 메서드는 암호화 또는 복호화된 메시지를 포함한 byte 배열을 반환

    //Cipher 객체 인스턴스화(Java에서는 PKCS#5 = PKCS#7이랑 동일)
    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
    
    //Cipher 객체 초기화(암호화)
    c.init(Cipher.ENCRYPT_MODE, secretKey, IV);
    
    //Encrpytion/Decryption
    byte[] encrypted = c.doFinal(plainText.getBytes("UTF-8"));
    
    //Hex Encode(Hex로 인코딩 한 경우)
    String encryptedString = Hex.encodeHexString(encrypted);
    //Cipher 객체 인스턴스화(Java에서는 PKCS#5 = PKCS#7이랑 동일)
    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
    
    //Cipher 객체 초기화(복호화)
    c.init(Cipher.DECRYPT_MODE, secretKey, IV);
    
    //Decode Hex(Hex로 인코딩 한 경우)
    byte[] decodeHexByte = Hex.decodeHex(encodeText.toCharArray());
    
    //Encrpytion/Decryption
    String DecryString = new String(c.doFinal(decodeHexByte), "UTF-8");

     


    2. AES 암호화 알고리즘(Java Source)

    - 키 값의 길이에 따라 AES-128, AES-192, AES-256으로 분류됩니다. 

      - AES-128 : 키값 16 bytes(128bit)
      - AES-192 : 키값 24 bytes(192bit)
      - AES-256 : 키값 32 bytes(256bit)

    2.1. AES/ECB/PKCS5 Padding

    - 취약점이 많기 때문에 CBC모드의 사용을 추천합니다.

    import java.io.UnsupportedEncodingException;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
    import org.apache.commons.codec.DecoderException;
    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.codec.binary.Hex;
    
    public class AesClass {
    
    	private SecretKeySpec secretKey;
    
    	public AesClass(String reqSecretKey) throws UnsupportedEncodingException, NoSuchAlgorithmException {
    		
    		//바이트 배열로부터 SecretKey를 구축
    		this.secretKey = new SecretKeySpec(reqSecretKey.getBytes("UTF-8"), "AES");
    	}
    	
    
        //AES ECB PKCS5Padding 암호화(Hex | Base64)
       	public String AesECBEncode(String plainText) throws Exception {
    		
    		//Cipher 객체 인스턴스화(Java에서는 PKCS#5 = PKCS#7이랑 동일)
    		Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
    		
    		//Cipher 객체 초기화
    		c.init(Cipher.ENCRYPT_MODE, secretKey);
    		
    		//Encrpytion/Decryption
    		byte[] encrpytionByte = c.doFinal(plainText.getBytes("UTF-8"));
    		
    		//Hex Encode
    		return Hex.encodeHexString(encrpytionByte);
    		
    		//Base64 Encode
    //		return Base64.encodeBase64String(encrpytionByte);
    	}
    
    
        //AES ECB PKCS5Padding 복호화(Hex | Base64)
    	public String AesECBDecode(String encodeText) throws Exception {
    
    		//Cipher 객체 인스턴스화(Java에서는 PKCS#5 = PKCS#7이랑 동일)
    		Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
    		
    		//Cipher 객체 초기화
    		c.init(Cipher.DECRYPT_MODE, secretKey);
    		
    		//Decode Hex
    		byte[] decodeByte = Hex.decodeHex(encodeText.toCharArray());
    		
    		//Decode Base64
    //		byte[] decodeByte = Base64.decodeBase64(encodeText);
    		
    		return new String(c.doFinal(decodeByte), "UTF-8");
    	}
    	
    	public static void main(String[] args) throws Exception {
    		
    		/*
    		 * 키 값의 바이트 수에 따라서 달라집니다.
    		 * AES128 : 키값 16bytes
    		 * AES192 : 키값 24bytes
    		 * AES256 : 키값 32bytes 
    		 */
    		
    		String plainText = "AesPlainText";
    		
    		String key_128 = "aeskey1234567898";//AES-128는 128비트(16바이트)의 키
    		String key_192 = "aeskey12345678987654321a";//AES-192는 192비트(24바이트)의 키
    		String key_256 = "aeskey12345678987654321asekey987";//AES-256는 256비트(32바이트)의 키
    		
    		String iv = "aesiv12345678912";
    		
    		AesClass ase_128_ecb = new AesClass(key_128);
    		String aes128EcbEncode = ase_128_ecb.AesECBEncode(plainText);
    		String aes128EcbDeocde = ase_128_ecb.AesECBDecode(aes128EcbEncode);
    		
    		AesClass ase_192_ecb = new AesClass(key_192);
    		String aes192EcbEncode = ase_192_ecb.AesECBEncode(plainText);
    		String aes192EcbDeocde = ase_192_ecb.AesECBDecode(aes192EcbEncode);
    		
    		AesClass ase_256_ecb = new AesClass(key_256);
    		String aes256EcbEncode = ase_256_ecb.AesECBEncode(plainText);
    		String aes256EcbDeocde = ase_256_ecb.AesECBDecode(aes256EcbEncode);
    
    		System.out.println("plainText: " + plainText);			
    		System.out.println();
    		System.out.println("Aes128 Encode ECB: " + aes128EcbEncode);			
    		System.out.println("Aes128 Decode ECB: " + aes128EcbDeocde);			
    		System.out.println();
    		System.out.println("Aes192 Encode ECB: " + aes192EcbEncode);			
    		System.out.println("Aes192 Decode ECB: " + aes192EcbDeocde);			
    		System.out.println();
    		System.out.println("Aes256 Encode ECB: " + aes256EcbEncode);			
    		System.out.println("Aes256 Decode ECB: " + aes256EcbDeocde);					
    
    	}
    
    }

    결괏값

    더보기

    plainText: AesPlainText

    Aes128 Encode ECB: e2f110480949c1bcf4ace2a52ade2eca
    Aes128 Decode ECB: AesPlainText

    Aes192 Encode ECB: cc77534f459b685264708236affb5e9c
    Aes192 Decode ECB: AesPlainText

    Aes256 Encode ECB: d0179bb031cf2405bb53b2d231941b3c
    Aes256 Decode ECB: AesPlainText

    2.2. AES/CBC/PKCS5 Padding

    import java.io.UnsupportedEncodingException;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
    import org.apache.commons.codec.DecoderException;
    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.codec.binary.Hex;
    
    public class AesClass {
    
    	private SecretKeySpec secretKey;
    	private IvParameterSpec IV;
    	
    	public AesClass(String reqSecretKey, String iv) throws UnsupportedEncodingException, NoSuchAlgorithmException {
    		
    		//바이트 배열로부터 SecretKey를 구축
    		this.secretKey = new SecretKeySpec(reqSecretKey.getBytes("UTF-8"), "AES");
    		//this.IV = new IvParameterSpec(reqSecretKey.substring(0,16).getBytes());
    		this.IV = new IvParameterSpec(iv.getBytes());
    	}
    	
        //AES CBC PKCS5Padding 암호화(Hex | Base64)
    	public String AesCBCEncode(String plainText) throws Exception {
    		
    		//Cipher 객체 인스턴스화(Java에서는 PKCS#5 = PKCS#7이랑 동일)
    		Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
    		
    		//Cipher 객체 초기화
    		c.init(Cipher.ENCRYPT_MODE, secretKey, IV);
    		
    		//Encrpytion/Decryption
    		byte[] encrpytionByte = c.doFinal(plainText.getBytes("UTF-8"));
    		
    		//Hex Encode
    		return Hex.encodeHexString(encrpytionByte);
    		
    		//Base64 Encode
    //		return Base64.encodeBase64String(encrpytionByte);
    	}
    
    	//AES CBC PKCS5Padding 복호화(Hex | Base64)
    	public String AesCBCDecode(String encodeText) throws Exception {
    
    		//Cipher 객체 인스턴스화(Java에서는 PKCS#5 = PKCS#7이랑 동일)
    		Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
    		
    		//Cipher 객체 초기화
    		c.init(Cipher.DECRYPT_MODE, secretKey, IV);
    		
    		//Decode Hex
    		byte[] decodeByte = Hex.decodeHex(encodeText.toCharArray());
    		
    		//Decode Base64
    //		byte[] decodeByte = Base64.decodeBase64(encodeText);
    		
    		//Encrpytion/Decryption
    		return new String(c.doFinal(decodeByte), "UTF-8");
    	}
    
    	public static void main(String[] args) throws Exception {
    		
    		/*
    		 * 키 값의 바이트 수에 따라서 달라집니다.
    		 * AES128 : 키값 16bytes
    		 * AES192 : 키값 24bytes
    		 * AES256 : 키값 32bytes 
    		 */
    		
    		String plainText = "AesPlainText";
    		
    		String key_128 = "aeskey1234567898";//AES-128는 128비트(16바이트)의 키
    		String key_192 = "aeskey12345678987654321a";//AES-192는 192비트(24바이트)의 키
    		String key_256 = "aeskey12345678987654321asekey987";//AES-256는 256비트(32바이트)의 키
    		
    		String iv = "aesiv12345678912";
    		
    		AesClass ase_128_cbc = new AesClass(key_128, iv);
    		String aes128CbcEncode = ase_128_cbc.AesCBCEncode(plainText);
    		String aes128CbcDeocde = ase_128_cbc.AesCBCDecode(aes128CbcEncode);
    		
    		AesClass ase_192_cbc = new AesClass(key_192, iv);
    		String aes192CbcEncode = ase_192_cbc.AesCBCEncode(plainText);
    		String aes192CbcDeocde = ase_192_cbc.AesCBCDecode(aes192CbcEncode);
    		
    		AesClass ase_256_cbc = new AesClass(key_256, iv);
    		String aes256CbcEncode = ase_256_cbc.AesCBCEncode(plainText);
    		String aes256CbcDeocde = ase_256_cbc.AesCBCDecode(aes256CbcEncode);
    
    		System.out.println("plainText: " + plainText);			
    		System.out.println();
    		System.out.println("Aes128 Encode CBC: " + aes128CbcEncode);			
    		System.out.println("Aes128 Decode CBC: " + aes128CbcDeocde);			
    		System.out.println();
    		System.out.println("Aes192 Encode CBC: " + aes192CbcEncode);			
    		System.out.println("Aes192 Decode CBC: " + aes192CbcDeocde);			
    		System.out.println();
    		System.out.println("Aes256 Encode CBC: " + aes256CbcEncode);			
    		System.out.println("Aes256 Decode CBC: " + aes256CbcDeocde);			
    
    	}
    
    }

    결괏값

    더보기

    plainText: AesPlainText

    Aes128 Encode CBC: 11cf26b3ed8282f8e115c280d6476feb
    Aes128 Decode CBC: AesPlainText

    Aes192 Encode CBC: 49174abd8cd62045566242811d63d279
    Aes192 Decode CBC: AesPlainText

    Aes256 Encode CBC: b187324cd0ace2df5d1faafbde6777bd
    Aes256 Decode CBC: AesPlainText