Что определяет размер BIGNUM в разных криптоалгоритмах?

Я играю с OpenSSL. Я вижу, что разные типы openssl используют тип BIGNUM.

Например:

  1. подпись DSA
typedef struct DSA_SIG_st {
    BIGNUM *r;
    BIGNUM *s;
} DSA_SIG;
  1. Подпись ECDSA
typedef struct ECDSA_SIG_st {
    BIGNUM *r;
    BIGNUM *s;
} ECDSA_SIG;
  1. закрытый ключ эллиптической кривой
struct ec_key_st {
    int version;
    EC_GROUP *group;
    EC_POINT *pub_key;
    BIGNUM *priv_key;
    unsigned int enc_flag;
    point_conversion_form_t conv_form;
    int references;
    int flags;
    EC_EXTRA_DATA *method_data;
} /* EC_KEY */ ;
  1. Структура RSA
struct rsa_st {
    /*
     * The first parameter is used to pickup errors where this is passed
     * instead of aEVP_PKEY, it is set to 0
     */
    int pad;
    long version;
    const RSA_METHOD *meth;
    /* functional reference if 'meth' is ENGINE-provided */
    ENGINE *engine;
    BIGNUM *n;
    BIGNUM *e;
    BIGNUM *d;
    BIGNUM *p;
    BIGNUM *q;
    BIGNUM *dmp1;
    BIGNUM *dmq1;
    BIGNUM *iqmp;
    /* be careful using this if the RSA structure is shared */
    CRYPTO_EX_DATA ex_data;
    int references;
    int flags;
    /* Used to cache montgomery values */
    BN_MONT_CTX *_method_mod_n;
    BN_MONT_CTX *_method_mod_p;
    BN_MONT_CTX *_method_mod_q;
    /*
     * all BIGNUM values are actually in the following data, if it is not
     * NULL
     */
    char *bignum_data;
    BN_BLINDING *blinding;
    BN_BLINDING *mt_blinding;
};

BIGNUM в OpenSSL:

struct bignum_st {
    BN_ULONG *d;                /* Pointer to an array of 'BN_BITS2' bit
                                 * chunks. */
    int top;                    /* Index of last used d +1. */
    /* The next are internal book keeping for bn_expand. */
    int dmax;                   /* Size of the d array. */
    int neg;                    /* one if the number is negative */
    int flags;
};

Я не могу понять, как подобрать бигнумы для конкретного алгоритма и как насчет размера массива бигнумов?


person Anisyanka    schedule 02.03.2020    source источник


Ответы (1)


Во-первых, вы не выделяете фактическое значение bn->d самостоятельно; подпрограммы BN_* делают это и при необходимости повторяют/изменяют за вас. Для неустаревших версий OpenSSL эти структуры (и почти все остальные) непрозрачны, и вы вообще не можете получить к ним прямой доступ, хотя я могу понять желание узнать о них.

Для криптографических алгоритмов, использующих числа (а не просто битовые шаблоны), используемые числа зависят от алгоритма. Для RSA см. статью в Википедии, и если ссылка PKCS1 на RSA Labs больше не работает (после EMC и Dell) вместо этого используйте стабильные дубликаты RFC 2313, 2437, 4347, 8047 IETF. Существуют и другие стандарты для RSA от ANSI/X9 и ISO, но они используются реже и существенно не отличаются. Для DSA см. снова википедия и (бесплатно) FIPS. Для ECDSA вы можете увидеть платный X9.62 или бесплатный SEC1 из SECG, но на самом деле это просто прямая адаптация DSA к (большому) классу эллиптических кривых в форме Вейерштрасса. Как для DSA, так и для ECDSA значения, которые появляются в подписях, вычисляются, никогда не выбираются, хотя на них влияет одноразовый номер k для каждой операции, который может быть и обычно выбирается случайным образом, единообразно в [1 , n-1], где n — порядок (размер) подгруппы. Обратите внимание, что для «простых» кривых, наиболее часто используемых с ECDSA, таких как P-256 и P-384, кривая была разработана таким образом, чтобы порядок подгруппы равнялся порядку кривой, который, в свою очередь, близок, но не совпадает с модулем основное основное поле. Однако это свойство именно этих кривых, а не ECDSA или ECC в целом.

На практике ключи для всех алгоритмов должны быть либо сгенерированы (в OpenSSL) путем вызова соответствующих функций генерации ключей либо напрямую, либо с использованием EVP_PKEY_* API, либо импортированы из какого-либо другого программного обеспечения или системы, которые сгенерировали их с помощью правильно реализованного процесса. Точно так же подписи должны быть созданы путем вызова функций для подписи напрямую или через EVP, или получены от чего-то еще, что создало их правильно. Весь код OpenSSL бесплатен (как речь, так и пиво), так что вы можете посмотреть на него и посмотреть, что он делает; некоторые люди (включая меня) считают полезным хотя бы иногда компилировать такой код в системе с хорошим отладчиком исходного кода и выполнять его, чтобы посмотреть, что он делает.

Стандартное предостережение: если вы просто хотите поиграть с криптографией или какой-то конкретной реализацией, такой как OpenSSL, вырубитесь. Если вы собираетесь писать программное обеспечение, предназначенное для обеспечения безопасности, НЕ делайте это путем догадок или проб и ошибок; либо использовать (существующее) программное обеспечение, написанное людьми, которые знают, что они делают, либо нанимать таких людей или консультироваться с ними. очень легко написать "защитное" программное обеспечение, которое кажется работающим и проходит тестирование, но на самом деле небезопасно, и люди, которые (в отличие от вас) действительно разбираются в предмете и знают, как найти эти недостатки, будут враги ваши или ваших пользователей.

person dave_thompson_085    schedule 03.03.2020