AES仅共享密钥(无盐或无IV)

时间:2018-11-21 09:43:11

标签: java spring spring-boot encryption aes

我需要使用AES对称字符串进行加密,然后与客户端共享加密后的字符串。

他们知道密钥(我们已经通过电话进行通信),并且他们应该能够解密加密的字符串。

但是我发现所有Java实现都需要与加密文档一起共享salt(或IV)。如果我每次都必须发送盐,则这会破坏仅共享密文和对称密钥(在使用之前)的目的。

我理解错了吗?有没有办法只共享密文和对称密钥?

2 个答案:

答案 0 :(得分:2)

IV加密的目的是随机化。如果您使用ECB操作模式,它可能泄漏有关在同一密钥下加密的密文的信息。参见Wikipedia mode of operations中著名的企鹅。

E(k,m) = E(k,m') iff m=m'

现代操作模式使用IV,例如TLS 1.3 cipher suites.

中的AES-GCM

您应该将危险告知大公司。我很确定他们可以轻松轻松地适应您的情况。

注意:只有

,ECB模式才能安全
  • 您的数据始终是不同的(无模式)
  • 您会使用Diffie-Hellman key exchange的密钥协商协议为每次加密生成一个新的密钥,而事实并非如此。

答案 1 :(得分:2)

通常,通过将IV附加到密文中进行共享。因此,最终您将发送单个Base64编码的字符串。

因此,如果您担心通过发送两个字段(一个IV和一个密文)而不是仅发送一个字段来破坏合同,那么让我向您保证,您将只发送一个字段。而且解密逻辑知道如何从接收到的字符串中提取IV并将其用于解密过程。

请注意,IV和密钥之间有一些关键区别:

  • 钥匙是秘密,IV不是秘密
  • 许多消息可以用相同的密钥加密,但是每条新消息的IV都不相同。每个消息的密钥和IV组合必须唯一,IV也是随机的

因此,您共享IV的方式与密钥不同。由于IV对于每条消息都会更改,因此实际上会在其后面附加密文以形成单个字符串,然后将其作为加密输出发送。因此,解密逻辑仅将密钥和加密的输出作为输入。它知道如何从加密的输出中提取IV和密文。

在今天,如果有人需要使用AES加密某些内容,通常的选择是使用经过身份验证的加密模式,例如GCM,该模式不仅提供机密性,而且以安全的方式提供完整性。

除非接收者(在您的情况下)严格为AES指定特定模式,否则默认选择始终是带有GCM的AES。即使收件人提出了某种不是经过身份验证的加密模式的模式,您也可以考虑向他们解释使用经过身份验证的加密模式的好处。

您将找到带有详细说明here的完整Java实现。

您可能还需要阅读this和评论,以更好地理解它。