Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用secp256r1曲线(BouncyCastle)生成ECDSA签名,给出长度为127的签名_Java_Cryptography_Bouncycastle_Ecdsa - Fatal编程技术网

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

Java 使用secp256r1曲线(BouncyCastle)生成ECDSA签名,给出长度为127的签名,java,cryptography,bouncycastle,ecdsa,Java,Cryptography,Bouncycastle,Ecdsa,我正在使用secp256r1曲线和使用BouncyCastle的SHA256算法实现ECDSA签名生成 对于某些输入,签名长度为127个字符。我感觉开始时的“0”被删除了,因为签名存储在ECDSASigner类中的BigInteger数据类型中 我已经添加了来自rfc6979的样本 守则的有关部分:- //Private key used in hex format -C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721

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

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

我已经添加了来自rfc6979的样本

守则的有关部分:-

//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中的一个bug吗?

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

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

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

下面是一个类似的问题和资源:


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

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

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

      下面是一个类似的问题和资源:


      我认为编写密码标准的人可以选择没有前导零的示例向量,使这类事情更容易。我认为编写密码标准的人可以选择没有前导零的示例向量,使这类事情更容易。