2014-11-03 233 views
1

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

//----------------------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)); 

回答

1

如果执行填充,密文应该有固定的大小等于RSA公钥模量。如果你每次都得到不同的尺寸,那么你的程序就有一些东西。

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

strlen(const char * str)计算以空字符结尾的字符串的长度。 encrypt不是空字符串,因此使用strlen在此处无效。幸运的是,PKCS#1填充包含零字节,所以不会出现段错误。

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

+0

为什么RSA_size(rsa) - 11?是一个固定值?我这样做了,但仍然是相同的结果。 – Kahn 2014-11-04 11:54:50

+0

由于RSA_PKCS1_PADDING的长度至少为11个字节。也许你应该说明你是如何分配'encrypted'和'decrypted'的。 – divanov 2014-11-04 14:31:40

+0

请参阅编辑,我粘贴了不起作用的代码。 – Kahn 2014-11-04 16:31:50