我正在尝试加密/解密一些字符串数据。我使用密码。我一直在想是否有必要使用 IV 来加密数据。如果您可以在没有 IV 的情况下使用 Cipher,那么该怎么做呢?
我在这里得到了一些代码:这是加密数据的代码:
fun encrypt(cipher: Cipher, plainText: ByteArray): String {
val enc = cipher.doFinal(plainText)
return Base64.encodeToString(
enc,
Base64.DEFAULT
) + separator + Base64.encodeToString(
cipher.iv,
Base64.DEFAULT
)
}
这是解密代码:
fun decrypt(cipher: Cipher, encrypted: String): String {
return cipher.doFinal(
Base64.decode(
encrypted,
Base64.DEFAULT
)
).toString(Charsets.UTF_8)
}
解密的初始化:
cipherDec.init(
Cipher.DECRYPT_MODE, key, IvParameterSpec(
Base64.decode(
IV.toByteArray(Charsets.UTF_8),
Base64.DEFAULT
)
)
加密初始化:
cipherEnc.init(Cipher.ENCRYPT_MODE, key)
首先,您不能简单地不使用 IV(初始化向量),因为在更强模式下工作的密码总是被设计为需要一个。IV的目的是为相同的明文生成不同的密文。通常的做法是使用强随机数生成器根据需要获取尽可能多的IV字节,然后将IV附加到密文(通常在其前面),然后使用IV进行解密。是的,IV 不需要加密或隐藏。它只需要在那里。
那么,如果您不想要或不需要 IV(如果每个明文因明文域或业务需要而不同,您可能不需要 IV)怎么办?您可以为 IV 使用常量值(如零字节数组)。那么您就不需要将 IV 附加到密文中。但请注意 -除非您确切地知道自己在做什么,否则不要这样做。改用随机 IV。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句