2013年7月8日 星期一

在 Java 使用加密演算法(五):使用 RSA 加解密長資料的另一種實作方法

原本使用前篇「在 Java 使用加密演算法(三):使用 RSA 加解密長資料」中寫的方法在做 RSA 加解密
但不知道為什麼突然跑出 javax.crypto.BadPaddingException: Data must start with zero 的 Exception
找來找去都不知道問題出在哪.....後來查到 [1] 時發現好像有比較簡潔的寫法...。
直接記錄加解密的那一段程式碼如下:
byte[] buffer = new byte[1024];
int len = 0;
CipherOutputStream cos = null;

try {
  // Initial the cipher.
  Cipher cipher = Cipher.getInstance(ENCRYPT_ALGORITHM);
  cipher.init(cipherMode, key);
  // Cipher the input and write to output stream.
  cos = new CipherOutputStream(output, cipher);
  while((len = input.read(buffer)) != -1) {
    cos.write(buffer, 0, len);
    cos.flush();
  }
} catch (IOException e) {
  e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
  e.printStackTrace();
} catch (NoSuchPaddingException e) {
  e.printStackTrace();
} catch (InvalidKeyException e) {
  e.printStackTrace();
} finally {
  try {
    if(cos != null) cos.close();
  } catch (IOException e) {}
}
其中 ENCRYPT_ALGORITHM 是加密或解密使用的演算法;
cipherMode 是 Cipher.ENCRYPT_MODE 或 Cipher.DECRYPT_MODE
key 則是事先產生好的 Private Key 或 Public Key。

改用這個方法以後,似乎因為沒有自己呼叫 doFinal() 函式,所以也不會跑出 BadPaddingException 等的問題~程式碼也變短了
雖然仍然沒有真的發現原本到底是什麼問題.....。

參考資料:
1、Encrypting files with Public Key Encryption in Java

沒有留言: