c++ 使用OpenSSL使用RSA公钥验证签名失败

u91tlkcl  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(276)

我有一对公钥和私钥。我使用私钥对一个数据字符串进行签名,然后得到签名字符串,并使用公钥对其进行验证。然而,失败了!这是我的代码:

  1. static char* encrypt_private_key = "-----BEGIN RSA PRIVATE KEY-----\n"
  2. "MIICXAIBAAKBgQDQb4hTBU584fJNot6BNG7TKWuVPlBlngIDTts1s5WYA2rAgoOZ\n"
  3. "hvFLVCQV2zQNcNOe+kbI1ejOYLyWE+P9R8LmgYrfmMge0bIH4a1IdSZLqIc6ON9L\n"
  4. "rDAUTIK1b06jLPz9Xn0ql5RPnkShUwkoDWipMklGNqW7X7LTLg8EpHzvdQIDAQAB\n"
  5. "AoGAccBMj7JXsUPF7qSx9aVdzhPOyLYnPi3LP27rpxUI0NsciU8w7rp8OPYEc4Eb\n"
  6. "mTI364z+0GAdG3Qjt2vHgtSFAjZVTKP8ncpowhzpoUCFVIhPXi7Y1iPbNylabnwx\n"
  7. "cwsmqJHvnyKldVbH5AXJiVVe2r+8oW6VjioRqLicgbOcbUkCQQD5Yom+FgjCFfD7\n"
  8. "H6uw2LZ96oLJL5+fPEJnp+HeD0T89bej7BrA2fRpTSvf9zqzl6rNLUr7txWDORC2\n"
  9. "9r7p0wEPAkEA1fbtKFGArHyik7oTDYWBQakU14WbU01iHcLK0PccIfVorrKqnRN7\n"
  10. "txVqNtz3iW15HZSQmfMuM9t4UxGdENc/OwJBAKNLe4glY2y680VsUn8FGFHQ2fyk\n"
  11. "m2+oBI9dJY/DDdhZiPrkIgx/awP8jSsk9qIcQLIC42N5WbPIDQLRBOeUy88CQDKj\n"
  12. "4Zd0SscILJZYKOA/Y8s9kGA+D/gUTY+LpeL1SWREKAWI5daNYO+BEwVvIOsWzN6S\n"
  13. "ZfL52kqNvBm1Bn6Q4zcCQH+ETH6Jr+5QRxTgU5IJJ3CJhtPCjqENdrZI4DHliB6E\n"
  14. "sKsrNbPZJGHQff9+Bq2/LU/Z014UzEiG0SUod0wDs24=\n"
  15. "-----END RSA PRIVATE KEY-----";
  16. RSA* encrypt_rsa_pri_key = 0;
  17. // -----BEGIN RSA PUBLIC KEY-----
  18. // MIGJAoGBANBviFMFTnzh8k2i3oE0btMpa5U+UGWeAgNO2zWzlZgDasCCg5mG8UtU
  19. // JBXbNA1w0576RsjV6M5gvJYT4/1HwuaBit+YyB7RsgfhrUh1Jkuohzo430usMBRM
  20. // grVvTqMs/P1efSqXlE+eRKFTCSgNaKkySUY2pbtfstMuDwSkfO91AgMBAAE=
  21. // -----END RSA PUBLIC KEY-----
  22. static unsigned char encrypt_public_key[] = {
  23. 129, 129, 129, 129, 129, 238, 233, 235, 229, 226, 140, 254, 255, 237, 140, 252, 249, 238, 224, 229, 239, 140, 231, 233, 245, 129, 129, 129,
  24. 129, 129, 166, 225, 229, 235, 230, 237, 195, 235, 238, 237, 226, 238, 218, 197, 234, 225, 234, 248, 194, 214, 196, 148, 199, 158, 197, 159,
  25. 195, 233, 156, 206, 216, 225, 220, 205, 153, 249, 135, 249, 235, 251, 201, 237, 203, 226, 227, 158, 214, 251, 214, 192, 246, 203, 232, 205,
  26. 223, 239, 239, 203, 153, 193, 235, 148, 249, 216, 249, 166, 230, 238, 244, 206, 226, 237, 157, 219, 156, 153, 155, 154, 254, 223, 198, 250,
  27. 154, 225, 153, 203, 218, 230, 245, 248, 152, 131, 157, 228, 219, 217, 205, 238, 197, 216, 135, 245, 213, 238, 155, 254, 223, 203, 202, 196,
  28. 222, 249, 196, 157, 230, 199, 217, 195, 196, 214, 195, 152, 159, 156, 217, 223, 225, 238, 254, 225, 166, 203, 222, 250, 218, 248, 221, 225,
  29. 223, 131, 252, 157, 201, 202, 255, 221, 244, 192, 233, 135, 201, 254, 231, 234, 248, 239, 255, 203, 226, 205, 231, 199, 213, 255, 249, 245,
  30. 158, 220, 206, 216, 202, 223, 216, 225, 217, 232, 219, 255, 199, 202, 227, 149, 157, 237, 203, 225, 238, 237, 237, 233, 145, 166, 129, 129,
  31. 129, 129, 129, 233, 226, 232, 140, 254, 255, 237, 140, 252, 249, 238, 224, 229, 239, 140, 231, 233, 245, 129, 129, 129, 129, 129, 166
  32. };
  33. int pub_is_decrypt = 0;
  34. RSA* encrypt_rsa_pub_key = 0;
  35. std::string testRSA(std::string data) {
  36. if (encrypt_rsa_pri_key == 0) {
  37. BIO *rsa_pri_io = BIO_new_mem_buf(encrypt_private_key, strlen(encrypt_private_key));
  38. encrypt_rsa_pri_key = PEM_read_bio_RSAPrivateKey(rsa_pri_io, 0, 0, 0);
  39. //BIO_free(rsa_pri_io);
  40. }
  41. if (pub_is_decrypt == 0) {
  42. for (int idx = 0; idx < sizeof(encrypt_public_key); idx++) {
  43. encrypt_public_key[idx] = encrypt_public_key[idx] ^ 0xac;
  44. }
  45. pub_is_decrypt = 1;
  46. }
  47. if (encrypt_rsa_pub_key == 0) {
  48. BIO* rsa_pub_io = BIO_new_mem_buf(encrypt_public_key, sizeof(encrypt_public_key));
  49. if (rsa_pub_io == NULL) {
  50. return "";
  51. }
  52. // PKCS#8 publickey should use PEM_read_bio_RSA_PUBKEY() while PKCS#1 use PEM_read_bio_RSAPublicKey() instead
  53. encrypt_rsa_pub_key = PEM_read_bio_RSAPublicKey(rsa_pub_io, 0, 0, 0);
  54. if (encrypt_rsa_pub_key == 0) {
  55. return "";
  56. }
  57. BIO_free(rsa_pub_io);
  58. }
  59. BIGNUM* rsa_pub_n = NULL, * rsa_priv_n = NULL;
  60. RSA_get0_key(encrypt_rsa_pub_key, (const BIGNUM**)&rsa_pub_n, NULL, NULL);
  61. RSA_get0_key(encrypt_rsa_pri_key, (const BIGNUM**)&rsa_priv_n, NULL, NULL);
  62. int match = BN_cmp(rsa_pub_n, rsa_priv_n);
  63. unsigned char digest[SHA256_DIGEST_LENGTH];
  64. SHA256(reinterpret_cast<const unsigned char*>(data.c_str()), data.length(), digest);
  65. unsigned int signatureLength = RSA_size(encrypt_rsa_pri_key);
  66. unsigned char* signature = new unsigned char[signatureLength];
  67. int result = RSA_sign(NID_sha256, digest, SHA256_DIGEST_LENGTH, signature, &signatureLength, encrypt_rsa_pri_key);
  68. std::string retStr(signature, signature + signatureLength);
  69. result = RSA_verify(NID_sha256, (const unsigned char*)data.c_str(), data.length(), (const unsigned char*)signature, signatureLength, encrypt_rsa_pub_key);
  70. return retStr;
  71. }

我试着检查键是否匹配,match是0,这意味着它们是匹配的。但是,RSA_sign()函数返回1,而RSA_verify()函数返回0
我的代码有什么问题?谢谢!

cwxwcias

cwxwcias1#

RSA_verify()中,第二个和第三个参数不正确:
而不是(const unsigned char*)data.c_str(), data.length()传递digest, SHA256_DIGEST_LENGTH(就像签名一样,s。RSA_verify())。通过此修复,验证成功。

相关问题