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

时间:2017-02-28 10:38:03

标签: node.js encryption openssl cryptography bouncycastle

我想使用nodejs解密AES-256加密字符串。我正在使用加密模块。

使用Bouncy castle java库加密字符串。在Java中,密码使用:

进行初始化

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

nodejs的

crypto模块使用openssl的密码列表进行初始化,例如:

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

我应该使用哪种算法?

以下是可供选择的算法列表:

-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

2 个答案:

答案 0 :(得分: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方案来完成。

答案 1 :(得分:0)

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

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