Шифрование OpenSSL RSA без заполнения не может правильно зашифровать

Мы пытаемся выполнить шифрование RSA с помощью метода «RSA_public_encrypt ()» (openSSL на Symbian), но нам это не совсем удается. Само шифрование проходит успешно, но зашифрованный текст (который мы пытаемся сопоставить с хешем) не такой, каким должен быть (на других платформах мы это проверили, теперь он работает правильно, и здесь мы получаем другие значения). Мы думаем, что это, вероятно, связано с тем, что входные данные не предоставлены в правильном формате для метода «RSA_public_encrypt ()».

Код:

#define RSA_E 0x10001L
void Authenticator::Test(TDesC8& aSignature, TDesC8& aMessage) {   
RSA *rsa;
char *plainkey;
char *cipherkey;
int buffSize;

// create the public key
BIGNUM * bn_mod = BN_new();
BIGNUM * bn_exp = BN_new();

const char* modulus2 = "137...859"; // 309 digits
// Convert to BIGNUM
int len = BN_dec2bn(&bn_mod, modulus2); // with 309 digits -> gives maxSize 128 (OK!)
BN_set_word(bn_exp, RSA_E);

rsa = RSA_new(); // Create a new RSA key
rsa->n = bn_mod; // Assign in the values
rsa->e = bn_exp;
rsa->d = NULL;
rsa->p = NULL;
rsa->q = NULL;

int maxSize = RSA_size(rsa); // Find the length of the cipher text
// maxSize is 128 bytes (1024 bits)

// session key received from server side, what format should this be in ???
plainkey = "105...205"; // 309 digits

cipherkey = (char *)malloc(maxSize);
memset(cipherkey, 0, maxSize);
if (rsa) {
    buffSize = RSA_public_encrypt(maxSize, (unsigned char *) plainkey, (unsigned char *) cipherkey, rsa, RSA_NO_PADDING);

    unsigned long err = ERR_get_error(); 

    free(cipherkey);
    free(plainkey);
}

/* Free */
if (rsa)
    RSA_free(rsa);

}

У нас есть простой ключ, который состоит из 309 символов, но maxSize составляет 128 байтов (RSA_NO_PADDING, поэтому ввод должен быть равен размеру модуля), поэтому только первые 128 символов зашифрованы (не совсем уверен, правильно ли это?), Что вероятно, поэтому наш зашифрованный текст не такой, каким должен быть. Или есть еще что-то, что мы делаем неправильно? Каким же тогда является правильный способ преобразования нашего простого текста так, чтобы все данные 'plainkey' были зашифрованы?

Мы также попробовали это с шестнадцатеричной строкой «9603cab ...» длиной 256 символов, но безуспешно. Итак, если правильно преобразовать в байты (128), можно ли это использовать, и если да, то как это преобразование будет работать?

Любая помощь приветствуется, спасибо!


person user729103    schedule 28.04.2011    source источник


Ответы (1)


Взгляните на этот файл, возможно, он поможет: https://gist.github.com/850935

person clyfe    schedule 19.12.2011
comment
Спасибо, я больше не работаю над этим проектом, поэтому я не смогу его протестировать. Был ли ваш код специфичным для Symbian или простого C ++? - person user729103; 07.03.2012