我需要使用AES对称字符串进行加密,然后与客户端共享加密后的字符串。
他们知道密钥(我们已经通过电话进行通信),并且他们应该能够解密加密的字符串。
但是我发现所有Java实现都需要与加密文档一起共享salt(或IV)。如果我每次都必须发送盐,则这会破坏仅共享密文和对称密钥(在使用之前)的目的。
我理解错了吗?有没有办法只共享密文和对称密钥?
答案 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模式才能安全答案 1 :(得分:2)
通常,通过将IV附加到密文中进行共享。因此,最终您将发送单个Base64编码的字符串。
因此,如果您担心通过发送两个字段(一个IV和一个密文)而不是仅发送一个字段来破坏合同,那么让我向您保证,您将只发送一个字段。而且解密逻辑知道如何从接收到的字符串中提取IV并将其用于解密过程。
请注意,IV和密钥之间有一些关键区别:
因此,您共享IV的方式与密钥不同。由于IV对于每条消息都会更改,因此实际上会在其后面附加密文以形成单个字符串,然后将其作为加密输出发送。因此,解密逻辑仅将密钥和加密的输出作为输入。它知道如何从加密的输出中提取IV和密文。
在今天,如果有人需要使用AES加密某些内容,通常的选择是使用经过身份验证的加密模式,例如GCM,该模式不仅提供机密性,而且以安全的方式提供完整性。
除非接收者(在您的情况下)严格为AES指定特定模式,否则默认选择始终是带有GCM的AES。即使收件人提出了某种不是经过身份验证的加密模式的模式,您也可以考虑向他们解释使用经过身份验证的加密模式的好处。
您将找到带有详细说明here的完整Java实现。
您可能还需要阅读this和评论,以更好地理解它。