- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 C++ 库 PolarSSL 进行 RSA 加密和解密。但是我无法解密加密的字符串,除非它是加密的输出。以下代码不起作用(未重构)。它加密文本并将输出编码为 Base64 并返回。 strcmp 上的条件有效(字符串相同)。
AsymetricCipher::encrypt(const std::string &pathToPublicKey, std::istream &inputData, std::ostream &encryptedData) {
if(initServerPublicCtx(pathToPublicKey, 512)) {
std::cout << "Encryption error: Can't load public key from file: " << pathToPublicKey << std::endl;
return false;
}
entropy_context entropy;
ctr_drbg_context ctr_drbg;
char *pers = "rsa_encrypt";
entropy_init(&entropy);
if(ctr_drbg_init(&ctr_drbg, entropy_func, &entropy, (unsigned char*)pers, strlen(pers)) != 0) {
std::cout << "Encryption error: ctr_drbg_init failed" << std::endl;
return false;
}
size_t inputSize = ::getStreamSize(inputData);
char *input = new char[inputSize];
memset(input, 0, inputSize);
inputData.read(input, inputSize);
input[inputSize] = '\0';
unsigned char *buffer = new unsigned char[ctx.len];
memset(buffer, 0, ctx.len);
memcpy(buffer, input, inputSize);
// This has to be rewritten
size_t MAX_OUTPUT_LENGTH = ctx.len;
unsigned char *outputBuffer = new unsigned char[MAX_OUTPUT_LENGTH];
memset(outputBuffer, 0, MAX_OUTPUT_LENGTH);
if(rsa_pkcs1_encrypt(&ctx, ctr_drbg_random, &ctr_drbg, RSA_PUBLIC, inputSize, buffer, outputBuffer) != 0) {
std::cout << "Encryption error: rsa_pkcs1_encrypt failed" << std::endl;
return false;
}
initServerPrivateCtx("data/private.key", 512);
size_t outputSize = 0;
std::string copyBuffer = "";
std::stringstream encStream;
std::string base64 = "";
Base64Wrapper::encode(outputBuffer, strlen((char*)outputBuffer), base64);
for(size_t i = 0; i < base64.length();) {
encStream << base64[i++];
}
unsigned char *encBuffer = new unsigned char[MAX_OUTPUT_LENGTH+10];
memset(encBuffer, 0, MAX_OUTPUT_LENGTH);
encStream.read((char *)encBuffer, MAX_OUTPUT_LENGTH+10);
copyBuffer.append((char *)encBuffer);
unsigned char *decoded = NULL;
size_t decodedSize = 0;
Base64Wrapper::decode(copyBuffer, &decoded, &decodedSize);
decoded[decodedSize] = '\0';
if(strcmp((char*)outputBuffer, (char*)decoded) != 0) {
std::cout << "Different";
}
memset(buffer, 0, ctx.len);
if(rsa_pkcs1_decrypt(&ctx, RSA_PRIVATE, &outputSize, decoded, buffer, MAX_OUTPUT_LENGTH) != 0) {
std::cout << "Decryption error: rsa_pkcs1_decrypt failed" << std::endl;
return false;
}
::cleanMemory(outputBuffer, MAX_OUTPUT_LENGTH);
::cleanMemory(buffer, ctx.len);
delete [] outputBuffer;
delete [] buffer;
delete [] encBuffer;
delete [] decoded;
//delete [] input;
return true;
}
但是,如果我从加密中使用 outputBuffer
调用 rsa_pkcs1_decrypt,一切正常。
我需要加密文本,发送它并在代码中的另一个地方解密。
有什么建议我做错了吗?
最佳答案
经典内存溢出
char *input = new char[inputSize];
input[inputSize] = '\0';
关于c++ - rsa加密/解密polarssl c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13793634/
我正在寻找 Polarssl AES 计数器模式的示例。无法在任何地方找到它。 Documentation对于我这样的初学者来说很难理解。在polarssl中定义为 int aes_crypt
我必须在我的项目中将 OpenSSL 库更改为 PolarSSL,但我遇到了一些麻烦。当我使用下面的函数加密我的 session key 时 OpenSSL library RSA_public_en
我正在尝试对其中包含土耳其字符的一些数据进行哈希处理。例如;当我使用 Polarssl 对 "aaç" 字符串进行哈希处理时,sha-1 结果如下: 10 bf 94 7f 94 65 9f b0 6
我正在尝试在 Debian Wheezy 上为 ARM 交叉编译 OpenVPN 2.3.4 和 PolarSSL 1.3.7。 PolarSSL 已编译安装在我的主目录中,但 OpenVPN 找不到
我使用 polarssl 的 base64.c 文件来解码一些数据。 int base64_decode( unsigned char *dst, size_t *dlen,
我在 .pem 文件中有一个 rsa 2048 位公钥,我使用此命令“openssl rsa -inform PEM -in rsa_public_key.pem -pubin -text”来获取模块
我正致力于在嵌入式系统中使用 RSA 加密。为此,我将使用 polarssl 代码。 我已经在 128 位上进行了加密,但我在签名部分遇到了问题。当我运行代码时,验证时出现填充错误 (POLARSSL
我正在开发一个加密和解密应用程序。我使用 bignum 算法。这就是 polarSSL。在 Xcode 模拟器中,它运行良好并且可以成功解密文件。但是当我在真实设备(iPad 4)上运行相同的项目时,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我在 ndk 项目中使用 PolorSSL。但是,当我运行 mpi_self_test() 时,它会导致 Android 5.0 及更高版本崩溃。 int mpi_self_test( int ver
我正在编写一个安全性基于 crypt_and_hash example 的应用程序随 PolarSSL 包一起提供。在示例中,crypt_and_hash 接受一个 key (通过命令行参数提供)和一
我是一名优秀的程序员,十分优秀!