当前位置: 首页 > 知识库问答 >
问题:

利用secp256r1曲线(BouncyCastle)生成ECDSA签名,给出长度为127的签名

晁砚
2023-03-14

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

对于某些输入,签名长度为127个字符。我感觉开头的“0”被删除了,因为签名被存储到ECDSASigner类中的BigInteger datatype中。

我使用确定性方法添加了rfc6979 ECDSA签名中的示例

//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 = 0EAFEA039B20E9B42309FB1D89E213057CBF973DC0CFC8F129EDDDC800EF7719
 s = 4861F0491E6998B9455193E34E7B0D284DDD7149A74B95B9261F13ABDE940954
r = EAFEA039B20E9B42309FB1D89E213057CBF973DC0CFC8F129EDDDC800EF7719
s = 4861F0491E6998B9455193E34E7B0D284DDD7149A74B95B9261F13ABDE940954

唯一的区别是r值中的零。因为签名的长度只有127。

如果我的推论是正确的,请让我知道。这是弹跳城堡里的虫子吗?

共有1个答案

帅颖逸
2023-03-14

这不是BouncyCastle中的bug。BouncyCastle向您返回了一个BigInteger。我不相信Java的BigInteger类存储了任何关于应该打印多少前导零的信息,并且在使用.tostring(16).tostring()时没有提供这些信息,因此不可避免的结果是前导零不会显示。

你明白,例如,十六进制“0EAF”和十六进制“EAF”是同一个数字,对吗?所以这只是一个字符串格式问题。数字是正确的。

如果希望字符串与文档中的文本完全匹配,则在设置字符串格式以添加前导零时需要做一些额外的工作。

    null
 类似资料:
  • 我试图用ECDSA和secp256r1曲线(P256)和SHA256算法来生成签名。我也在使用弹力城堡图书馆。下面的代码,

  • 问题内容: ECDSA算法中256位EC密钥的签名长度将是多少?我想验证签名长度是否相同。如果某个机构可以帮助我设置一个EC钥匙,那将是很棒的。 问题答案: 这取决于您如何对签名进行编码。这是OpenSSL的代码段,用于测量DER格式的ECDSA签名的长度。 以prime256曲线上的EC_KEY作为参数的上述函数的结果是 sig_len在哪里。 您需要使用位EC密钥的字节来进行DER编码的ECD

  • 我应该如何更改A方法?任何想法都是好的。提前谢谢。

  • 我有代码使用为ECDSA签名生成串联(r-s)签名和JWK格式的密钥: 似乎有效。我也有使用来实现相同目标的代码: 这两者都返回128字节的缓冲区;并且它们可以交叉验证(例如,我可以用< code>SubtleCrypto验证< code > JSR sign 签名,反之亦然)。然而,当我在Node.js 模块中使用< code>Sign类时,我似乎得到了完全不同的东西。 在这里,我得到了一个可变

  • 问题内容: 我已经测试了一种解决方案,可以验证ECDSA签名如何从EC公共密钥字节中获取PublicKey对象?,该签名可以完美地处理给定的数据。 这是数据: 这是代码(显示 true ): 当我将签名和数据更改为来自已实施系统的示例输入时,就会出现我的问题: 新数据输出此错误: 我认为问题出在 安全消息 附带的签名上,因为: 密钥对的长度和格式与示例相同。并且是正确的,因为它来自对消息进行签名的

  • 现有系统使用Bouncy Castle(.NET)生成签名,我需要使用Microsoft ECDsaCng类验证这些现有签名。 在我尝试用Microsoft类验证签名之前,一切都正常工作,此时它会生成一个异常,说明参数不正确。 有什么想法吗?