2013-07-19 191 views
2

我正在使用OpenSSL RSA API使用服务器的公钥加密数据。使用公钥进行RSA加密。基于密钥的数据大小

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_NO_PADDING因此RSA应该很容易隐窝255个字节,256字节的公钥。不过,我收到这样的:

Error encrypting message: error:0406B07A:rsa routines:RSA_padding_add_none:data too small for key size 

我改变DL(data_lenght)到256(只+1),我得到这个:

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

我知道,RSA可以编码255个字节256-键。有什么问题?

+0

您可能想要使用填充。但是如果你不使用填充,你会觉得'dl == rsasize'。我会验证'rsasize'是你认为它对你的配对。 – huskerchad

+0

我不能使用填充,因为我想用256个密钥编码255个字节。填充将限制最大长度的数据(它只适用于dl <= 245字节,我只是不记得填充大小)。如果我使用dl == rsasize(256),则会收到rsa例程:RSA_EAY_PUBLIC_ENCRYPT:数据对模数来说太大。根据RSA_size(密钥对) – Jura

+0

根据RSA_size()模块大小以字节为单位,它可以用来确定必须为RSA加密值分配多少内存。“* – jww

回答

3

您填充的是错误的结尾。如果您有255个字节的数据,并且您想将其填充到256,则应在高位端处设置零字节。换句话说,你应该在d [0]之前插入一个0。

+0

对不起,我没有使用填充,我只有255个字节的数据。我试图添加一个额外的字节,有256(等于密钥大小),但它返回不同的错误(请参阅我的文章)。 – Jura

+0

你忽略了我写的东西。 “增加一个额外的”字节是填充。你只需要在另一边做。 –

+0

你也这么做了。我已经尝试过了。 OpenSSL认为“数据模数太大”。对于任何256(255 + 1)字节的数据 – Jura