【发布时间】:2018-08-26 15:47:13
【问题描述】:
我在 Kotlin 中创建了这两个扩展来加密/解密字符串:
fun String.encrypt(seed : String): String {
val keyGenerator = KeyGenerator.getInstance("AES")
val secureRandom = SecureRandom.getInstance("SHA1PRNG")
secureRandom.setSeed(seed.toByteArray())
keyGenerator.init(128, secureRandom)
val skey = keyGenerator.generateKey()
val rawKey : ByteArray = skey.encoded
val skeySpec = SecretKeySpec(rawKey, "AES")
val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
cipher.init(Cipher.ENCRYPT_MODE, skeySpec)
val byteArray = cipher.doFinal(this.toByteArray())
return byteArray.toString()
}
fun String.decrypt(seed : String): String {
val keyGenerator = KeyGenerator.getInstance("AES")
val secureRandom = SecureRandom.getInstance("SHA1PRNG")
secureRandom.setSeed(seed.toByteArray())
keyGenerator.init(128, secureRandom)
val skey = keyGenerator.generateKey()
val rawKey : ByteArray = skey.encoded
val skeySpec = SecretKeySpec(rawKey, "AES")
val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
cipher.init(Cipher.DECRYPT_MODE, skeySpec)
val byteArray = cipher.doFinal(this.toByteArray())
return byteArray.toString()
}
由于某种原因,我收到以下异常:
javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
我做错了什么?
【问题讨论】:
-
不要将您的密码定义为“AES”。使用“AES/CBC/PKCS5Padding”。您还需要添加 IV。
-
除此之外,使用
SecureRandom类派生键是绝对的。 SHA1PRNG 定义不明确,即使种子相同,也可能产生不同的值包括完全随机的值。查看有关getRawKey陷阱的所有信息。 -
看我的回答here
标签: encryption kotlin aes