【问题标题】:Java ECDSAwithSHA256 signature with inconsistent lengthJava ECDSAwithSHA256 签名长度不一致
【发布时间】:2019-02-06 21:56:43
【问题描述】:

所以我正在尝试在 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 cryptography digital-signature bouncycastle ecdsa


【解决方案1】:

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

更新: Bouncy 1.61 (2019-02) 修复了 cmets 中提到的“普通”编码中的错误。此外,在 Java 9 (2018-12) 中,标准 (Oracle) SunEC 提供程序支持此格式为 {hash}withECDSAinP1363format

【讨论】:

  • 很抱歉回答迟了,但是当我使用推荐的算法时,我得到的签名长度在 130 到 132 字节之间,所以它仍然不固定。我刚刚更改了 SIGNATURE_ALGORITHEM Constance。我做错了吗?
  • Plilikio:嗯,检查代码,它使用较大实际值(r或s)的固定大小而不是组大小;我可以很容易地得到 132 或 130,并且认为我可以得到更低的偶数长度,但绝不是奇数长度。我认为这可能是一个错误,并会尝试与他们核实。作为一种解决方法,当您获得
  • 对不起,我打算更新这个但忘记了:我检查了 Bouncy 开发人员,他们确定这是一个错误,并将修复为 const length = group。
  • 目前我通过添加一个额外的字节来修复它,告诉签名有多长......
猜你喜欢
  • 2018-09-18
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 2015-08-27
相关资源
最近更新 更多