Длина подписи ECDSA

Какой будет длина подписи для 256-битного ключа EC в алгоритме ECDSA? Я хотел проверить длину подписи для того же самого. Было бы здорово, если бы кто-нибудь помог мне с одним набором ключей EC.


person Jeet    schedule 24.06.2013    source источник
comment
Stack Overflow - это сайт для вопросов по программированию и разработке. Этот вопрос кажется не по теме, потому что он не о программировании или разработке. См. Какие темы можно задать здесь в Справочном центре. Возможно, Обмен стеками криптографии или Обмен стеками информационной безопасности Лучше бы спросить место.   -  person jww    schedule 18.02.2018


Ответы (1)


Это зависит от того, как вы кодируете подпись. Это сегмент кода из OpenSSL, который измеряет длину подписи ECDSA в формате DER.

/** ECDSA_size
 * returns the maximum length of the DER encoded signature
 * \param  eckey pointer to a EC_KEY object
 * \return numbers of bytes required for the DER encoded signature
 */

int ECDSA_size(const EC_KEY *r)
{
    int ret,i;
    ASN1_INTEGER bs;
    BIGNUM  *order=NULL;
    unsigned char buf[4];
    const EC_GROUP *group;

    if (r == NULL)
        return 0;
    group = EC_KEY_get0_group(r);
    if (group == NULL)
        return 0;

    if ((order = BN_new()) == NULL) return 0;
    if (!EC_GROUP_get_order(group,order,NULL))
    {
        BN_clear_free(order);
        return 0;
    } 
    i=BN_num_bits(order);
    bs.length=(i+7)/8;
    bs.data=buf;
    bs.type=V_ASN1_INTEGER;
    /* If the top bit is set the asn1 encoding is 1 larger. */
    buf[0]=0xff;    

    i=i2d_ASN1_INTEGER(&bs,NULL);
    i+=i; /* r and s */
    ret=ASN1_object_size(1,i,V_ASN1_SEQUENCE);
    BN_clear_free(order);
    return(ret);
}

Результатом вышеупомянутой функции с параметром EC_KEY на кривой prime256 в качестве параметра является

sig_len = ECDSA_size(eckey);

где sig_len - это 72.

Вам потребуется 72 байта для подписи ECDSA, закодированной в DER, с использованием 256-битного ключа EC.

person Chiara Hsieh    schedule 26.06.2013
comment
Обратите внимание, это максимальная длина; значительная часть фактических значений подписи короче. Если вы работаете с ними самостоятельно, можно добавить конечное неиспользуемое пространство, например. в столбце базы данных фиксированного размера, но для проверки полученного значения или при вставке составной части, такой как сертификат X.509, вы должны поддерживать переменную длину. - person dave_thompson_085; 16.02.2018
comment
Как вы сказали, это зависит от кодировки. P1363 нужно всего 64 байта. А для кодировки OpePGP требуется всего 66 байтов. Как вы отметили, ASN.1 / DER требует до 72 байтов. Для DER требуется минимальное количество байтов. Если используется ASN.1 / BER, то подпись может составлять сотни байтов. Просто заполните INTEGER слева строкой из 0. Я считаю, что BER - это тот случай, на который указал @dave_thompson. - person jww; 18.02.2018
comment
@jww: есть другие кодировки, но OpenSSL выводит только DER, и этот ответ использует OpenSSL и явно говорит DER, и это то, что я комментировал. Однако BER не допускает "завышенных" INTEGER (или составных); все, что он мог сделать, это сделать ПОСЛЕДОВАТЕЛЬНОСТЬ неопределенной с помощью EOC, что добавляет только 2 октета (и они завершают нули, что некоторые искажают!) - person dave_thompson_085; 18.02.2018