用RSA_Public_encrypt进行C++公钥加密
C++ Public Key Encryption with RSA_public_encrypt
我目前正在研究C++中的公钥加密。我使用的是openssl,但生成的字符串总是断开的。我目前的解决方案如下:
string encryptWithPublicKey(const char* pData, int iLen) { // pData: String to encrypt, iLen: length
char chPublicKey[] = "---Public Key-- ...";
BIO* bio = BIO_new_mem_buf(chPublicKey, -1);
RSA* rsa = PEM_read_bio_RSA_PUBKEY(bio, NULL, NULL, NULL);
int nLen = RSA_size(rsa);
char* pEncode = (char*)malloc(nLen + 1);
int rc = RSA_public_encrypt(iLen, (unsigned char*)pData, (unsigned char*)pEncode, rsa, RSA_NO_PADDING);
cout << "From: " << pData << " To: '" << pEncode << "'";
RSA_free(rsa);
CRYPTO_cleanup_all_ex_data();
std::string strName = std::string(pEncode);
return strName;
}
加密的输出总是这样的格式:;═════════════════════════════════════════════════════════════════²²☻">
不知道为什么输出具有这种格式^^
也许有人知道如何在更好的环境中使用加密。
感谢Kurt
-
加密数据是二进制的。您不应该打印二进制数据。在打印之前,您应该将其编码为base64或十六进制。
-
════════════
是0xCC字节,用于未初始化内存的魔术填充字节。输出中似乎没有写入任何内容,这意味着对RSA_public_encrypt
的调用失败。
您没有检查返回值rc
。
int rc = RSA_public_encrypt(iLen, (unsigned char*)pData, (unsigned char*)pEncode, rsa, RSA_NO_PADDING);
添加一些错误报告以查看确切的错误:
if (rc < 0) {
char buf[128];
cerr << "RSA_public_encrypt: " << ERR_error_string(ERR_get_error(), buf) << endl;
}
它可能会打印类似RSA_padding_add_none:data too small for key size
的内容。
这是因为RSA_public_encrypt
精确地加密RSA_size(rsa)
字节(RSA密钥的大小(,并且主要用于加密对称密钥,而对称密钥又用于加密。
我使用公钥/私钥进行对称密钥传输
好。在这种情况下,密钥应该适合,您只需要将其填充到RSA_size(rsa)
字节。或者更好的是,使用一些好的填充,比如RSA_PKCS1_OAEP_PADDING
而不是RSA_NO_PADDING
。
请注意,std::string(pEncode)
需要一个C字符串输入。您需要std::string(pEncode, rc)
才能将二进制数据存储在std::string
中。或者更好的是,使用base64(请参阅EVP_EncodeBlock
(。
- 将TPM公钥序列化为DER或PEM
- 使用公钥加密消息:BER 解码错误
- 比较两个公钥与OpenSSL API
- 以 x64 配置访问证书公钥
- 使用 char 数组公钥的 OpenSSL 进行 RSA 加密
- 如何获取两个 std::map 的公钥?
- BERDecodeError尝试使用公钥验证签名时出错
- 如何使用 AES 和 sha256 哈希作为密钥加密++进行加密
- 从字符串 Crypto++ 导入 RSA 公钥/私钥
- RSA公共加密使用X509证书C 的公钥
- 使用公钥 X509 V3 (PKCS7) 使用 AES 128 模式 cbc 加密文件
- 加载在JSBN中创建的RSA公钥,然后加密消息
- 使用PGP公钥在C++中使用Windows CryptoApi进行加密
- 公钥-私钥加密教程
- 加密API RSA公钥可以解密数据,并不像预期的那样不对称
- 使用公钥的RSA加密.基于密钥的数据大小
- 在Java中使用RSA公钥加密数据,在Crypto++中解密
- 在c++中实现公钥加密的简单方法
- 使用RSA公钥解密/加密大数据
- RSA公钥加密