2016-01-22 129 views
0

我正在嘗試爲make soap請求創建一個WS。在郵件正文中有一個包含加密文本的字段。 我有公鑰加密文本,但我得到的唯一結果是文本無法識別。 我使用節點的加密模塊進行請求和文本被加密,但我不知道爲什麼不正確加密。Node.js糾正rsa加密的方法?

Ps我做了與openssl_public_encrypt函數和工作的PHP相同的東西。但我必須在node.js中完成它。

任何想法或建議? crypto.publicEncrypt函數有哪些不同的openssl_public_encrypt?

這裏是node.js中的加密部分:

var crypto = require("crypto"); 
var fs = require('fs'); 

fs.readFile("./certificate.pem", 'utf8', function (err, data) { 
    var bufferToEncrypt = new Buffer("textToEncrypt"); 
    var encrypted = crypto.publicEncrypt({"key":data, padding:crypto.RSA_NO_PADDING}, bufferToEncrypt).toString("base64"); 
    console.log(encrypted); // length 128 
} 

在PHP中同樣的事情:

<?php 

    $publicKey = "./certificate.pem"; 
    $plaintext = "textToEncrypt"; 

    openssl_public_encrypt($plaintext, $encrypted, $publicKey); 

    echo base64_encode($encrypted); //encrypted string length 128 

?> 

我沒有解密文本的私鑰,我只有公鑰。

另請注意,加密文本(在base64中)的長度在php和node.js中是相同的。

+0

除非您包含您用於加密和解密的實際代碼,否則任何人都不可能在這裏爲您提供幫助,以便我們可以看到您擁有的內容並嘗試確定您做錯了什麼。 – jfriend00

+0

@ jfriend00你是對的!我已經用加密部分的代碼更新了帖子 – AngelPoyel

回答

2

我想填充是你的問題。在node.js中,您指定padding:crypto.RSA_NO_PADDING。當查找openssl_public_encrypt()的文檔時,它說它默認使用OPENSSL_PKCS1_PADDING。請嘗試以下操作:

var constants = require("constants"); 
var encrypted = crypto.publicEncrypt({"key":data, 
    padding:constants.RSA_PKCS1_PADDING}, bufferToEncrypt).toString("base64"); 

我準備了一個在線演示:

  1. Encrypt using node.js
  2. 複製生成的字符串
  3. 並粘貼到$encrypted_encodedPHP decryption example

建議:根據經驗,不要對實際消息使用非對稱加密。改用它來保護對稱密鑰。但是,您的用例可能是有效的,我只是想在每次有人談論RSA加密時說明這一點。

+0

對不起,但也改變了填充類型,根據你的解決方案,生成的加密文本不被系統識別。 – AngelPoyel

+0

我看到我擁有的公鑰是證書。另外我嘗試使用openssl從這個證書創建一個公鑰,但不工作 – AngelPoyel

+0

@AngelPoyel我修復了代碼,不幸的是常量沒有定義,因此填充仍然是錯誤的。我還爲node.js加密和php解密添加了一些演示。 – Scolytus