본문 바로가기

bouncy castle

[bouncy castle] AES ECB (128, 192, 256) example

AES ECB Example

 

128, 192, 256의 의미는 키 길이의 bit수를 의미한다.

128 bit은 16 byte key 길이, 192 bit은 24 byte key 길이, 192 bit은 32 byte key 길이를 의미한다.

 

32 byte block을 암호화 /  복호화하는 예제

 

static byte[] aes_128bit_16byte = "ABCDEFGHIJKLMNOP".getBytes(StandardCharsets.UTF_8);
static byte[] aes_192bit_24byte = "ABCDEFGHIJKLMNOPQRSTUVWX".getBytes(StandardCharsets.UTF_8);
static byte[] aes_256bit_32byte = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef".getBytes(StandardCharsets.UTF_8);


public byte[] aesEcbEncrypt(byte[] key, byte[] text) throws InvalidCipherTextException {
    // create AES cipher
    BlockCipher engine = new AESEngine();
    BufferedBlockCipher cipher = new BufferedBlockCipher(engine);
    // set key
    cipher.init(true, new KeyParameter(key));

    byte[] outBuff = new byte[text.length];
    int offset = cipher.processBytes(text, 0, text.length, outBuff, 0);
    cipher.doFinal(outBuff, offset);

    return outBuff;
}

public byte[] aesEcbDecrypt(byte[] key, byte[] text) throws InvalidCipherTextException {
    // create AES cipher
    BlockCipher engine = new AESEngine();
    BufferedBlockCipher cipher = new BufferedBlockCipher(engine);
    // set key
    cipher.init(false, new KeyParameter(key));

    byte[] outBuff = new byte[text.length];
    int offset = cipher.processBytes(text, 0, text.length, outBuff, 0);
    cipher.doFinal(outBuff, offset);

    return outBuff;
}



void aesEcbExample() throws InvalidCipherTextException {
    byte[] text = "jetbrainintellij".getBytes(StandardCharsets.UTF_8);
    byte[] ret;


    ret = aesEcbEncrypt(aes_128bit_16byte, text);
    ret = aesEcbDecrypt(aes_128bit_16byte, ret);
    System.out.println(new String(ret, StandardCharsets.UTF_8));

    ret = aesEcbEncrypt(aes_192bit_24byte, text);
    ret = aesEcbDecrypt(aes_192bit_24byte, ret);
    System.out.println(new String(ret, StandardCharsets.UTF_8));

    ret = aesEcbEncrypt(aes_256bit_32byte, text);
    ret = aesEcbDecrypt(aes_256bit_32byte, ret);
    System.out.println(new String(ret, StandardCharsets.UTF_8));
}

 

 

 

결과: 각 키 길이별 첫번째 라인은 암호화한 결과, 두번째 라인은 복호화한 결과

// 128 bit 16 byte 
3D:17:A9:21:52:0E:97:5F:22:BD:90:2E:AB:28:E8:BC:A9:1F:C3:E8:AB:5C:69:F8:36:14:A0:F3:1E:80:87:7D
jetbrainintellijpasswordoverflow

// 192 bit 24 byte
F3:18:48:F5:3C:C2:DB:CD:77:AE:06:8B:A2:24:EA:CF:8A:F8:FA:4A:22:13:60:27:D9:E2:61:B2:DD:DA:F6:B9
jetbrainintellijpasswordoverflow

// 256 bit 32 byte
6F:8E:0C:F5:90:3A:79:67:3E:88:63:E4:7D:7E:20:08:E9:06:07:9E:D4:47:DC:58:E4:1D:DD:53:75:08:E6:D2
jetbrainintellijpasswordoverflow

 

코드위치

https://github.com/coolbong/BouncyCastleExample/blob/master/src/main/java/io/github/coolbong/Aes.java