OpenSSL RSA_public_encrypt странное поведение

пытаюсь написать простую процедуру шифрования в C, используя OpenSSL, и янашел что-то странное. Я'Я не гуру C и не профессионал OpenSSL. Так что я мог ошибиться.

Функция выглядит следующим образом

char *rsa_encrypt(char *data)
{
    const char xponent_in_hex[] = "010001";
    const char modulus_in_hex[] = "D0BA16F11907E7B0819705A15264AC29BEE9F1EC5F22642992
    D3E27100B7F212864A624A12FFB6D531712B0B0225AAD0C2E313D077A7DB2A5A33483EEFF41A9D";    

    BIGNUM *xponent = NULL;
    BIGNUM *modulus = NULL;

    BN_hex2bn(&xponent, xponent_in_hex);
    BN_hex2bn(&modulus, modulus_in_hex);

    RSA *rsa = RSA_new();
    rsa->e = xponent;
    rsa->n = modulus;
    rsa->iqmp = NULL;
    rsa->d = NULL;
    rsa->p = NULL;
    rsa->q = NULL;

    char encoded[512] = { 0 };
    RSA_public_encrypt(
    strlen(data), 
    (const unsigned char *)data, 
    (unsigned char *)encoded,
    rsa, 
    RSA_PKCS1_OAEP_PADDING
);

    RSA_free(rsa);

    return (encoded);
}

int _tmain(int argc, _TCHAR* argv[])
{
    printf("%s\n", base64_encode(rsa_encrypt("ABC")));
    printf("%s\n", base64_encode(rsa_encrypt("ABC")));
    printf("%s\n", base64_encode(rsa_encrypt("ABC")));
}

Я вызываю эту функцию для одних и тех же данных несколько раз, и она генерирует разные значения при каждом вызове. Это видимонеправильно так какпоказатель степени а такжемодуль для созданногоСтруктура RSA постоянны и входные данные одинаковы при каждом вызове.

Так почемуRSA_public_encrypt так себя ведет?

Как мне сгенерировать открытый ключ для шифрования RSA на основепоказатель степени а такжемодуль?

И где ясделали ошибку?

Ответы на вопрос(2)

Решение Вопроса

и выне ошибаюсь. Ваша путаница проистекает изRSA_PKCS1_OAEP_PADDING параметр до.RSA_public_encrypt

Процесс шифрования RSA на самом деле:

Возьмите открытый текст (обычный) ишифровать это, производя encoded_plain.Зашифровать encoded_plain.

(Как и следовало ожидать, процесс расшифровки требует, чтобы вы расшифровали значение, а затем расшифровали сообщение).

RSA_PKCS1_OAEP_PADDING Параметр указывает, как следует кодировать открытый текст (использовать кодировку OAEP).

Упрощенное объяснение состоит в том, что заполнение OAEP использует некоторые случайные значения для заполнения, так что обаxxxxxxxABC а такжеyyyyyyyABC а такжеzzzzzzzABC все допустимые значения encoded_plain для вашего открытого текста, и эти encoded_plain зашифровывают к другому значению. Если вы выполняете соответствующую расшифровку (и декодировать, передавая тот жеRSA_PKCS1_OAEP_PADDING Параматер кRSA_private_decryptОперация, вы все равно должны получитьABC» в качестве вывода для каждого из зашифрованных текстов, поскольку отступы удаляют все три.

(Если вы хотите быть точным, схема кодирования OAEP является более сложной, чем, см.RFC 3447 раздел 7.1.1, Но это, вероятно, детали, которые вы нене волнует.)

 anonim15 нояб. 2012 г., 07:51
Действительно спасибо за ваш добрый ответ. openssl звучит мощно, но плохо документировано.

указатель возврата будет указывать на недопустимую область памяти, которая может не содержать того, что вы ожидаете, потому что кто-то другой (например, другой поток) записал поверх нее. Ответ, объясняющий отступы, правильный.

Ваш ответ на вопрос