如何将 IvParameterSpec 写入文件?
Posted
技术标签:
【中文标题】如何将 IvParameterSpec 写入文件?【英文标题】:how to write IvParameterSpec to a file? 【发布时间】:2013-10-15 06:20:13 【问题描述】:我使用以下代码将我的 SecretKey 写入文件。同样,我必须将 ivParameterSpec 写入另一个文件。我该怎么做?
SecretKey key = KeyGenerator.getInstance("AES").generateKey();
ObjectOutputStream secretkeyOS = new ObjectOutputStream(new FileOutputStream("publicKeyFile"));
secretkeyOS.writeObject(key);
secretkeyOS.close();
AlgorithmParameterSpec paramSpec1 = new IvParameterSpec(iv);
session.setAttribute("secParam", paramSpec1);
ObjectOutputStream paramOS = new ObjectOutputStream(new FileOutputStream("paramFile"));
paramOS.writeObject(paramSpec1);
paramOS.close();
【问题讨论】:
iv 是 16 位字节数组 我认为,将字节数组写入文件的这个答案应该对您有所帮助。 ***.com/questions/4350084/byte-to-file-in-java 不,这是不可能的。 paramspec1 不是字节数组 为什么要保存对象?保存 iv 并在需要解密时从中创建一个新规范 IV 是定义 IvParameterSpec 的部分。如果您存储 iv 并再次加载它。 new IvParameterSpec(loaded_iv) 这个新的参数规格等于另一个。您的代码不起作用,因为 IvParameterSpec 不可序列化,因为它不打算存储 【参考方案1】:不要尝试存储 IvParameterSpec 对象。它不可序列化,因为它不打算存储。 IV是重要的部分。存储它并从 IV 创建一个新的 IvSpec。我已将 here 中的示例代码更改为 AES 加密以存储 IV 并使用加载的 IV 解密密文,以便您查看可能的工作流程。
请注意,这是一个最小示例。在真实的用例中,您还可以存储和加载密钥,并且还应该重新考虑异常处理:-D
public class Test
public static void main(String[] args) throws Exception
String message = "This string contains a secret message.";
// generate a key
KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(128);
byte[] key = keygen.generateKey().getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
byte[] iv = 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8 ;
IvParameterSpec ivspec = new IvParameterSpec(iv);
// initialize the cipher for encrypt mode
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec);
// encrypt the message
byte[] encrypted = cipher.doFinal(message.getBytes());
System.out.println("Ciphertext: " + hexEncode(encrypted) + "\n");
// Write IV
FileOutputStream fs = new FileOutputStream(new File("paramFile"));
BufferedOutputStream bos = new BufferedOutputStream(fs);
bos.write(iv);
bos.close();
// Read IV
byte[] fileData = new byte[16];
DataInputStream dis = null;
dis = new DataInputStream(new FileInputStream(new File("paramFile")));
dis.readFully(fileData);
if (dis != null)
dis.close();
// reinitialize the cipher for decryption
cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(fileData));
// decrypt the message
byte[] decrypted = cipher.doFinal(encrypted);
System.out.println("Plaintext: " + new String(decrypted) + "\n");
[...]
【讨论】:
以上是关于如何将 IvParameterSpec 写入文件?的主要内容,如果未能解决你的问题,请参考以下文章