0

我使用 openssl demos 中的示例进行 rsa 加密和解密,它可以工作,但加密后的数据与加密前的文本不同。,我需要它是相同的 .. 所以我在哪里可以修改代码所以它可以返回相同的数据大小而不会损坏加密过程。,??提前致谢 ..

下面是代码:

#include <stdlib.h>
#include <stdio.h>
#include <strings.h>

#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>

#include "loadkeys.h"

#define PUBFILE   "cert.pem"
#define PRIVFILE  "privkey.pem"
#define STDIN     0
#define STDOUT    1 

int main()
{
    char *ct = "This the clear text";
char *buf;   
char *buf2;
EVP_PKEY *pubKey;
EVP_PKEY *privKey;
int len;

    ERR_load_crypto_strings();

    privKey = ReadPrivateKey(PRIVFILE);
    if (!privKey) 
{  
    ERR_print_errors_fp (stderr);    
    exit (1);  
}

    pubKey = ReadPublicKey(PUBFILE);  
if(!pubKey)
{
   EVP_PKEY_free(privKey);   
       fprintf(stderr,"Error: can't load public key");
   exit(1);
}

/* No error checking */
    buf = malloc(EVP_PKEY_size(pubKey));
    buf2 = malloc(EVP_PKEY_size(pubKey));

len = RSA_public_encrypt(strlen(ct)+1, ct, buf, pubKey->pkey.rsa,RSA_PKCS1_PADDING);

if (len != EVP_PKEY_size(pubKey))
{
    fprintf(stderr,"Error: ciphertext should match length of key\n");
    exit(1);
}

printf("%d\n", strlen(buf));
printf("%d\n", strlen(ct));
RSA_private_decrypt(len, buf, buf2, privKey->pkey.rsa,RSA_PKCS1_PADDING);

printf("%s\n", buf2);

EVP_PKEY_free(privKey);
EVP_PKEY_free(pubKey);
free(buf);
free(buf2);
    return 0;
 }
4

1 回答 1

1

我不确定您是否了解RSA 加密的工作原理。

RSA 加密产生的密文块与 RSA 密钥对的模数一样宽。这不是 RSA 加密/解密过程的可协商属性。如果您使用的是 1024 位 RSA 密钥,您将获得每个密文输入“块”的 128 字节密文,并且每个块的范围可以从 1 个字节到模数的大小(少一点,实际上,在这里阅读更多关于PKCS#1 标准的信息)。同样,一个 2048 位的密钥将生成一个 256 字节的密文。

RSA很贵;事实上,大多数非对称算法都是。出于这个原因,使用 RSA 加密对称算法密钥(如 AES128 密钥)更为常见,也称为“会话”密钥,在使用所述密钥加密您的实际数据之后,然后发送加密的会话密钥和将加密数据发送给收件人。如果接收者拥有正确的私有 RSA 密钥,他们可以解密会话密钥,然后使用对称地解密实际数据。

如果您想要小块加密数据,请使用对称加密。你有更多的选择灵活性。

有关 RSA 加密的更多信息,请参见此处。有关对称加密标准 AES 加密的信息,请参见此处

于 2012-10-08T04:07:25.297 回答