Шифрование OpenSSL RSA без заполнения не в состоянии правильно шифровать - PullRequest
3 голосов
/ 28 апреля 2011

Мы пытаемся выполнить шифрование 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), можно ли это использовать, и если да, как это преобразование будет работать?

Любая помощь очень ценится, спасибо!

1 Ответ

1 голос
/ 19 декабря 2011

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

...