C++ RSA:如何将char*表拆分为块进行加密?

C++ RSA:如何将char*表拆分为块进行加密?,c++,encryption,cryptography,rsa,C++,Encryption,Cryptography,Rsa,我正在编写自己的RSA实现。我发现很难找到选择要加密的数据块大小的正确方法。我已经实现了正确的密钥生成,唯一剩下的是加密,它已经实现了,但不能正常工作 这是我的密码: template < typename NumberType, typename EncryptionResultType, typename DecryptionResultType, typename DataProvider, ty

我正在编写自己的RSA实现。我发现很难找到选择要加密的数据块大小的正确方法。我已经实现了正确的密钥生成,唯一剩下的是加密,它已经实现了,但不能正常工作

这是我的密码:

template
    <
        typename NumberType,
        typename EncryptionResultType,
        typename DecryptionResultType,
        typename DataProvider,
        typename RandomNumberProvider
    >
EncryptionResultType RSAAlgorithm
                    <
                        NumberType,
                        EncryptionResultType,
                        DecryptionResultType,
                        DataProvider,
                        RandomNumberProvider
                    >

::Encrypt(DataProvider * provider)

{

    char * data = provider->ProvideData();
    long size = strlen(data);

    size_t chunkSize = sizeof(NumberType);

    char * result = new char[size];

    for(NumberType i=0;i < size;i+=chunkSize)
    {

        NumberType dataChunkAsNumber = 0;
        memcpy(&dataChunkAsNumber,data+i,chunkSize);
        NumberType value = ModularPower<NumberType>(dataChunkAsNumber, publicKey, modulus);
        memcpy(result+i,&value,chunkSize);
    }
    return result;
}
将实施关于隐式转换、数据提供程序类型接口正确性等的任何必要静态检查,但这不是重点: 问题是——给定的NumberType可能很长,或者某个BigNumber库具有NumberType类型的公钥,我如何计算,或者仅仅告诉要加密的数据块的算法大小的最佳/最有效性

我做了这个尝试。 在我不理解的情况下,我们取一块可以保存在NumberType中的文本,并使用它的二进制表示来创建具有相同二进制表示形式的NumberType——让我们称之为Mi,使用memcpy。我们使用modular power->对它进行加密,我们得到另一个NumberType让我们称之为Ci,解密后应该会返回Mi。当我们获取结果的二进制表示并将其memcpy到char*时,我们应该返回文本。但这行不通。 有人知道我做错了什么吗

编辑::对于测试,我使用了char*,它的大小是sizeofNumberType的乘积

RSA输出大小
简而言之,RSA加密公式是:m^e mod n,它用0@owlstead:Re 1加密消息m:我没有说没有混合加密,RSA就不安全,只是说它不适合直接加密数据。结合下面的句子,我知道你是如何得到这样的印象的,所以我通常添加了限定词来让它更清楚。Re 2:如果我没记错的话,OAEP的安全性降低依赖于这样一个事实,即不可能计算F_n中随机元素的eth根。我提出的密钥派生方案,或者更确切地说,是从密码学工程中复制出来的,因为这个答案更直接地使用了这个假设。@owlstead:我敢说它比OAEP更严密,由于它只减少了数字的空间,随机值m的选择因子小于2,因此不需要掩码生成函数所需的随机预言假设。相反,它要求哈希函数不会将熵显著降低到256bit以下,并且需要一个安全的认证加密方案。编辑中添加的新脚注»也解释了我不喜欢OAEP,因为它给实施错误留下了很大的空间,而且总体上比上面提出的方案更复杂。对不起,我没有时间回应,我已经对此投了赞成票。m太短的可能性显然是微不足道的,我看不出该方案有任何直接的缺点。