2013-10-08 50 views
2

我使用下面的代碼將我的SecretKey寫入了一個文件。同樣,我必須將我的ivParameterSpec寫入另一個文件。我怎樣才能做到這一點?如何將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(); 
+0

四是16bit的字節數組 – user2756703

+0

我想,這個答案寫一個字節數組到一個文件應該幫助您。 http://stackoverflow.com/questions/4350084/byte-to-file-in-java – LostAvatar

+0

不,這是不可能的。 paramspec1不是字節數組 – user2756703

回答

2

不要嘗試存儲IvParameterSpec對象。它不可序列化,因爲它不打算存儲。 四是重要組成部分。存儲這個並從IV創建一個新的IvSpec。我已經改變了用於AES加密的示例代碼here以存儲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"); 
    } 

    [...] 
}