c - OpenSSL RSA-2048 未加密 block 比应有的长度长

标签 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。

我什至尝试通过将 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/

相关文章:

c - 尽管内存已被释放,Valgrind 仍检测到内存泄漏

php - 如何制作带有自定义字段的 PayPal 加密立即购买按钮?

Java:Cipher包(加密和解密)。无效 key 错误

c# - HMACSHA512 构造函数和工厂之间的区别

c - c 中的 fread() 怪异行为

c - 带十六进制负值的 sscanf

cryptography - 使用 OpenSSL 的 ECDSA 签名,没有 ASN1 编码哈希

security - 如何处理根证书的吊销?

c - 试图找到质数

algorithm - 加密算法和按位奇偶校验