gpt4 book ai didi

c++ - RSA_Private_Decrypt 随机失败

转载 作者:太空宇宙 更新时间:2023-11-04 11:25:52 24 4
gpt4 key购买 nike

我不是加密专家,但我编写了加密/解密方法。我不知道我在这里做错了什么。 encryptKey 方法每次都为相同的字符串返回可变文本长度,这可能是由于我正在使用的 RSA_PKCS1_PADDING,但对于相同的文本字符串,decryptKey如果加密文本长度低于某个阈值,函数将失败。

//----------------------Encryption -----------------------
int Asymmetric::encryptKey(unsigned char *data, int data_len, unsigned char *encrypted)
{
RSA * rsa = createRSA(1); // Loads the public key
int result = RSA_public_encrypt(data_len,data,encrypted,rsa,padding);
return result;
}
//-----------------------Decryption -----------------------
int Asymmetric::decryptKey(unsigned char * enc_data,int data_len, unsigned char *decrypted)
{
RSA * rsa = createRSA(0); // Loads the private key
int result = RSA_private_decrypt(data_len,enc_data,decrypted,rsa,padding);
return result;
}

我该如何克服这种情况?

编辑:
此代码不起作用

char *myData = "Sample Text";
unsigned char *encrypt = (unsigned char*)malloc(RSA_size(rsaPub));
int result = RSA_public_encrypt(RSA_size(rsaPub)-11 ,(unsigned char*)myData,encrypt,rsaPub,padding);
fprintf(stderr, "\nEnc Size: %d \n", strlen((const char*)encrypt));

最佳答案

如果执行填充,密文的固定大小应等于 RSA 公钥模数。如果你每次都得到不同的大小,那么你的程序就有问题了。

当你执行加密时,data必须小于RSA_size(rsa) - 11并且encrypted必须指向RSA_size(rsa ) 字节内存。

strlen(const char * str) 计算以 null 结尾的字符串的长度。 encrypt 不是字符串,也不是空终止的,所以在这里使用 strlen 是无效的。幸运的是,PKCS#1 填充包含零字节,因此您不会遇到段错误。

另一方面,myData 一个空终止字符串。但是,您使用 RSA_size(rsaPub) - 11 作为其长度,这将导致偶尔出现段错误。

关于c++ - RSA_Private_Decrypt 随机失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26714704/

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