2015-11-10 36 views
1

我在我的meteor.js web應用上使用node-forge npm。根據此示例,我試圖對某些純文本執行RSA加密:https://github.com/digitalbazaar/forge#rsaRSA enc/dec節點僞造包錯誤

當我想解密密文時,如果想要找回加密塊無效的明文,就會出現問題。

下面的例子,我必須加密字符串中的字節,所有這一切都完成了,但我不明白爲什麼它解密失敗?任何猜測?

rsaEncrypt:function(pubPem,privPem,plainText){ 

console.log(plainText); 

var str = plainText; 
var bytes = []; 

for (var i = 0; i < str.length; ++i) { 
    bytes.push(str.charCodeAt(i)); 
} 

console.log("BAJTOVI:"); 
console.log(bytes); 

var publicKey = pki.publicKeyFromPem(pubPem); 
console.log(publicKey); 

var encrypted = publicKey.encrypt(bytes); 
console.log("Encryption: "); 
console.log(encrypted); 

var privateKey = pki.privateKeyFromPem(privPem); 
var decrypted = privateKey.decrypt(encrypted); 

console.log("Decryption: "); 
console.log(decrypted); 

function bin2String(decrypted) { 
    var result = ""; 
    for (var i = 0; i < decrypted.length; i++) { 
    result += String.fromCharCode(parseInt(decrypted[i], 2)); 
    } 
    return result; 
} 
console.log("OPET TEXT:"); 
console.log(result); 

return decryted; 

}, 

問題我從服務器獲取:

Exception while invoking method 'rsaEncrypt' Error: Encryption block is invalid. 
I20151110-21:22:05.279(1)?  at Object._decodePkcs1_v1_5 [as decode] (/Users/mrcina/Meteor Projects/cryptonic/.meteor/local/isopacks/npm-container/npm/node_modules/node-forge/js/rsa.js:1446:11) 
I20151110-21:22:05.279(1)?  at Object.key.decrypt (/Users/mrcina/Meteor Projects/cryptonic/.meteor/local/isopacks/npm-container/npm/node_modules/node-forge/js/rsa.js:1083:19) 
I20151110-21:22:05.279(1)?  at [object Object].Meteor.methods.rsaEncrypt (server/methods.js:49:32) 
I20151110-21:22:05.279(1)?  at maybeAuditArgumentChecks (livedata_server.js:1698:12) 
I20151110-21:22:05.279(1)?  at livedata_server.js:708:19 
I20151110-21:22:05.279(1)?  at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1) 
I20151110-21:22:05.279(1)?  at livedata_server.js:706:40 
I20151110-21:22:05.279(1)?  at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1) 
I20151110-21:22:05.280(1)?  at livedata_server.js:704:46 
I20151110-21:22:05.280(1)?  at tryCallTwo (/Users/mrcina/.meteor/packages/promise/.0.5.1.1wnrf8h++os+web.browser+web.cordova/npm/node_modules/meteor-promise/node_modules/promise/lib/core.js:45:5) 

這一行:VAR解密= privateKey.decrypt(加密的);

回答

2

Forge不使用整數數組來表示字節;它使用二進制編碼的字符串。嘗試簡化您的代碼到以下內容:

rsaEncrypt:function(pubPem,privPem,plainText){ 

    console.log(plainText); 

    var publicKey = pki.publicKeyFromPem(pubPem); 
    console.log(publicKey); 

    var encrypted = publicKey.encrypt(forge.util.encodeUtf8(plainText)); 
    console.log("Encryption: "); 
    console.log(encrypted); 

    var privateKey = pki.privateKeyFromPem(privPem); 
    var decrypted = forge.util.decodeUtf8(privateKey.decrypt(encrypted)); 

    console.log("Decryption: "); 
    console.log(decrypted); 

    return decrypted; 
}