我正在使用 OpenSSL 库来加密和解密字符串。这样做时,我能够成功加密字符串并存储它。当我尝试解密时,我遇到的问题就出现了。
我尝试加密和解密的字符串包含在 const unsigned char Text[8]
中。该字符串的长度为 8 个字符。因此,我毫无问题地对其进行加密,但是当我解密该函数并尝试将解密的字符串输出到 char 数组中时,它比应有的长度要长。我的意思是,例如我尝试将解密的字符串输出到如下变量中:
char *DecryptedString = (char *)
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, strlen(Text));
我解密并输出到此,当我printf DecryptedString
时我得到了正确的前 8 个字符,但还有后面的 3 个字符。因此,如果原始字符串是 "2js84js8"
strlen() 为 8 时,输出为 DecryptedString
打印时将是 "2js84js8╝Γ1"
strlen() 为 11。
我什至尝试通过将 strlen(Text) 替换为 9(一个额外的空终止符)来手动限制 DecryptedString 的长度,得到了相同的结果。
我将 GlobalAlloc 与 GMEM_FIXED | GMEM_ZEROINIT
一起使用的原因是因为有人告诉我将内存归零可能会解决我的问题,但它并没有成功。而且我使用的是OpenSSL的标准RSA加密和解密功能( RSA_public_encrypt
& RSA_private_decrypt
,我或多或少遵循了 this guide )。有谁知道是什么导致了这个问题或者我做错了什么?
编辑:这是我遇到的问题的示例,具体代码(:))。顺便说一句,我排除了 openssl 内容的包含内容:
int main()
{
char TestString[] = "d7f3h47k"; // 8 long obviously
RSA *RSAKey = RSA_generate_key(2048, 3, NULL, NULL);
char *EncryptedData = (char *)malloc(RSA_size(RSAKey));
int EncryptLength;
if ((EncryptLength = RSA_public_encrypt(strlen(TestString), (unsigned char *)TestString, (unsigned char *)EncryptedData, RSAKey, RSA_PKCS1_OAEP_PADDING)) == -1) {
printf("Failed encrypt.");
getchar();
return 1;
}
char *DecryptedData = (char *)malloc(strlen(TestString));
if (RSA_private_decrypt(EncryptLength, (unsigned char *)EncryptedData, (unsigned char *)DecryptedData, RSAKey, RSA_PKCS1_OAEP_PADDING) == -1) {
printf("Failed decrypt.");
getchar();
return 1;
}
printf("Original data: %s \nLength of original string: %d \n", TestString, strlen(TestString));
printf("Encrypted data: %s \nLength of encrypted data: %d \n", EncryptedData, strlen(EncryptedData));
printf("Decrypted data: %s \nLength of decrypted data: %d \n", DecryptedData, strlen(DecryptedData));
getchar();
return 0;
}
最佳答案
现在一切正常。我能够通过将分配给解密字符串的内存大小增加到 strlen(TestString) + 1 来解决这个问题,以便存储我认为的空终止符。我的猜测是,当我之前的分配大小中没有足够的空间时,相邻的 RAM 发生了泄漏。我希望这可以帮助其他遇到此类问题的人。谢谢。
关于c - OpenSSL RSA-2048 未加密 block 比应有的长度长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20485144/