2013-07-19 187 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