如何在单个文件中存储secretKey和IV,以便使用Java进行AES加密和解密?

如何在单个文件中存储secretKey和IV,以便使用Java进行AES加密和解密?,java,encryption,aes,initialization-vector,Java,Encryption,Aes,Initialization Vector,我必须使用AES-256密码和AES 256密钥以及16字节IV对我的文件进行加密,我想将密钥和IV保存在一个文件中,并重新使用它进行解密。但目前我可以单独保存。有谁能帮助我们在一个文件中存储密钥和IV吗 这是我的密码 SecureRandom srandom = new SecureRandom(); byte[] iv = new byte[16]; srandom.nextBytes(iv); IvParameterSpec ivspec = new I

我必须使用AES-256密码和AES 256密钥以及16字节IV对我的文件进行加密,我想将密钥和IV保存在一个文件中,并重新使用它进行解密。但目前我可以单独保存。有谁能帮助我们在一个文件中存储密钥和IV吗

这是我的密码

SecureRandom srandom = new SecureRandom();
      byte[] iv = new byte[16];
      srandom.nextBytes(iv);
      IvParameterSpec ivspec = new IvParameterSpec(iv);   
      FileOutputStream ivOutFile = new FileOutputStream("C:\\iv.key");
      ivOutFile.write(iv);
      ivOutFile.close();     
      KeyGenerator kgen = KeyGenerator.getInstance("AES");
      kgen.init(256);
      SecretKey skey = kgen.generateKey();
      FileOutputStream out = new FileOutputStream("C:\\AES.key");
      byte[] keyb = skey.getEncoded();
      out.write(keyb);
      out.close(); 
 Cipher ci = Cipher.getInstance("AES/CBC/PKCS5Padding");
          ci.init(Cipher.ENCRYPT_MODE, skey, ivspec);
          FileEncryptionUtils fileEncryptionUtils =new FileEncryptionUtils();
          fileEncryptionUtils.processFile(ci, inFile, outFile);

你使用静脉注射的方法是不正确的。静脉注射不是秘密,不应该重复使用。每次加密时生成一个新密码,并将其与密文一起存储,而不是与密钥一起存储


有关对称加密的最佳实践,请参见中的示例。

抱歉,StackOverflow不是这样工作的。形式为“我想做X,请给我提示和/或示例代码”的问题被认为是离题的。请访问并阅读,特别是阅读我同意kvantour之前的评论。除此之外,还可以在一个文件中存储多个流—一个明显的例子是
java.util.zip.ZipFile
。您不需要将IV保存在任何地方。就像Luke写的那样,你应该在加密文件中提供IV,而不是在一个文件中提供密钥。IV只与特定的加密文件相关,通常的做法是将这些文件保存在一起。至于钥匙,您如何在不影响接收器的情况下将其分发给接收器?如果您需要为每个文件分配一个新密钥,并且需要分发此密钥,则似乎应该使用混合加密,即使用接收方公钥加密唯一(对称)加密密钥。请参阅此。它展示了如何发送带有密文的IV:嗨,卢克·约书亚·帕克,谢谢你的及时回复。我每次都使用新生成的IV和密钥加密我的文件。我需要将这些加密文件连同密钥和IV一起发送给第三方进行解密。但是他们不想单独发送key和IV,而是希望合并成一个48字节的文件[key 32byte+16 byte IV]您能帮助我如何实现这一点吗?如果它们不是机密,为什么不应该重用它们?@user207421,因为能够预测一系列加密操作中的下一个IV可能会造成某些情况,导致明文暴露或至少了解底层数据。如果这是你的反对票,我会鼓励你进一步研究这个话题并删除它:)@user207421不,它们不是秘密。任何人都可以安全地知道与特定密文对应的IV。对他们来说,预测下一个会是什么是不安全的。这就是为什么固定静脉注射是不安全的,但每次随机注射都是安全的。再一次,我鼓励你自己研究这个话题,而不是和我争论你不明白的事情。不知道为什么会投反对票。这是正确的答案@用户207421
I found a way to store in one file and used that file for decryption and its working. here is my approach
 while writing IV and key in 2 different files, i have written in one file. And for Decryption i read the file like first 16bytes for IV and  last 32 bytes for secretkey. 


FileOutputStream OutFile = new FileOutputStream("C:\\SecretFile.key");
      OutFile.write(iv); 
      KeyGenerator kgen = KeyGenerator.getInstance("AES");
      kgen.init(256);
      SecretKey skey = kgen.generateKey();
      byte[] keyb = skey.getEncoded();
      OutFile.write(keyb);
      OutFile.close();