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

对于我的应用程序,我试图使用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;

}

回答:

对于ECDSA, Java加密使用由X9.62,SEC1和rfc 3279 sec

2.2.3标准化的 。这在另一个堆栈上有更详细的介绍:https:

//crypto.stackexchange.com/questions/1795/how-can-i-convert-a-

der-ecdsa-signature-to-

ASN.1和https://

crypto.stackexchange.com/questions/33095/shouldnt-a-signature-using-ecdsa-be-

exactly-96-bytes-

not-102-or-103和https://crypto.stackexchange.com/questions/37528/为什么openssl椭圆曲线数字签名相差一个字节

*

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

如果要使用其他编码,例如PKCS11使用的固定长度编码(并且提供者名称为“ SC”,则表明存在这种可能性),则必须进行转换。

您不再需要用Java自己做; 从1.61(2019-02)开始的BouncyCastle 正确地 支持此功能,Java 9

up(2018-12)中的SunEC也是如此。请参阅稍后的长度不一致的近重复Java

ECDSAwithSHA256签名。

以上是 如何为java.security.Signature签名方法指定签名长度 的全部内容, 来源链接: utcz.com/qa/419088.html

回到顶部