我正在开发一个生成RSA加密会话密钥并将它们存储在数据库中的应用程序。后来这些密钥通过Javascript转移到C ++应用程序。因此我想使用OpenSSL库。我用openssl生成了一个2048位密钥对,用于这两种方法。
我的PHP函数的工作原理如下:
function encrypt_with_public_key($input, $key)
{
openssl_public_encrypt($input, $crypttext, $key, OPENSSL_PKCS1_OAEP_PADDING);
return $crypttext;
}
和
$fp = fopen("public.pem","r");
$public_pem = fread($fp,8192);
fclose($fp);
$public_key = openssl_get_publickey($public_pem);
$sessionKey = ...;
$encSessionKey = encrypt_with_public_key($sessionKey, $public_key);
我成功测试了这个部分。我遇到麻烦的部分是C ++部分。我使用的是MS Visual Studio 2013. 编辑:添加了十六进制编码(使用Crypto ++)
#include <openssl/pem.h>
#include <openssl/rsa.h>
#include <openssl/err.h>
#include <openssl/crypto.h>
...
string decrypted, encoded;
decrypted.clear();
char privateKey[] =
"-----BEGIN RSA PRIVATE KEY-----\n"\
...
RSA *rsa = NULL;
BIO *keybio;
keybio = BIO_new_mem_buf(privateKey, strlen(privateKey));
rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);
StringSource ss2(input, true,
new HexEncoder(
new StringSink(encoded)
)
);
RSA_private_decrypt(encoded.length(), (unsigned char *)encoded.data(), (unsigned char *)decrypted.data(), rsa, RSA_PKCS1_OAEP_PADDING);
FBLOG_INFO("", ERR_error_string(ERR_get_error(), NULL));
return decrypted;
请注意,不会从文件中读取私钥。
OpenSSL返回以下错误:0406506C:lib(4):func(101):reason(108)。
这意味着我的输入数据长于模数长度(如果我错了,请纠正我)。谁知道如何处理这个?我认为这些问题是通过填充参数解决的。
输入数据是php加密函数的直接输出(没有base64或任何东西)。