2016-07-13 3 views
0

QtクライアントはRSAキーペアを生成し、RSA公開鍵と暗号化するテキストを含むjson文字列をNodejsサーバに送信します。 NodeJsサーバは、クライアントから提供されたRSA公開鍵を使用して(node-rsaを使用して)暗号化されたテキストを含むbase64文字列を返送しています。クライアント側の復号化されたbase64文字列からのガベージ

マイ復号化機能はこれです:

QString Crypto::decrypt(QString b64msg) 
{ 
    //decode the base64 string 
    std::string decoded; 
    CryptoPP::StringSource ss(b64msg.toStdString(), true, 
          new CryptoPP::Base64Decoder(
           new CryptoPP::StringSink(decoded))); 

    //create a CryptoPP::Integer out of the decoded string 
    CryptoPP::Integer encrypted((const byte *)decoded.data(), decoded.size()); 

    //decrypt using the private key 
    CryptoPP::Integer r = privKey.CalculateInverse(rng, encrypted); 
    size_t req = r.MinEncodedSize(); 
    std::string recovered; 
    recovered.resize(req); 
    r.Encode((byte *)recovered.data(), recovered.size()); 
    std::cout << "Recovered: " << recovered << std::endl; 

    return QString::fromStdString(recovered); 
} 

私はちょうど復号化機能のうち、ごみを取得します。私はすべてがうまくやっていると思う、何が分からないの?

EDIT ここではより詳細な反復です:

クライアントには、以下の鍵ペアを生成:

-----BEGIN RSA PRIVATE KEY----- 
MIICWgIBAAKBgQDCe3LEnSuvjc9sERk5JJTnThaBnTPbQSiSr6fi2pOyREKkOyAG 
R1DdW1ND96reWkDIrnKE7jw7sTXs/BTKALlXpFdF1V7FRfiHlB3gRsJYpRzo3Odo 
XgS/KG/7W9N9H13t+vmi7HSC2EMiqFrpuSJjJm52MjBW8+wmDMDMmpb0bQIBEQKB 
gCJSBTHBYg/r2U9OT77KOGUNx7yFJ0TPQ2UuDpFx3dQqKeC/I8TfaJ+IljkrtL3T 
sRRbBSaEZPt5oBrDEro8XPEKdV+a4s6EhNgvLWozFsfbOcXhVLJhWbodnnPsJ7P+ 
pbXHRySTSXBHkRPjnyoJMlEssaCMopiXztJt7A+9YzYFAkEA5PDjgisaRl3St4dM 
VBtH987WCu0G5BprfBlcdCt0Cpyg1x/al42/dZIRnJUcXdofW+yfp5+VvIxcOUS1 
e5deIwJBANl37zrZGLtUlnvqj3vQpChcBtUabqeYilnUuK1xt8cWRw/xTmeb8c0l 
oFc/3ycrInfonhhMtdshIWSXve3NZC8CQQDXeU6YoQmro5klNAuadAd/0bpkotlP 
J+yxCM98ZSHr3rV/LQn4DPBup5ga5rFJRcMpVyzZ/5v8wFbMfOcK6NERAkAmYHWC 
2wRdSymdZaDZnUolPWqeE7ksonLEjvNp5uQyMRuZZtGZ0Dm6ymeW7SdhQ9jn+9+p 
72ti57qZR/RXJD7bAkAyhbtM8rdRcJ1aXRD08Nq1HI1XM3HcblVDssABQMm3BkyP 
prD+pxiGBrw59vZ6OeKo+4J6oAZXRazbnv38aBZO 
-----END RSA PRIVATE KEY----- 

-----BEGIN PUBLIC KEY----- 
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDCe3LEnSuvjc9sERk5JJTnThaB 
nTPbQSiSr6fi2pOyREKkOyAGR1DdW1ND96reWkDIrnKE7jw7sTXs/BTKALlXpFdF 
1V7FRfiHlB3gRsJYpRzo3OdoXgS/KG/7W9N9H13t+vmi7HSC2EMiqFrpuSJjJm52 
MjBW8+wmDMDMmpb0bQIBEQ== 
-----END PUBLIC KEY----- 

次に、クライアントはNodeJsサーバーにJSONリクエストを送信します。リクエストフォームで

{"command": "encrypt","phrase":"TestString","pubkey":<PEM public key>} 

ですこれはNodeJs側のコードスニペットです:

[...] 
var WebSocketServer = require('ws').Server; 
var NodeRSA = require('node-rsa'); 
[...] 
var TCP_PORT = 8081; 
var wss = new WebSocketServer({port: TCP_PORT}); 

wss.on('connection', function connection(socket) { 
    socket.on('message', function (data) { 
     var request; 
     try { 
      request = JSON.parse(data); 
      console.log("Request:"); 
      console.log(data); 
     } catch (e) { 
      console.log("Error parsing message: " + e); 
      socket.send("json or gtfo"); 
      return; 
     } 
     switch (request.command) { 
      case "encrypt": 
       console.log("phrase: " + request.phrase); 
       console.log("pubkey: " + request.pubkey); 
       var keypu = new NodeRSA(request.pubkey); 
       var resultB64 = keypu.encrypt(request.phrase, "base64", 'utf8'); 
       socket.send(resultB64); 
       [...] 

この反復では「resultB64」は実際のところ

wBuWpfelCB9yIOUQ6ZMPMCPJvn+NYfgjywh4Ye7ybYvNqJdf05yqgrqudkwAJT9+VaIIS/KE/38WvGxiTTY5qZm+rlRrY5OBDZzKRRH4iEKp1NFRJXhh9ZtHPRM/2JfVMUYSFdIgyP3CojIUz2dyLfZu7XLn3RYXI29EJEyHxKM= 

です私が秘密鍵を渡してサーバー側で解読しようとすると、解読は成功しているので、Nodejs側では問題ありません。

@Kombinator:そのQByteArray同等と

std::string decoded; 
CryptoPP::StringSource ss(b64msg.toStdString(), true, 
         new CryptoPP::Base64Decoder(
          new CryptoPP::StringSink(decoded))); 

::私はこれを置き換える場合に生じる、クライアント側で、私はまったく同じ(ごみ)を得ることが注目

std::string decoded; 
QByteArray fromB64 = QByteArray::fromBase64(b64msg.toLatin1()); 
decoded = fromB64.toStdString(); 
+0

これはテキストのコーディング/エンコードの問題ですか? 'b64msg'は正しいですか? 'toStdString'の後に' decoded'が正しいですか? 'fromStdString'は正しくエンコードされますか? – ilotXXI

+0

[Base64デコードはうまくいくようです](http://www.cryptopp.com/wiki/Base64Decoder)。私たちは暗号化機能を見る必要があります。また、それはRSAの珍しい使用です。 Crypto ++ wikiの[RSA Cryptography](http://www.cryptopp.com/wiki/RSA_Cryptography)および[RSA Encryption](http://www.cryptopp.com/wiki/RSA_Encryption_Schemes)も参照してください。 – jww

+0

質問を編集して詳細を追加しました。 –

答えて

0

あなたがする必要がありますこの問題のユニットテストを使用してください。まず、値の呼び出しによるインラインで複合メソッドを停止します。 テスト値でのみstd:stringを使用します。反対側では、base64用のQByteArrayを使用します。

関連する問題