Java 如何使IvParameterSpec随机但仍然解密

Java 如何使IvParameterSpec随机但仍然解密,java,encryption,Java,Encryption,对于Java中的加密。。。at的文章指出,每次初始化向量都应该不同,但是如果我使用不同的IV进行解密,而不是使用加密的IV进行解密,则会得到垃圾字符,而不是我所期望的数据 在一台服务器上加密,在另一台服务器上解密,而不必在服务器之间来回传输IV的正确方式是什么 常见的技术似乎是对字节数组进行硬编码,但据推测这是不安全的???我相信IV就像一种盐——它不是秘密,它只是用来引入额外的随机性元素,以便使用相同密钥加密的同一消息每次仍然以不同的方式出现 因此,您可以将用于加密的IV作为加密值的一部分进行

对于Java中的加密。。。at的文章指出,每次初始化向量都应该不同,但是如果我使用不同的IV进行解密,而不是使用加密的IV进行解密,则会得到垃圾字符,而不是我所期望的数据

在一台服务器上加密,在另一台服务器上解密,而不必在服务器之间来回传输IV的正确方式是什么

常见的技术似乎是对字节数组进行硬编码,但据推测这是不安全的???

我相信IV就像一种盐——它不是秘密,它只是用来引入额外的随机性元素,以便使用相同密钥加密的同一消息每次仍然以不同的方式出现

因此,您可以将用于加密的IV作为加密值的一部分进行传输,就像您将盐与哈希值的哈希一起存储一样


当然,我可能完全不正确…

这是正确的,IV与第一块纯文本异或,然后用密钥加密。其余的块与前一个块异或。这称为密码块链接(CBC)。您必须使用与加密相同的IV进行解密。这不是秘密,可以直接发送/存储。您应该在每次加密数据时随机生成一个新的IV。它的目的是给加密数据添加随机性,因此使用相同密钥加密的相同数据将产生不同的密文。假设服务器加密明文,则服务器必须将加密文本与IV一起发送给客户端?那么IV可以以明文的形式发送吗?@kaze:现在还不清楚你说的是什么场景-但是可以,你可以以明文的形式发送IV。因为IV在加密过程中(在服务器端)被使用,而同样的IV再次被用于解密该消息(在客户端)。因此,服务器需要向客户端发送加密消息和用于加密该消息的IV。如果我的理解是正确的,那么将IV作为纯文本发送给客户(我们知道CBC是如何做到的)是否会对安全造成任何危害?@kaze:同样,不,没关系。你误解了这篇文章。对于每个加密的消息,IV应该不同,但必须使用相同的IV对用于加密的给定消息进行解密。见下面Jon Skeet的答案。