2017-02-28 67 views
2

我想使用nodejs解密AES-256加密字符串。我正在使用加密模塊。帶有AESEngine和PKCS7填充的bouncycastle PaddedBufferedBlockCipher的等效密碼是什麼?

該字符串使用Bouncy castle java庫加密。在Java密碼被使用intialsed:

PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new AESEngine(), new PKCS7Padding());

crypto模塊的的NodeJS使用密碼的OpenSSL的名單intialising它,像:

var decipher = crypto.createDecipher('aes-256-cbc',key);

我應該使用哪種算法?

這裏的算法列表可供選擇:(我看不出有任何CBC或其他方式)

-bash-4.1$ openssl list-cipher-algorithms|grep AES-256 AES-256-CBC AES-256-CFB AES-256-CFB1 AES-256-CFB8 AES-256-CTR AES-256-ECB AES-256-OFB AES-256-XTS AES256 => AES-256-CBC aes256 => AES-256-CBC

回答

1

如果使用分組密碼加密的東西,你需要

  • 可以採取輸入的單個塊,並將其裂傷到輸出的單個塊(AES的塊大小的塊密碼是16個字節),
  • 允許您以結構化方式加密多個塊的操作模式
  • 填充使您能夠加密的內容與塊大小的倍數不完全相同。

您顯示的PaddedBufferedBlockCipher只有兩個。操作模式暗示爲ECB模式,因爲它只是將分組密碼分別應用於每個塊。

你會得到相同的行爲在node.js中有:

var decipher = crypto.createDecipheriv('aes-xxx-ecb', key, ''); 

交易所xxx對位的密鑰的大小。有效的大小是128位,192位和256位。其他一切都不行。此外,請確保您獲得密鑰權利的編碼。

如果你想知道爲什麼使用createDecipheriv而不是createDecipher,我建議你仔細比較這兩個函數的文檔。 createDecipher需要密碼而不是密鑰。


其他注意事項:

切勿使用ECB mode。它是確定性的,因此不具有語義安全性。您至少應該使用像CBCCTR這樣的隨機模式。最好是驗證你的密文,以便像padding oracle attack這樣的攻擊是不可能的。這可以通過驗證模式(如GCM或EAX)或encrypt-then-MAC方案完成。

+0

感謝您的解釋。我發現ECB沒有使用任何IV,並且'createDecipher(algorithm,password)'根據密碼創建了自己的密鑰,所以我用同樣的方法解決了它。 – avck

0

AES-256-ECB解密數據。

使用PKCS填充調用decipher.setAutoPadding(true)

相關問題