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

ECC p-128不在C#中生成32字节数组签名

刁俊人
2023-03-14

signature1值总是39字节[]数组,当我转换为十六进制时,长度大于64。我想在C#中从P-128 ECC算法生成精确的64长度十六进制签名值。

让我解释下面的代码:

>

  • 对必须签名的纯文本消息进行哈希

        public static string GenerateSignature(string message, string privateKeyPath)
        {
                string hashMessage;
                using (SHA256 sha256 = SHA256.Create())
                {
                    byte[] data = sha256.ComputeHash(Encoding.Default.GetBytes(message));
                    hashMessage = convertByteArrayToHexString(data);
                    Console.WriteLine("Signing message: {0}", message);
                    Console.WriteLine("Hash of the signing message: {0}", hashMessage);
                }
                byte[] hashMessageBytes = Encoding.UTF8.GetBytes(hashMessage);
                ISigner signer = SignerUtilities.GetSigner("SHA256withECDSA");
                AsymmetricCipherKeyPair publicKey = getPrivateKeyFromPemFile(privateKeyPath);
                signer.Init(true, publicKey.Private);
                signer.BlockUpdate(hashMessageBytes, 0, hashMessageBytes.Length);
                byte[] signature1 = signer.GenerateSignature();
    
    }
    
  • 共有1个答案

    闻人河
    2023-03-14

    有不同的签名格式,一种是ASN.1 DER格式,它在您的代码中使用,在此进行说明。对于曲线secp128r1(P-128),生成的签名的长度在38到40字节之间。

    您期望的格式似乎是r s(参见此处),对于曲线secp128r1来说,它的长度为32字节。

    您可以轻松地手动在两种格式之间进行转换。

      null

    编辑:

    以下代码UTF-8对字符串message进行编码,并基于曲线secp128r1和摘要SHA256生成rs格式的ECDSA签名(这里对应于IEEE P1363):

    public static string GenerateSignature(string message, string privateKeyPath)
    {
        byte[] messageBytes = Encoding.UTF8.GetBytes(message);
        ISigner signer = SignerUtilities.GetSigner("SHA-256withPLAIN-ECDSA");
        AsymmetricCipherKeyPair keyPair = getPrivateKeyFromPemFile(privateKeyPath); // get secp128r1 key pair
        signer.Init(true, keyPair.Private);
        signer.BlockUpdate(messageBytes, 0, messageBytes.Length);
        byte[] signature = signer.GenerateSignature();
        return ByteArrayToString(signature); // https://stackoverflow.com/a/311179/9014097
    }
    

    请注意与最初发布的代码相比的差异:

      null
     类似资料:
    • 是否可以使用KeypairGenerator在java中生成ecdsa 32字节私钥?我的意思是keys.getpublic.getEncoded.length将返回32我尝试生成私钥,但大小是144字节

    • 我正在用C#开发一个加密用户和管理员密码的类项目。为了加密,我使用了< code > triplescryptoserviceprovider 。 在配置应用程序中,用户输入用于加密和解密密码的密钥。我想有一个按钮来生成密钥来帮助用户,但我不知道如何随机生成128位。如何生成128位的密钥?

    • 我需要用数字签名对xml文档进行签名,并且需要用该文档生成数字签名xml的.sig文件。我也在使用PKCS7算法。我能够成功地将签名放在xml中。但无法生成.sig文件。我的代码如下: 现在我正在生成这样的. sig文件: 抛出长度错误的错误\r\n。数字签名后的 xml 是: 现在我知道我要么做错了,要么错过了什么。我的问题是 有没有办法生成带有签名 xml 的 .sig 文件? PKCS7 中

    • 我正在用Java对一个二进制文件进行签名。我能够在Java代码中签名和验证,但是在openssl中使用生成的签名时,它无法验证到相同的二进制文件。步骤是:加载数据- 这应该相当于在openssl: openssl dgst-sha256-符号private.key-二进制target.bin 我验证了sha256与openssl生成的匹配。

    • 本文向大家介绍C#将字节数组转换成数字的方法,包括了C#将字节数组转换成数字的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#将字节数组转换成数字的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

    • 本文向大家介绍C#将数字转换成字节数组的方法,包括了C#将数字转换成字节数组的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#将数字转换成字节数组的方法。分享给大家供大家参考。具体实现方法如下: 下面的代码用到了MemoryStream 和 BinaryWriter 希望本文所述对大家的C#程序设计有所帮助。