RSA_private_decrypt()随机失败:块类型不是02

时间:2015-05-28 15:52:05

标签: c++ encryption openssl rsa

我正在使用带有C ++的openssl 0.9.6g。我已经生成了RSA公钥/私钥对。我有openssl.net框架,它基于openssl的1.0.0d版本。我正在使用openssl.net的公钥加密文本,当我尝试使用我的C ++代码解密时,我遇到了随机故障。有时我能够检索数据,但有时我会收到以下错误:

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。

2 个答案:

答案 0 :(得分:0)

您的公钥不正确,这就是为什么以后解密不起作用的原因(您的openssl.net代码在加载时会失败)。使用私钥加密和解密工作正常。

答案 1 :(得分:0)

我最近去过那里。这仍然没有解决?如果是这样,这可能会有所帮助。您应该在加密期间确定几件事情:

  1. “in_data_length”,它取决于您使用的填充。确保 如果使用sizeof(rsa_key) - 11,则小于PSCK1_PADDING,相同 与文档或手册页中的其他人一样。
  2. “out data”应指向大小等于sizeof(rsa_key)的内存。
  3. 以上的事情在我的案例中有用,希望它可能会有所帮助。