我正在使用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.
我甚至尝试通过用9替换strlen(Text)来手动限制DecryptedString的长度(一个额外的null终止符),得到了相同的结果。
我使用GlobalAlloc和GMEM_FIXED | GMEM_ZEROINIT
的原因是因为我被告知将内存归零可能会解决我的问题,但它没有占上风。我正在使用OpenSSL的标准RSA加密和解密功能(RSA_public_encrypt
& RSA_private_decrypt
,我或多或少遵循this guide)。有谁知道导致这个问题的原因或我做错了什么?
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;
}
答案 0 :(得分:0)
一切工作现在都很精细。我能够通过将为解密字符串分配的内存大小增加到strlen(TestString)+ 1来解决问题,以便存储我认为的空终止符。我的猜测是,当我在之前的分配大小中没有足够的空间时,相邻的RAM泄漏了。我希望这可以帮助其他任何有这类问题的人。感谢。