C++ 使用公钥的RSA加密。基于密钥的数据大小

C++ 使用公钥的RSA加密。基于密钥的数据大小,c++,openssl,size,rsa,C++,Openssl,Size,Rsa,我正在使用OpenSSL RSA API用服务器的公钥加密数据 uint32_t rsasize = RSA_size(keypair); // -- RSA key size == 256 uint32_t dl = 255 uint8_t *d; // points to 255 bytes of data unsigned char *encrypt = (unsigned char*)malloc(rsasize); auto num = RSA_public_encrypt(dl

我正在使用OpenSSL RSA API用服务器的公钥加密数据

uint32_t rsasize = RSA_size(keypair); // -- RSA key size == 256

uint32_t dl = 255
uint8_t *d; // points to 255 bytes of data

unsigned char *encrypt = (unsigned char*)malloc(rsasize);

auto num = RSA_public_encrypt(dl, d, encrypt, keypair, RSA_NO_PADDING);
if ( num == -1 )
{
    auto err = malloc(130);
    ERR_load_crypto_strings();
    ERR_error_string(ERR_get_error(), (char*)err);
    printf("Error encrypting message: %s\n", err);
    return nullptr;
}
我使用的是
RSA\u NO\u PADDING
,因此RSA应该轻松地用256字节的公钥加密255字节。但我收到的是:

Error encrypting message: error:0406B07A:rsa routines:RSA_padding_add_none:data too small for key size
我将dl(数据长度)更改为256(仅+1),得到以下结果:

Error encrypting message: error:04068084:rsa routines:RSA_EAY_PUBLIC_ENCRYPT:data too large for modulus

我知道RSA可以用256个密钥编码255个字节。有什么问题吗?

你填错了。如果您有255字节的数据,并且希望将其填充到256字节,则应在高阶端添加一个零字节。换句话说,您应该在d[0]之前插入一个0。

您在错误的一端填充。如果您有255字节的数据,并且希望将其填充到256字节,则应在高阶端添加一个零字节。换句话说,您应该在d[0]之前插入一个0。

您可能需要使用填充。但如果不使用填充,则必须使用
dl==rsasize
。我将验证
rsasize
是否是您认为适合您的配对。我不能使用填充,因为我想用256键对255个字节进行编码。填充将增加对数据最大长度的限制(它仅适用于dl From:“RSA_size()以字节为单位返回RSA模数大小。它可用于确定必须为RSA加密值分配多少内存。”您可能想使用填充。但如果不使用填充,则必须使用
dl==rsasize
。我将验证
rsasize
是否是您认为适合您的配对。我不能使用填充,因为我想用256键对255个字节进行编码。填充将增加对数据最大长度的限制(仅适用于dl From:“RSA_size()返回RSA模数大小(以字节为单位)。它可用于确定必须为RSA加密值分配多少内存。“对不起,我没有使用填充,我正好有255字节的数据。我试图添加一个额外的字节,以获得256字节(等于密钥大小),但它返回不同的错误(请参阅我的帖子)。您忽略了我写的内容。“添加一个额外的”字节是填充。您只需要在另一端进行填充。您也这样做了。我已经尝试过了。OpenSSL表示“数据对于模数来说太大”。对于任意256(255+1)字节数据如果高阶数据字节为零,则消息不可能。抱歉,但我不使用填充,我正好有255字节的数据。我试图添加一个额外的字节,以获得256字节(等于密钥大小),但它返回不同的错误(请参阅我的帖子)。您忽略了我写的内容。“添加一个额外的字节。”“字节是填充的。你只需要在另一端进行填充。你也这样做了。我已经尝试过了。OpenSSL说“数据对于模数来说太大了”。对于任何256(255+1)字节的数据,如果高阶数据字节为零,则该消息是不可能的。