1

私は CVC 証明書を使用しています (聞いたことがない場合は、X509 のふりをしてください)、brainpool256r1 曲線と SHA1 ハッシュを使用した楕円曲線署名を使用しています。バウンシーキャッスルを使用したJavaでは、次のように確認するだけです。

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

そして、すべてがうまくいきます。ただし、組み込みデバイスでもそれらを検証する必要があり、ウィキペディア ECDSA の記事z によると、少なくとも左端の 256 ビットのハッシュを使用して値を取得することになっているため、問題が発生しました。しかし、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 に答える