C++ RSA加密更改数据大小

C++ RSA加密更改数据大小,c++,openssl,rsa,C++,Openssl,Rsa,我使用了openssl演示中的rsa加密和说明示例,它可以工作,但加密后的数据与加密前的文本不同。我需要它是相同的。。那么,我在哪里可以修改代码,使其返回相同的数据大小,而不会损坏加密过程??提前谢谢 代码如下: #include <stdlib.h> #include <stdio.h> #include <strings.h> #include <openssl/rsa.h> #include <openssl/evp.h> #i

我使用了openssl演示中的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;
 }
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“loadkeys.h”
#定义PUBFILE“cert.pem”
#定义PRIVFILE“privkey.pem”
#定义标准0
#定义标准输出1
int main()
{
char*ct=“这是明文”;
char*buf;
char*buf2;
执行副总裁*公开密钥;
执行副总裁*私钥;
内伦;
错误加载加密字符串();
privKey=ReadPrivateKey(PRIVFILE);
如果(!privKey)
{  
错误打印错误fp(stderr);
出口(1);
}
pubKey=ReadPublicKey(PUBFILE);
如果(!pubKey)
{
免费执行副总裁(私钥);
fprintf(stderr,“错误:无法加载公钥”);
出口(1);
}
/*无错误检查*/
buf=malloc(执行副总裁(公共钥匙));
buf2=malloc(执行副总裁(公共钥匙));
len=RSA\u public\u encrypt(strlen(ct)+1,ct,buf,pubKey->pkey.RSA,RSA\u PKCS1\u PADDING);
如果(len!=执行副总裁(公共密钥))
{
fprintf(stderr,“错误:密文应匹配密钥长度\n”);
出口(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);
免费执行副总裁(私钥);
免费执行副总裁(公共钥匙);
免费(buf);
自由基(buf2);
返回0;
}

我不确定您是否了解如何工作

RSA加密产生的密文块的宽度与RSA密钥对的模数相同。这不是RSA加密/解密过程的可协商属性。如果您使用的是1024位RSA密钥,那么对于每个“块”的密码文本输入,您将获得128字节的密码文本,每个块的范围从1字节到模的大小(实际上,稍微少一点,请阅读更多)。同样,2048位密钥将生成256字节的密码文本

RSA价格昂贵;事实上,大多数非对称算法都是。因此,在使用对称算法密钥(如AES128密钥)加密实际数据后,使用RSA加密对称算法密钥(也称为“会话”密钥),然后将加密的会话密钥和加密的数据发送给收件人,这种情况更为常见。如果收件人拥有适当的RSA私钥,他们可以解密会话密钥,然后使用该密钥对称地解密实际数据

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

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