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

Java AES仅共享密钥(无盐或IV),java,spring,spring-boot,encryption,aes,Java,Spring,Spring Boot,Encryption,Aes,我需要使用AES-symmetric-a字符串加密,然后与客户端共享加密的字符串 他们知道密钥(我们通过电话进行了通信),他们应该能够破译加密字符串 然而,我发现的Java实现都需要与加密文档一起共享salt(或IV)。如果每次我都要发送salt,那么这就破坏了只共享密文和对称密钥(在手之前)的目的 我理解错了什么吗?有没有办法只共享密文和对称密钥?加密中IV的目的是随机化。如果使用ECB操作模式,它可能会泄漏在同一密钥下加密的密文的信息。在维基百科上看到著名的企鹅 现代操作模式使用IV,如AE

我需要使用AES-symmetric-a字符串加密,然后与客户端共享加密的字符串

他们知道密钥(我们通过电话进行了通信),他们应该能够破译加密字符串

然而,我发现的Java实现都需要与加密文档一起共享salt(或IV)。如果每次我都要发送salt,那么这就破坏了只共享密文和对称密钥(在手之前)的目的


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

加密中IV的目的是随机化。如果使用ECB操作模式,它可能会泄漏在同一密钥下加密的密文的信息。在维基百科上看到著名的企鹅

现代操作模式使用IV,如AES-GCM,其处于

你应该把危险告诉大公司。我相信他们很容易适应你的情况

注:ECB模式只有在以下情况下才是安全的

  • 您的数据总是不同的(无模式)
  • 您使用密钥协议协议为每个加密生成一个新密钥,但情况并非如此

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

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

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

  • 钥匙是秘密,IV不是
  • 许多消息可以使用相同的密钥进行加密,但IV对于每个新消息都是不同的。密钥和IV组合对于每条消息都必须是唯一的,并且IV也必须是随机的
因此,您不能以与密钥相同的方式共享IV。由于每个消息的IV都会发生变化,因此它实际上会附加密码文本以形成单个字符串,然后作为加密输出发送。因此,解密逻辑只将密钥和加密输出作为输入;它知道如何从加密输出中提取IV和密码文本

在今天,如果任何人需要使用AES加密某些东西,通常的选择是像GCM这样的经过身份验证的加密模式,它不仅提供机密性,而且以安全的方式提供完整性

除非收件人(在您的情况下)严格指定AES的特定模式,否则默认选择始终是AES with GCM。即使接收方提出了一些不是认证加密模式的模式,您也可以考虑向他们解释使用身份验证加密模式的好处。 您将找到一个完整的java实现,并提供详细的解释


您可能还希望与评论一起阅读,以便更好地理解它。

IV不必是秘密的,因此您可以将其与密文一起共享。更多信息请点击这里:你能解释一下为什么静脉注射对你来说是个问题吗?它不是一个秘密值。IV对于每条消息都是唯一的,因此逻辑上遵循消息。通常,您会在消息中加入IV,例如在加密消息的前面加上它。IV不需要是秘密的,但它需要是随机的。因为客户是一家大公司,除了他们期望的以外,不能处理任何事情……客户永远不需要处理或知道IV的存在——只有你的软件才需要。
E(k,m) = E(k,m') iff m=m'