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

时间:2018-01-09 22:49:34

标签: java security signature sha256

对于我的应用程序,我正在尝试使用java.security.Signature类来签名一些字节内容。我遇到的问题是签名永远不会以固定长度生成。例如,有时它生成的长度为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;
}

1 个答案:

答案 0 :(得分:1)

对于ECDSA Java加密使用X9.62,SEC1和rfc 3279 sec 2.2.3标准化的 ASN.1 DER编码长度略有不同即可。这在另一个堆栈中有更详细的介绍:https://crypto.stackexchange.com/questions/1795/how-can-i-convert-a-der-ecdsa-signature-to-ASN.1https://crypto.stackexchange.com/questions/33095/shouldnt-a-signature-using-ecdsa-be-exactly-96-bytes-not-102-or-103以及https://crypto.stackexchange.com/questions/37528/why-do-openssl-elliptic-curve-digital-signatures-differ-by-one-byte

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

如果您需要不同的编码,例如PKCS11使用的固定长度编码(以及您的提供商名称“SC”表示可能),您必须将其转换。