Что определяет размер BIGNUM в разных криптоалгоритмах? - PullRequest
0 голосов
/ 02 марта 2020

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

Например:

  1. DSA подпись
typedef struct DSA_SIG_st {
    BIGNUM *r;
    BIGNUM *s;
} DSA_SIG;
ECDSA подпись
typedef struct ECDSA_SIG_st {
    BIGNUM *r;
    BIGNUM *s;
} ECDSA_SIG;
эллиптический c кривой закрытый ключ
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 */ ;
Структура 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;
};

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

1 Ответ

2 голосов
/ 03 марта 2020

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

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

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

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

...