使用secp256r1曲线(BouncyCastle)生成ECDSA签名,签名长度为127

时间:2015-07-09 16:06:28

标签: java cryptography bouncycastle ecdsa

我正在使用secp256r1曲线和使用BouncyCastle的SHA256算法实现ECDSA签名生成。

对于某些输入,签名长度为127个字符。我觉得" 0"因为签名存储在ECDSASigner类中的BigInteger数据类型中,所以在开头被删除。

我已经从rfc6979 ECDSA signing using Deterministic Approach

添加了样本

代码的相关部分: -

//Private key used in hex format -C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721
        String secretNumberK = "09F634B188CEFD98E7EC88B1AA9852D734D0BC272F7D2A47DECC6EBEB375AAD4";
        SecureRandom secureRandom = new FixedSecureRandom(Hex.decode(secretNumber));
        ECPrivateKeyParameters ecPrivateKeySpec = Util.getECPriKeyParameter(ecPrivateKey);//it is the PrivateKey of the sample shown 
        byte[]  messageInHex = Hex.decode("test");

         ECDSASigner ecdsaSigner = new ECDSASigner();

        ecdsaSigner.init(true, new ParametersWithRandom(ecPrivateKeySpec,
                secureRandom));

         BigInteger[]  sig = ecdsaSigner.generateSignature(Util
                .generateSHAHash(messageInHex));
        flag = true;
        LOG.debug("r:: " + sig[0].toString(16).toString());
        LOG.debug("s:: " + sig[1].toString(16).toString());

根据文件预期的签名R和S: -

 r = 0EAFEA039B20E9B42309FB1D89E213057CBF973DC0CFC8F129EDDDC800EF7719
 s = 4861F0491E6998B9455193E34E7B0D284DDD7149A74B95B9261F13ABDE940954

但是我得到了

r = EAFEA039B20E9B42309FB1D89E213057CBF973DC0CFC8F129EDDDC800EF7719
s = 4861F0491E6998B9455193E34E7B0D284DDD7149A74B95B9261F13ABDE940954

唯一的区别是r值为零。而且由于这个签名长度只有127。

如果我的推断是正确的,请告诉我。这是Bouncy Castle的一个错误吗?

1 个答案:

答案 0 :(得分:4)

这不是BouncyCastle中的错误。 BouncyCastle已经为您返回了一个BigInteger。我不相信Java的BigInteger类存储有关应该打印多少前导零的任何信息,并且当您使用.toString(16).toString()时,您不提供该信息,因此不可避免的结果是前导零将不会显示。

你明白,例如,hex" 0EAF"与十六进制相同的数字" EAF",对吧?所以这只是一个字符串格式问题。数字是正确的。

如果您希望字符串与文档中的文本完全匹配,则在格式化字符串时需要执行一些额外的工作才能添加前导零。

以下是类似的问题和资源: