유저 정보 암호화2

quinones·2024년 3월 27일

지난번 글에서 잘못된 부분을 수정하려고 한다. 먼저 코드를 보면

    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방식을 사용하면 해결된다.!

profile
이우진

0개의 댓글