gpt4 book ai didi

c++ - rsa加密/解密polarssl c++

转载 作者:太空狗 更新时间:2023-10-29 21:47:04 29 4
gpt4 key购买 nike

我正在使用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com