1

我正在使用带有 Brainpool256r1 曲线和 SHA1 哈希的椭圆曲线签名的 CVC 证书(如果您还没有听说过它们,就假装它们是 X509)。在带有 bouncycastle 的 java 中,我只是像这样验证它们:

Signature sign = Signature.getInstance("SHA1withECDSA", "BC");
sign.initVerify(key);
sign.update(certificate_data_to_be_verified);
sign.verify(signature);

一切正常。但是,我还需要在嵌入式设备中验证它们,我遇到了一个问题,因为我应该使用最左边的 256 位哈希来获得z 至少根据维基百科 ECDSA 文章的值。但 SHA1 只有 160 位。

bouncycastle如何解决这个问题,是否有一些关于如何处理这个问题的一般理论?

4

1 回答 1

2

您将基点的顺序与密钥长度混淆了。

以下是Bouncy Castle 代码执行 ECDSA 数字签名验证的方式。

private BigInteger calculateE(BigInteger n, byte[] message)
{
    /* n is curve order value */
    int log2n = n.bitLength();
    /* and message is a hash */
    int messageBitLength = message.length * 8;

    BigInteger e = new BigInteger(1, message);
    /* If message is longer than curve order */
    if (log2n < messageBitLength)
    {
        /* only log2n bits are taken from the left */
        e = e.shiftRight(messageBitLength - log2n);
    }
    return e;
}
于 2013-11-28T19:22:58.437 回答