有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在ECDSA中处理基址顺序较长的短哈希

我使用的是CVC证书(如果你没听说过,假设它们是X509),带有带brainpool256r1曲线和SHA1散列的椭圆曲线签名。在使用bouncycastle的java中,我只需像这样验证它们:

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

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

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


共 (1) 个答案

  1. # 1 楼答案

    将基点顺序与关键点长度混淆

    下面是Bouncy Castle code如何执行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;
    }