Java ECDSAwithSHA256 签名长度不一致

Java ECDSAwithSHA256 signature with inconsistent length

所以我尝试在 Java 中生成 ECDSAwithHA256 签名,为此,我使用了 BouncyCastle 提供程序。曲线是secp521r1.

要初始化我正在使用的签名者:

public static final String SIGNATURE_ALGORITHEM = "SHA256withECDSA";

public void init() {
    signer = Signature.getInstance(SIGNATURE_ALGORITHEM, BouncyCastleProvider.PROVIDER_NAME);
    signer.initSign(privKey);
}

为了签名我正在使用

public byte[] sign(byte[] bytes) throws SignatureException {
        signer.update(bytes);
        byte[] signature = signer.sign();
        System.out.println("Signature lenght is " + signature.length);
        return signature;
}

现在唯一的问题是,当我 运行 代码时,我得到的签名长度在 137 到 139 字节之间。但我希望得到的字节数总是相同的。有人知道我必须更改什么吗,我的签名长度始终相同,但仍然是标准化的签名格式?

Java 通常加密,默认情况下使用 Bouncy,使用可变长度的 ASN.1 DER 对 ECDSA(也是 DSA)签名进行编码。参见 neardupe ECDSA signature length and cross https://crypto.stackexchange.com/questions/33095/shouldnt-a-signature-using-ecdsa-be-exactly-96-bytes-not-102-or-103 .

幸运的是,Bouncy(1.51 以上)也以 {hash}withPLAIN-ECDSA{hash}withCVC-ECDSA(和也用斜杠代替 with)。在这种情况下,CVC 显然意味着卡可验证证书,尽管我不认为签名编码是受限设备证书验证中最难的部分。

更新: Bouncy 1.61 (2019-02) 修复了评论中提到的 'plain' 编码中的错误。此外,在 Java 9 (2018-12) 中,标准 (Oracle) SunEC 提供商支持此格式,如 {hash}withECDSAinP1363format