对于我的应用程序,我正在尝试使用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;
}
答案 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.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/why-do-openssl-elliptic-curve-digital-signatures-differ-by-one-byte
对于DSA也是如此,但RSA也是如此,其中签名(以及RSA支持签名和加密的密码)对于给定密钥是固定长度,如PKCS1中的I2OS和OS2I所定义。
如果您需要不同的编码,例如PKCS11使用的固定长度编码(以及您的提供商名称“SC”表示可能),您必须将其转换。