使用 Crypto Node.js 时出现错误 "data too large for key size"
Getting error "data too large for key size" with Crypto Node.js
我收到错误 "Error: error:0406C06E:rsa routines:RSA_padding_add_PKCS1_type_1:data too large for key size"
当我这样做时:
var crypto = require('crypto');
var fs = require('fs');
var first_keys = {
public_key: fs.readFileSync('tests/public.key'),
private_key: fs.readFileSync('tests/private.key')
}
var first_result = crypto.privateEncrypt({
key: first_keys.private_key
}, new Buffer("Hello World!"));
var second_result = crypto.privateEncrypt({
key: first_keys.private_key
}, first_result);
var second_plaintext = crypto.publicDecrypt({
key: first_keys.public_key
}, second_result);
var first_plaintext = crypto.publicDecrypt({
key: first_keys.public_key
}, second_plaintext);
if(first_plaintext == new Buffer("Hello World!"))
console.log("Hello World!");
我知道这很奇怪,但我正在创建一个过程,要求它在 n 次迭代中工作(对 n 个密钥进行私有加密,对 n 个密钥进行 public 解密)。我使用单个密钥进行测试。
RSA 通过模幂运算工作。这意味着任何被加密的东西通常都具有与模数(它是两个素数的乘积)一样多的位数。
RSA 需要一个填充方案来确保安全。默认值为 RSA_PKCS1_OAEP_PADDING
in node.js。这种填充方案在加密前的明文中增加了 42 个字节,但现在新的明文 (first_result
) 比模数大,将无法以可恢复的方式加密。
您有两个选择:
- 使用hybrid encryption或
- 为以后的迭代禁用填充。
让我们尝试禁用填充:
var first_result = crypto.privateEncrypt({
key: first_keys.private_key
}, new Buffer("Hello World!"));
var second_result = crypto.privateEncrypt({
key: first_keys.private_key,
padding: constants.RSA_NO_PADDING
}, first_result);
var second_plaintext = crypto.publicDecrypt({
key: first_keys.public_key,
padding: constants.RSA_NO_PADDING
}, second_result);
var first_plaintext = crypto.publicDecrypt({
key: first_keys.public_key
}, second_plaintext);
我收到错误 "Error: error:0406C06E:rsa routines:RSA_padding_add_PKCS1_type_1:data too large for key size"
当我这样做时:
var crypto = require('crypto');
var fs = require('fs');
var first_keys = {
public_key: fs.readFileSync('tests/public.key'),
private_key: fs.readFileSync('tests/private.key')
}
var first_result = crypto.privateEncrypt({
key: first_keys.private_key
}, new Buffer("Hello World!"));
var second_result = crypto.privateEncrypt({
key: first_keys.private_key
}, first_result);
var second_plaintext = crypto.publicDecrypt({
key: first_keys.public_key
}, second_result);
var first_plaintext = crypto.publicDecrypt({
key: first_keys.public_key
}, second_plaintext);
if(first_plaintext == new Buffer("Hello World!"))
console.log("Hello World!");
我知道这很奇怪,但我正在创建一个过程,要求它在 n 次迭代中工作(对 n 个密钥进行私有加密,对 n 个密钥进行 public 解密)。我使用单个密钥进行测试。
RSA 通过模幂运算工作。这意味着任何被加密的东西通常都具有与模数(它是两个素数的乘积)一样多的位数。
RSA 需要一个填充方案来确保安全。默认值为 RSA_PKCS1_OAEP_PADDING
in node.js。这种填充方案在加密前的明文中增加了 42 个字节,但现在新的明文 (first_result
) 比模数大,将无法以可恢复的方式加密。
您有两个选择:
- 使用hybrid encryption或
- 为以后的迭代禁用填充。
让我们尝试禁用填充:
var first_result = crypto.privateEncrypt({
key: first_keys.private_key
}, new Buffer("Hello World!"));
var second_result = crypto.privateEncrypt({
key: first_keys.private_key,
padding: constants.RSA_NO_PADDING
}, first_result);
var second_plaintext = crypto.publicDecrypt({
key: first_keys.public_key,
padding: constants.RSA_NO_PADDING
}, second_result);
var first_plaintext = crypto.publicDecrypt({
key: first_keys.public_key
}, second_plaintext);