长度不一致的Java ECDSAwithSHA256签名

时间:2018-08-31 21:18:58

标签: java cryptography digital-signature bouncycastle ecdsa

因此,我试图用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字节之间。但是我希望得到的字节数始终相同。有人知道我必须更改什么,即我的签名长度始终相同,但仍然是标准的签名格式吗?

1 个答案:

答案 0 :(得分:0)

通常为Java加密,默认情况下为Bouncy,使用可变长度的ASN.1 DER对ECDSA(也为DSA)签名进行编码。参见Neardupe ECDSA signature length和交叉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 的名称实现了P1363样式的定长编码(并用斜杠代替了with)。在这种情况下,CVC显然意味着“卡可验证证书”,尽管我不认为签名编码是有限设备上证书验证最困难的部分。