【问题标题】:ECDSA signature lengthECDSA 签名长度
【发布时间】:2013-06-24 06:30:04
【问题描述】:

ECDSA 算法中 256 位 EC 密钥的签名长度是多少? 我想验证相同的签名长度。如果有人可以帮助我使用一套 EC 密钥集,那就太好了。

【问题讨论】:

标签: elliptic-curve ecdsa


【解决方案1】:

这取决于您如何对签名进行编码。这是来自 OpenSSL 的代码段,用于测量 DER 格式的 ECDSA 签名的长度。

/** 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);
}

上述函数以prime256曲线上的EC_KEY为参数的结果为

sig_len = ECDSA_size(eckey);

其中 sig_len 是 72

对于使用 256 位 EC 密钥的 DER 编码 ECDSA 签名,您需要 72 字节。

【讨论】:

  • 注意这是最大长度;实际签名值的很大一部分更短。如果自己处理它们,可以包括尾随未使用的空间,例如在固定大小的数据库列中,但为了检查接收到的值,或者在放入像 X.509 证书这样的组合时,您必须支持可变长度。
  • 正如你所说,这取决于编码。 P1363 只需要 64 个字节。而一个 OpePGP 编码只需要 66 个字节。正如您所指出的,ASN.1/DER 最多需要 72 个字节。 DER 需要最少的字节数。如果使用 ASN.1/BER,那么签名可以是数百字节。只需用一串 0 填充左侧的 INTEGER。我相信 BER 就是@dave_thompson 指出的情况。
  • @jww:还有其他编码,但 OpenSSL 只输出 DER,这个答案使用 OpenSSL 并明确表示 DER,这就是我评论的内容。但是,BER 不允许“超大”整数(也不允许复合整数);它所能做的就是用 EOC 使 SEQUENCE 不确定,并且只添加 2 个八位字节(而且它们是尾随零,有些 sw 会弄乱!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
相关资源
最近更新 更多