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();
これはテキストのコーディング/エンコードの問題ですか? 'b64msg'は正しいですか? 'toStdString'の後に' decoded'が正しいですか? 'fromStdString'は正しくエンコードされますか? – ilotXXI
[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
質問を編集して詳細を追加しました。 –