2015-12-07 51 views
3

,我發現了錯誤"Error: error:0406C06E:rsa routines:RSA_padding_add_PKCS1_type_1:data too large for key size"當我這樣做:收到錯誤「數據太大,關鍵尺寸」與加密的Node.js

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個密鑰進行公開解密)。我正在使用一個密鑰進行測試。

回答

6

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

真棒,謝謝。任何想法爲什麼當ref_first_plaintext ==新緩衝區(「Hello World!」)'不等於? – arturojain

+1

是的,因爲你需要使用'buf1.equals(buf2)'。 'Buffer'不是默認的JavaScript對象,所以不能直接比較。 –

+0

謝謝,很多。你真棒。 – arturojain