2016-07-13 4 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); 
} 

난 그냥 해독 기능에서 쓰레기를 얻을. 나는 모든 일을 잘하고 있다고 생각하는데, 나는 무엇을 놓치고 있습니까?

편집 여기에 더 자세한 반복이다 :

-----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 요청을 보냅니다 :

클라이언트가 다음 키 쌍을 생성합니다. 요청이이 NodeJs 측의 코드입니다

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

형태입니다 :

[...] 
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= 

입니다 , 개인 키도 전달하고 서버 쪽에서 암호 해독을 시도하면 암호 해독이 성공하므로 Nodej 측에서 문제가 없다고 가정합니다.

@Kombinator : 당신은에있는

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

텍스트 인코딩/인코딩 문제 일 수 있습니까? 'b64msg'가 맞습니까? 'toStdString' 후에'디코딩 '된 것이 맞습니까? 'fromStdString'은 정확히 encode합니까? – 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

: 그 QByteArray 동등한와

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

을 : 나는이를 대체 할 경우 결과를 클라이언트 측에서 내가 똑같은 (쓰레기)을 얻을 주목 이 문제에 대한 단위 테스트를 사용하십시오. 먼저 값 호출을 사용하여 인라인으로 복잡한 메소드를 제동하십시오. 테스트 값에만 std : string을 사용하십시오. 다른 쪽에서는 base64 용 QByteArray를 사용합니다.