我正在尝试加密/解密一些字符串数据。我使用密码。我一直在想是否有必要使用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。