[Java] AES128 vs AES256
코드를 작성할때의 AES256과 AES128의 차이는
- KeySpec 생성 시 key 길이를 256bit(32byte) 혹은 128bit(16byte)를 사용하느냐의 차이.
- Initial Vector는 둘다 모두 128bit(16byte) 사용.
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 값 없이 단순히 키로 암호화만 함.
댓글
댓글 쓰기