2015-05-28 30 views
0

我正在使用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。

+0

小nit:'const char * p =「...」;'應該可能更改爲'static const char p [] =「。 ..「;'。 – jww

回答

0

您的公鑰不正確,這是之後解密無法正常工作的原因(您的openssl.net代碼在加載時會失敗)。使用私鑰加密和解密工作正常。

0

我最近去過那裏。 這仍然沒有解決?如果是這樣可能會有所幫助。 你應該確保在加密過程中有幾件事情。

  1. 「in_data_length」,它取決於您使用的填充。如果使用PSCK1_PADDING,請確保它小於sizeof(rsa_key) - 11,與文檔或手冊頁中的其他頁面相同。
  2. 「out data」應指向大小等於sizeof(rsa_key)的內存。 上面的東西製作在我的情況下,希望它可以幫助
+0

@Martin Prikryl,感謝您的編輯,我會更注重格式。 – Martin