【问题标题】:Appending the initialization vector (IV) to the encrypted bytes when encrypting with TripleDES使用 TripleDES 加密时将初始化向量 (IV) 附加到加密字节
【发布时间】:2017-05-17 00:54:30
【问题描述】:

我想向客户端提供加密令牌,并且我正在使用 javax.crypto.Cipher 进行加密。根据我的阅读,不推荐使用 ECB 作为加密模式,因此我使用带有初始化向量的 CBC 和 TripleDES 作为密码方法。据我了解,有几点是正确的。

  1. 更重要的是 IV 是随机的,并且每次加密都会初始化一个新的,而不是保密。
  2. 必须使用相同的 IV 来加密和解密令牌。
  3. 没有存储 IV 值的标准方法,每种实现方式在这方面都可能不同。

因此,如果这些都是真的,我通过存储附加到加密字节数组的 IV 来完成我的实现,并且在解密阶段,IV 从字节数组中切出并用于解密。以下是 Scala 代码,但在 Java 中差别不大。

val algorithmName = "TripleDES"
def encrypt(bytes: Array[Byte], secret: String): Array[Byte] = {
  val secretKey = new SecretKeySpec(secret.getBytes("UTF-8"), algorithmName)
  val encipher = Cipher.getInstance(algorithmName + "/CBC/PKCS5Padding")
  val iv = encipher.getParameters.getParameterSpec(classOf[IvParameterSpec])
  encipher.init(Cipher.ENCRYPT_MODE, secretKey, iv)
  encipher.doFinal(bytes) ++ iv.getIV
}

def decrypt(bytes: Array[Byte], secret: String): Array[Byte] = {
  val secretKey = new SecretKeySpec(secret.getBytes("UTF-8"), algorithmName)
  val encipher = Cipher.getInstance(algorithmName + "/CBC/PKCS5Padding")
  val ivIndex = bytes.length - 8
  val iv = new IvParameterSpec(bytes, ivIndex, 8)
  encipher.init(Cipher.DECRYPT_MODE, secretKey, iv)
  encipher.doFinal(bytes, 0, ivIndex)
}

另外的字节数组被编码/解码 org.apache.commons.codec.binary.Base64.encodeBase64String / decodeBase64 发送到客户端之前。

所以我的问题是,这种将 IV 存储在与存储加密字符串相同的字节数组中的方法有什么问题或危险吗?是否有更好的替代方法来存储 IV:s?

【问题讨论】:

  • 根据您使用的加密原语/您的加密库,您可以简单地将 IV 添加到密文中......在这种情况下,将 IV 全部设为零以进行解密并跳过结果的第 1 块......
  • 由于您的代码没有实际问题,这个问题应该去CryptographyCode Review
  • 我投票结束这个问题,因为这不是一个真正的编程问题。从本质上讲,这是一个加密问题。
  • 很公平,我猜它的边界,部分是关于一般加密操作,部分是关于上述实现的正确性以及如何使用 javax.crypto -classes 处理这种情况。 Cryptography 中甚至没有 Java-tag,所以它似乎也不合适。

标签: java scala security encryption initialization-vector


【解决方案1】:

IV 的唯一目的是防止攻击者能够使用密文中的模式来推断有关明文的信息(请参阅semantic security),方法是确保使用相同密钥加密的两个相同明文将具有显着不同IV的不同密文。

不知道密钥的攻击者从 IV 中得不到任何好处,因为 IV 在实际加密操作之前和解密操作之后使用(通常;我想不出任何使用 IV 的密码或模式不同,但它们可能存在。但带有 CBC 的 DES 绝对不是其中之一)。因此,将 IV 包含在密文中并没有什么害处,并且将 IV 附加到密文是一种非常常见的做法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2021-01-09
    • 2015-04-22
    相关资源
    最近更新 更多