OpenSSL RSA-2048未加密块比它应该更长

时间:2013-12-10 02:51:50

标签: c encryption cryptography openssl rsa

我正在使用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)。有谁知道导致这个问题的原因或我做错了什么?

编辑:这是我遇到的问题的一个示例,具体代码(:))。顺便说一句,我排除了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;

}

1 个答案:

答案 0 :(得分:0)

一切工作现在都很精细。我能够通过将为解密字符串分配的内存大小增加到strlen(TestString)+ 1来解决问题,以便存储我认为的空终止符。我的猜测是,当我在之前的分配大小中没有足够的空间时,相邻的RAM泄漏了。我希望这可以帮助其他任何有这类问题的人。感谢。