【问题标题】:ECDSA signature generation using secp256r1 curve (BouncyCastle) giving signature with length 127使用 secp256r1 曲线 (BouncyCastle) 生成 ECDSA 签名,给出长度为 127 的签名
【发布时间】:2015-07-09 16:06:28
【问题描述】:

我正在使用 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 中的错误吗?

【问题讨论】:

    标签: java cryptography bouncycastle ecdsa


    【解决方案1】:

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

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

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

    这里有类似的问题和资源:

    【讨论】:

    • 我想编写密码学标准的人可以选择其中没有前导零的示例向量,以使这类事情更容易。
    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多