C ++中的RSA解密,PHP中的加密

时间:2015-02-08 21:06:32

标签: php c++ encryption openssl rsa

我正在开发一个生成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或任何东西)。

0 个答案:

没有答案