用AESEngine和PKCS7填充对bouncycastle的PaddedBufferedBlockCipher的等效密码是什么?

我想用nodejs解密AES-256encryption的string。 我正在使用encryption模块。

该string使用Bouncy城​​堡java库encryption。 在Java中,密码使用:

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

nodejs的crypto模块使用openssl的密码列表来初始化它,如:

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

我应该使用哪种algorithm?

以下是可供select的algorithm列表:

-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

如果使用分组密码encryption某些东西,则需要

  • 分组密码,它可以采取一个单一的input块,并将其转换为一个输出块(对于AES的块大小是16字节),
  • 操作模式使您能够以结构化的方式encryption多个数据块
  • 该填充使您能够encryption与块大小的倍数不完全相同的内容。

你已经显示的PaddedBufferedBlockCipher只有两个。 操作模式暗示为ECB模式,因为它只是将分组密码分别应用于每个块。

您将在node.js中获得与以下相同的行为:

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

xxx为单位交换密钥的大小。 有效的大小是128位,192位和256位。 其他一切都不行。 另外,请确保您获得密钥的编码权。

如果你想知道为什么使用createDecipheriv而不是createDecipher ,我build议你仔细比较这两个函数的文档。 createDecipher需要密码而不是密钥。


其他考虑:

切勿使用ECB模式 。 这是确定性的,因此不具有语义上的安全性。 您至less应该使用CBC或CTR等随机模式。 authentication你的密文是更好的,所以像填充甲骨文攻击这样的攻击是不可能的。 这可以通过validation模式,如GCM或EAX,或使用encryption后MACscheme来完成。

使用AES-256-ECB解密数据(我没有看到任何CBC或其他模式)。

调用decipher.setAutoPadding(true)以使用PKCS填充。