Tôi đang tìm cách bảo mật thư tôi đã gửi từ máy chủ node.js đến ứng dụng C++.RSA đăng nhập node.js và xác minh trong C++
Từ node.js, tôi đã tạo một cặp khóa.
Tôi đang sử dụng nút-rsa để đọc các khóa công khai đứng về phía Node.js (https://github.com/rzcoder/node-rsa)
var rsa = new nodeRSA(publicKeyBuffer ,{encryptionScheme :'pkcs1'})
Như thông điệp của tôi có thể dài, tôi tính toán một sha256 muối của thông điệp trước khi gọi mã hóa.
const hash = crypto.createHash('sha256').update(message + config.signSalt).digest('hex')
phần này hoạt động tốt vì tôi có thể tạo cùng một giá trị băm chính xác trên mặt C++.
sau đó, tôi gọi hàm mã hóa của nút-rsa để tạo ra một bộ đệm
const signature = rsa.encrypt(hash)
tôi đã cố gắng mã hóa khác nhau, nhưng khi dữ liệu được gửi qua một WebSocket (+ MsgPack đóng gói) các định dạng nhị phân là một lựa chọn tốt
về phía C++, tôi lần đầu tiên đọc là chìa khóa cho một char []
const char keyStr[] = "-----BEGIN RSA PRIVATE KEY-----\n" ..........
BIO* bio = BIO_new_mem_buf(keyStr, (int)strlen(keyStr)); // -1: assume string is null terminated
m_rsaPrivKey = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL);
if (!m_rsaPrivKey)
LogOutSys("ERROR: Could not load PRIVATE KEY! PEM_write_bio_RSAPrivateKey FAILED: %s\n", ERR_error_string(ERR_get_error(), NULL));
phím được đọc mà không có lỗi, sau đó, tôi đang tính toán hash từ tin nhắn, thực hiện một std :: string từ bộ đệm char unsigned
std::string hash = sha256(msg.c_str());
std::string signatureStr(signature.begin(), signature.end());
char *decrypt;
int decryptLen;
decrypt = new char[RSA_size(m_rsaPrivKey)];
decryptLen = RSA_private_decrypt((int)msg.size() + 1, (unsigned char*)msg.c_str(), (unsigned char*)decrypt, m_rsaPrivKey, RSA_NO_PADDING /* RSA_PKCS1_OAEP_PADDING */);
if (decryptLen == -1)
{
char errStr[130];
ERR_error_string(ERR_get_error(), errStr);
LogOutSys("Rsa::decrypt - Error decrypting string ssl error %s", errStr);
}
for (int i = 0; i < decryptLen; i++)
{
decryptData.push_back(decrypt[i]);
}
delete decrypt;
các giải mã thất bại với các lỗi sau
RSA :: giải mã - Lỗi giải mã error error chuỗi ssl: 0406506C: lib (4) : func (101): lý do (108)
Tôi đã thử chế độ mã hóa và chế độ đệm khác nhau nhưng luôn gặp lỗi.
Tại sao bạn không sử dụng 'dấu (đệm, [mã hóa], [source_encoding]) 'phương pháp về phía javascript (có nghĩa là để ký kết và nên thực hiện băm bên trong)? Cách bạn thực hiện nó sẽ không tạo ra chữ ký chính xác (phần đệm cho chữ ký và mã hóa khác nhau). Nó có thể giúp sử dụng tiện ích dòng lệnh 'openssl' để xác minh tính chính xác của khóa/chữ ký/mã hóa. 'PublicKeyBuffer' có chứa khóa công cộng hay khóa riêng (vì nó chứa một khóa riêng cho chữ ký, tên biến này khá là sai lạc)? Chúc may mắn! – vlp
đó là lần đầu tiên tôi làm điều này vì vậy có lẽ tôi đang làm sai cách (đó là lý do tại sao tôi hỏi câu hỏi thực sự :)) có publicKeyBuffer chứa một khóa công khai. Tôi nghĩ nếu có thể ký với khóa công khai và xác minh với khóa riêng nhưng theo câu trả lời của bạn có thể nó không phải là trường hợp. –
Bạn đã nói "khóa được đọc có lỗi". Ý của bạn có phải là các lỗi _without_ không? Nếu không thì có vẻ như vấn đề ở đó. –