如何为 java.security.Signature 签名方法指定签名长度

how to specify signature length for java.security.Signature sign method

对于我的应用程序,我正在尝试使用 java.security.Signature class 对一些字节内容进行签名。我遇到的问题是签名永远不会以固定长度生成。例如,有时生成的长度为 135、136 或 137 字节。有没有办法在末尾指定长度或一些填充?任何其他想法或意见表示赞赏。

    private byte[] ecdsaSign(ECPrivateKey key, byte[] content) throws Exception {
                Signature ecdsaSign = Signature.getInstance("SHA256withECDSA", "SC");
                ecdsaSign.initSign(key);
                ecdsaSign.update(content);
                byte[] signature = ecdsaSign.sign();
                return signature;
}

对于 ECDSA Java 加密使用 ASN.1 DER 编码 由 X9.62、SEC1 和 rfc 3279 sec 2.2.3, which varies slightly in length. This is covered in more detail on another Stack: https://crypto.stackexchange.com/questions/1795/how-can-i-convert-a-der-ecdsa-signature-to-ASN.1 and https://crypto.stackexchange.com/questions/33095/shouldnt-a-signature-using-ecdsa-be-exactly-96-bytes-not-102-or-103 and https://crypto.stackexchange.com/questions/37528/why-do-openssl-elliptic-curve-digital-signatures-differ-by-one-byte

对于 DSA 也是如此,但对于 RSA 则不然,对于给定的密钥,签名(以及密码,因为 RSA 支持签名和加密)是固定长度的,如 PKCS1 中的 I2OS 和 OS2I 所定义。

如果您想要不同的编码,例如 PKCS11 使用的固定长度编码(并且您的提供商名称“SC”暗示了这种可能性),您必须转换它。

2019-10新增:在Java你再也不用自己动手了; BouncyCastle 自 1.61 (2019-02) 正确地 支持此功能,Java 9 up (2018-12) 中的 SunEC 也是如此。稍后再看近乎欺骗 .