RSA_Private_Decrypt随机失败
RSA_Private_Decrypt fails randomly
我不是加密专家,但我编写了加密/解密方法。我不知道我在这里做错了什么。encryptKey方法每次为同一字符串返回可变文本长度,这可能是由于我正在使用的RSA_PKCS1_PADDING,但对于同一文本字符串,如果加密的文本长度低于某个阈值,decryptKey[/strong>函数将失败
//----------------------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)
计算空终止字符串的长度。encrypt
不是字符串,也不是以null结尾的,因此在这里使用strlen
是无效的。幸运的是,PKCS#1填充包含零字节,所以您不会出现分段错误。
另一方面,myData
是以null结尾的字符串。但是,使用RSA_size(rsaPub) - 11
作为其长度,这将导致偶尔出现分段错误。
相关文章:
- 如果没有malloc,链表实现将失败
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- OpenSSL RSA 解密随机失败 C/C++
- 测试随机失败
- 如何创建随机内存分配失败
- 似乎是随机程序在完成C++时失败
- 使用快速英特尔随机生成器(SSE2)会因堆栈问题而失败..已损坏
- 在Windows上等待进程随机失败
- 从管道读取随机失败
- RSA_Private_Decrypt随机失败
- 在CentOS 6.4上使用Boost.Regex 1.53和gcc 4.8.1随机断言失败
- 随机运行失败与简单的计数项目