지난번 글에서 잘못된 부분을 수정하려고 한다. 먼저 코드를 보면
fun encrypt(data: String, key: String): String {
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
val secretKeySpec = SecretKeySpec(key.toByteArray(), "AES")
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec) //객체를 암호화 모드로 초기화
val iv = cipher.iv
val encryptedBytes = cipher.doFinal(data.toByteArray())
val combined = ByteArray(iv.size + encryptedBytes.size)
System.arraycopy(iv, 0, combined,0, iv.size)
System.arraycopy(encryptedBytes, 0, combined, iv.size, encryptedBytes.size)
return Base64.encodeToString(combined, Base64.DEFAULT)
}
// 대칭키 복호화 함수
fun decrypt(encryptedData: String, key: String): String {
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
val encryptedBytesWithIV = Base64.decode(encryptedData, Base64.DEFAULT)
val iv = encryptedBytesWithIV.copyOfRange(0, 12)
val encryptedBytes = encryptedBytesWithIV.copyOfRange(12, encryptedBytesWithIV.size)
val secretKeySpec = SecretKeySpec(key.toByteArray(), "AES")
val gcmParameterSpec = GCMParameterSpec(128, iv)
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, gcmParameterSpec)
val decryptedBytes = cipher.doFinal(encryptedBytes)
return String(decryptedBytes)
}
AES블록 암호화 알고리즘을 사용하는건 같다. 하지만 지난번에 사용했던 ECB방식은 최근에 보안이 뚤렸다고한다. 항상 동일한 방식으로 암호화 및 복호화를 해서 그렇다고한다?? 잘은 모르겠지만 사용하면 안되는 방식이다..!
새롭게 GCM, NoPadding방식을 사용하면 해결된다.!