2016-07-13 1 views
0

Клиент Qt создает пару ключей RSA, затем отправляет строку json на сервер Nodejs, содержащий открытый ключ RSA и текст для шифрования. Сервер NodeJs отправляет обратно строку base64, содержащую текст, зашифрованный (с использованием node-rsa) с открытым ключом RSA, предоставленным клиентом.Мусор из дешифрованной строки 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----- 

Затем клиент посылает запрос JSON на сервер NodeJs. Запрос в виде

{"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: я отметил, что на стороне клиента я получаю точно такой же (мусор) результат, если я заменяю это:

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

с QByteArray эквивалент:

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

Может ли это быть кодирование/кодирование текста? Правильно ли 'b64msg'? Является ли 'decoded' правильным после' toStdString'? Правильно ли 'fromStdString' кодировать? – ilotXXI

+0

[Декодирование Base64 выглядит хорошо) (http://www.cryptopp.com/wiki/Base64Decoder). Нам нужно увидеть функцию шифрования. Кроме того, это необычное использование RSA. Также см. [RSA Cryptography] (http://www.cryptopp.com/wiki/RSA_Cryptography) и [RSA Encryption] (http://www.cryptopp.com/wiki/RSA_Encryption_Schemes) в вики Crypto ++. – jww

+0

Я отредактировал вопрос, чтобы включить более подробную информацию. –

ответ

0

Вы должны используйте единичный тест для этой проблемы. Сначала затормозите сложный метод с помощью inline путем вызова значений. Используйте std: string только с тестовыми значениями. С другой стороны, вы используете QByteArray для файлов base64.