AES-在Java中使用密文存储IV

AES-在Java中使用密文存储IV,java,encryption,Java,Encryption,我已经实现了CBC模式AES加密和解密机制,在该机制中,我为推荐的每次加密尝试生成随机IV和随机密钥 现在,我已将我的密钥保存在一个单独的文件中,将IV保存在另一个文件中,但在浏览了不同的论坛后,我发现IV不应保持安全,在加密时应附加密文,在解密时,我们可以从该密码字节数组中提取16个字节 现在,我尝试了一段代码来达到同样的效果,但结果并不好,因为第一个块没有正确加密;然而,该区块的其余部分确实如此 有人能告诉我我的方法有什么问题吗 我们将非常感谢您的帮助:) 结果 Original Text

我已经实现了CBC模式AES加密和解密机制,在该机制中,我为推荐的每次加密尝试生成随机IV和随机密钥

现在,我已将我的密钥保存在一个单独的文件中,将IV保存在另一个文件中,但在浏览了不同的论坛后,我发现IV不应保持安全,在加密时应附加密文,在解密时,我们可以从该密码字节数组中提取16个字节

现在,我尝试了一段代码来达到同样的效果,但结果并不好,因为第一个块没有正确加密;然而,该区块的其余部分确实如此

有人能告诉我我的方法有什么问题吗

我们将非常感谢您的帮助:)

结果

Original Text  : This is a plain text which need to be encrypted by AES Algorithm with CBC Mode
DeCrypted Text : ûª¯Î¥pAï2EÞi+¼‹Ý$8ŶÄDDNâOæàtext which need to be encrypted by AES Algorithm with CBC Mode

就因为你在这里复印了静脉注射:

byte[] iv = Arrays.copyOfRange( cipherText , 0, 16);
但这并不意味着当您在以下时间尝试解密它时,它仍然不存在:

byte[] decryptedText = cipher.doFinal(cipherText);

您应该解密
密文
中的所有内容,前16个字节除外。目前,您还在IV上执行AES解密-这就是您收到垃圾的原因。

那么我应该如何将其与密文分离?此外,在加密中,我使用不带IV的cipher.init并将其添加到最终字节数组中。那么cbc在这里实现了吗?在我的例子中,它是使用IV对第一个块进行异或还是使用0 IV?你肯定需要用IV初始化密码进行加密-否则它怎么知道使用它?你不需要分离它,只需像处理iv一样使用数组.copyOfRange提取密文即可。问题已解决代码:
IvParameterSpec ivSpec=new IvParameterSpec(iv);System.out.println(“IV encrypt=“+ivSpec”)//初始化ENCRYPT_MODE Cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec)的密码和解密:
IvParameterSpec ivSpec=新的IvParameterSpec(密文,0,16);cipherText=Arrays.copyOfRange(cipherText,16,cipherText.length)//初始化解密模式Cipher.init的密码(Cipher.DECRYPT_模式,keySpec,ivSpec)
实际上不需要对IV执行任何操作。cipher对象不会仅仅因为变量名为“IV”就将其传入。它已在init()调用中提供。
byte[] decryptedText = cipher.doFinal(cipherText);