我不是加密专家,但我编写了加密/解密方法。我不知道我在这里做错了什么。 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));
答案 0 :(得分:1)
如果执行填充,则密文应具有等于RSA公钥模数的固定大小。如果每次都有不同的大小,那么你的程序就会有所不同。
执行加密时,data
必须小于RSA_size(rsa) - 11
且encrypted
必须指向RSA_size(rsa)
字节的内存。
strlen(const char * str)
计算以null结尾的字符串的长度。 encrypt
不是字符串且未终止,因此使用strlen
在此处无效。幸运的是,PKCS#1填充包含零字节,因此您不会出现分段错误。
另一方面,myData
是一个以空字符结尾的字符串。但是,您使用RSA_size(rsaPub) - 11
作为其长度,这将导致偶尔的分段错误。