javascript - 使用 Crypto Node.js 获取错误 "data too large for key size"

标签 javascript node.js encryption rsa pkcs#1

我收到错误 “错误:错误:0406C06E:rsa 例程:RSA_padding_add_PKCS1_type_1:数据对于 key 大小来说太大” 当我这样做时:

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 个 key 进行私有(private)加密,对 n 个 key 进行公共(public)解密)。我使用单个 key 进行测试。

最佳答案

RSA 通过进行模幂运算来工作。这意味着任何被加密的东西通常都具有与模数(它是两个素数的乘积)一样多的位数。

RSA 需要一个填充方案来确保安全。在 node.js 中默认是 RSA_PKCS1_OAEP_PADDING。这种填充方案在加密前的明文中增加了 42 个字节,但现在新的明文 (first_result) 大于模数,将无法以可恢复的方式对其进行加密。

你有两个选择:

让我们尝试禁用填充:

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);

关于javascript - 使用 Crypto Node.js 获取错误 "data too large for key size",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34124795/

相关文章:

javascript - SignalR 获取集线器之外的客户端不起作用

javascript - 密码 REGEX 至少 6 个字符,至少 1 个字母和 1 个数字,并且可以包含特殊字符

javascript - 我怎样才能让这个翻滚动画的一部分连续循环?

javascript - 如何更改事件处理程序中传递的变量

node.js - eslint 命令在 CI 服务器上失败,错误为 "ESLint couldn' t find the config "standard"to extend from"

java - RSA 加密 : Difference between Java and Android

encryption - AES(128 或 256)加密是否会扩展数据?如果是这样,幅度是多少?

mysql - NodeJS mySQL 插入 Blob

javascript - 为什么 Node 中的 console.log(this) 返回一个空对象?

jquery - 在 jQuery 序列化之前加密表单发布数据