如何使用RSA加密/解密长输入消息?[Openssl,C]

ivy*_*ivy 7 c encryption openssl cryptography rsa

我写了一个简单的测试程序来加密/解密消息.

我有一个keylength:

int keylength = 1024; // it can also be 2048, 4096

和最大输入长度:

int maxlen = (keylength/8)-11;

我知道我的输入大小应该<而不是maxlen,如下所示:

if(insize >= maxlen)
        printf("cannot encrypt/decrypt!\n");
Run Code Online (Sandbox Code Playgroud)

我的问题很简单 - 是否有可能(如果是这样,我该怎么做)加密/解密RSA消息比maxlen

主代码也非常简单,但仅在insize <maxlen时有效:

   if((encBytes=RSA_public_encrypt(strlen(buff1)+1, buff1, buff2, keypair, RSA_PKCS1_PADDING)) == -1)
    {
        printf("error\n");
    }

    if((decBytes=RSA_private_decrypt(encBytes, buff2, buff3, keypair, RSA_PKCS1_PADDING)) == -1)
    {
        printf("error\n");
    }
Run Code Online (Sandbox Code Playgroud)

Nic*_*sky 6

加密长消息需要组合方案 - RSA算法加密会话密钥(即AES密钥),数据本身用该密钥加密.我建议不要发明另一辆自行车并使用完善的方案,即PKCS#7/CMS或OpenPGP,具体取决于您的需求.


Ebb*_*sen 6

您将能够使用RSA加密长消息,就像使用分组密码一样。也就是说,以块的形式对消息进行加密,并使用适当的链接模式绑定块。然而,这不是通常的方法,并且您在使用的库中找不到对它的支持(RSA 链接)。

由于RSA速度相当慢,因此加密大消息的常用方法是使用混合加密。在混合加密中,您使用快速对称加密算法(如AES)通过随机密钥加密数据。然后使用RSA加密随机密钥并与对称密钥加密数据一起发送。

编辑:

至于你的实施之前,你有insize = 1300和 ,keylength = 1024它给出了maxlen = 117。要加密完整消息,您需要 12 次加密,每次加密产生 128 字节,加密大小为 1536 字节。在您的代码中,您仅分配 1416 字节的缓冲区。另外,您似乎不允许 128 字节输出,因为您仅在以下位置增加 117:

RSA_public_encrypt(maxlen, buff1+i, buff2+i, keypair, RSA_PKCS1_PADDING)
Run Code Online (Sandbox Code Playgroud)

i += maxlen;
Run Code Online (Sandbox Code Playgroud)


小智 2

在这种情况下,您可以使用 RSA 作为分组密码。即将消息分成几个小于 maxlen 的块。否则不可能。