[Java] AES128 vs AES256

코드를 작성할때의 AES256과 AES128의 차이는
  • KeySpec 생성 시 key 길이를 256bit(32byte) 혹은 128bit(16byte)를 사용하느냐의 차이.
  • Initial Vector는 둘다 모두 128bit(16byte) 사용.
아래 코드는 CBC(Cipher Block Chaining)와 PKCS5 패딩을 사용하는 구현.

Encrypt


final static String key = "key입력하는 하세요";

public String encrypt(String str) throws NoSuchAlgorithmException,                                            
                                         GeneralSecurityException,                                            
                                         UnsupportedEncodingException {
    String ivStr = key.substring(0, 16);

    // Set key spec & initial vector spec
    SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(CharEncoding.UTF_8), "AES");

    IvParameterSpec ivSpec = new IvParameterSpec(ivStr.getBytes(CharEncoding.UTF_8));

    // Set cipher of CBC & PKCS5
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

    // Encrypt & Base64 encoding
    byte[] encrypted = c.doFinal(str.getBytes(CharEncoding.UTF_8));
    String enStr = new String(Base64.encodeBase64(encrypted));

    return enStr;
}

Decrypt


public String decrypt(String str) throws NoSuchAlgorithmException,
                                         GeneralSecurityException,
                                         UnsupportedEncodingException {

    String ivStr = key.substring(0, 16);

    // Set key spec & initial vector spec
    SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(CharEncoding.UTF_8), "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(ivStr.getBytes(CharEncoding.UTF_8));

    // Set cipher of CBC & PKCS5
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] byteStr = Base64.decodeBase64(str.getBytes());

    return new String(c.doFinal(byteStr), CharEncoding.UTF_8);
}

CBC와 ECB 모드의 차이

  • CBC(Cipher Block Chaining): Initial vector의 값으로 XOR한 후 키로 암화화하고, 이 값을 다시 다음 블록의 Initial vector 값으로 사용해 XOR한 후 암호화. 이 동작을 전과정에 걸쳐서 chaining 하는 형태.
  • ECB(Electronic Code Block): Intial vector 값 없이 단순히 키로 암호화만 함.




댓글

이 블로그의 인기 게시물

[Protocol] WIEGAND 통신

Orange for Oracle에서 한글 깨짐 해결책

[UI] GNB·LNB·SNB·FNB 용어 설명