2013-06-24 7 views
0

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

+0

Stack Overflow - это сайт для вопросов программирования и разработки. Этот вопрос кажется вне темы, потому что речь идет не о программировании или разработке. См. [Какие темы можно задать здесь] (http://stackoverflow.com/help/on-topic) в Справочном центре. Возможно, лучше спросить [Cryptography Stack Exchange] (http://crypto.stackexchange.com/) или [Обмен файлами безопасности] (http://security.stackexchange.com/). – jww

ответ

6

Это зависит от того, как вы кодируете подпись. Это сегмент кода из 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.

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

+0

Обратите внимание, что это максимальная длина; значительная часть фактических значений сигнатуры короче. Если вы будете обрабатывать их самостоятельно, можно включить конечное неиспользуемое пространство, например. в столбце базы данных фиксированного размера, но для проверки полученного значения или при вставке составного файла, такого как сертификат X.509, вы должны поддерживать переменную длину. –

+0

Как вы сказали, это зависит от кодировки. P1363 требуется только 64 байта. И для кодирования OpePGP требуется только 66 байтов. Как вы указали, ASN.1/DER требует до 72 байт. DER требует минимального количества байтов. Если используется ASN.1/BER, то подпись может составлять сотни байтов. Просто поместите «INTEGER» слева с помощью строки 0. Я считаю, что BER - это случай, который указал @dave_thompson. – jww

+0

@jww: есть другие кодировки, но OpenSSL выводит только DER, и этот ответ использует OpenSSL и явно говорит DER, и это то, о чем я комментировал. Тем не менее, BER не допускает «негабаритных» INTEGER (или составных); все, что он может сделать, это сделать SEQUENCE неопределенным с EOC, и это добавит только 2 октета (и они отстают от нулей, которые некоторые смущают!) –

 Смежные вопросы

  • Нет связанных вопросов^_^