我正在使用openssl 0.9.6g與C++。我已經生成了RSA公鑰/私鑰對。我有基於openssl的1.0.0d版本的openssl.net框架。我使用openssl.net的公鑰加密文本,當我嘗試在我的C++代碼中解密時,我得到了隨機失敗。有時候,我能夠檢索數據,但其他一些時候我收到以下錯誤:RSA_private_decrypt()隨機失敗:塊類型不是02
error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02
我不知道究竟發生了什麼。如果我在openssl.net(最初加密數據)中使用加密數據和私鑰,我可以解密。
我的C++代碼:
const char *p="-----BEGIN RSA PRIVATE KEY-----\n\
MIICXgIBAAKBgQDOx0DsbBURESmUVivbiHXqJdaJw8j3v27RC5ArUKIFbzgoqge+\n\
ZA9IcWA+WDjW4auzrzhK3sQTHRbkYCkSZsHdkHFu1viYDtK0Y1PUzm45xGAjOD2R\n\
TbYTMDyUAwDwERoIamPFLa/kQ/4AQnL6F2C6NQPtnkCITLsB0+pbQLvLzwIDAQAB\n\
AoGBAJ7aDfNSuQBqieHOLVUyyTs/JEijowFJDG4GDxRnloDMR31d2iMWpXMGvmRG\n\
zCuwJIMeqgVCi6kPYOXDRepADM+zPo3Qh6hSS5AhzgY27xitjOqZVrJX7J/Y1N+i\n\
Fd+GPvj7FuOvQTQw9MVkEDQYvTaC3hXVOS5akzqwes5gAL45AkEA6OMl4+ROmDhV\n\
bBwif4sy4Em1MhJMU8RpWzk6f/ETp7gwejdgnU4oHOLz8d7j5rhBnC1mXlUnsaOA\n\
3rYimRqDdQJBAONMxKUXtbEOtP34IecM4uC0COXmYiTo9FdUoaoLOxVTBTo2antb\n\
aEZHvGJJFhvn4ucWtDju15rGCkwhNImDPbMCQQDLNjm/y14RUUaomTw5EtuH/okP\n\
cgwMJBzSrvMu5MuD1CLo4h155dL2scqvSRCQKEOH5c2njqKeTM+Mhl1WP15pAkEA\n\
0lYp6rREGDKJ3jMN/Gd6U4GGcmh9Dbbc1Sul5ls6M4N95N6SLtDpb4/WjgUgBnbR\n\
DBOAdubecYUt5kEcAtyF7QJAYU0OICV21B6t8lsoULHTYDOMm5P7PuMN6w3F+h0Z\n\
sdyMfD6pBKBw/bBNwApBaypIKK9leLdbebor23reKBi+9w==\n\
-----END RSA PRIVATE KEY-----";
strKey = p;
BIO *pBPK = NULL;
RSA *pPrivKey;
pBPK = BIO_new_mem_buf ((void*) strKey.data(), -1);
pPrivKey = PEM_read_bio_RSAPrivateKey (pBPK, NULL, NULL, NULL);
BIO_free (pBPK);
unsigned char* from = (unsigned char*) strData.data();
unsigned char* to = new unsigned char[ RSA_size (pPrivKey)];
int res=RSA_private_decrypt(RSA_size (pPrivKey), from,to, pPrivKey, 1);
而且我openssl.net代碼:
string publicKey = @"-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOx0DsbBURESmUVivbiHXqJdaJ
w8j3v27RC5ArUKIFbzgoqge+ZA9IcWA+WDjW4auzrzhK3sQTHRbkYCkSZsHdkHFu
1viYDtK0Y1PUzm45xGAjOD2RTbYTMDyUAwDwERoIamPFLa/kQ/4AQnL6F2C6NQPt
nkCITLsB0+pbQLvLzwIDAQAB
-----END PUBLIC KEY-----";
Encoding enc = Encoding.ASCII;
string text = "1234";
byte[] msg = enc.GetBytes(text);
CryptoKey key = CryptoKey.FromPublicKey(publicKey, "");
RSA rsa = key.GetRSA();
byte[] res = rsa.PublicEncrypt(msg, RSA.Padding.PKCS1);
rsa.Dispose();
strRes = Convert.ToBase64String(res);
Base64編碼加密數據:
xJTlJeLlm3mufFAdUWFUPfF8KmzFEpIL5K2ibFnnmq4zNECW1conDsWytwGCrqPKOlbmIuhBlg2cUqw6FC6ntyOBSwgRiUht1mBKK+91e7M0h0jb7UTxEmpue+3sVCgjIW6I9GJDo5EA9q5xZA7xzlBh8DGJqOatpLbOt+jJDOw=
原始數據:1234
RSA_private_decrypt()返回-1。
小nit:'const char * p =「...」;'應該可能更改爲'static const char p [] =「。 ..「;'。 – jww