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

如何在C中使用SHA256withRSA算法进行签名#

田柏
2023-03-14

我尝试了我的查询的搜索解决方案,我无法找到匹配我正在寻找的,这是非常基本的,但为了我更好地理解我张贴下面的查询。

我想使用“SHA256withRSA”算法对字符串进行编码和签名。我可以看到很多使用“SHA256withRSA”的java示例代码,但在C#中,我可以看到首先使用SHA256对数据进行散列,然后使用RSACryptServiceProvider对散列进行签名。

我的问题是:

>

  • 在C#中,我们有单独的“SHA256withRSA”算法,如果是,请提供示例代码帮助。

    如果没有,那么在C#中实现它的更好方法是什么?

  • 共有2个答案

    濮升
    2023-03-14

    首先,你需要一个密钥对。要生成密钥对,您可以执行以下操作并使用OpenSSL:

    >

  • 生成私钥

    openssl genrsa-取出我的私钥。pem 2048

    生成公共证书

    openssl req-new-keymy-private-key.pem-x509天36500my-public-cert.pem

    生成一个p12文件

    openssl pkcs12-导出-inmy-public-cert.pem-inkeymy-private-key.pem-out my-key对. p12

    现在,您可以在C#中使用以下示例代码。NET创建数字签名并验证数字签名

        public static string SignData(byte[] data, string pkcs12File, string pkcs12Password)
        {
            X509Certificate2 signerCert = new X509Certificate2(pkcs12File, pkcs12Password, X509KeyStorageFlags.Exportable);
            RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
            rsaCSP.FromXmlString(signerCert.PrivateKey.ToXmlString(true));
            var SignedData = rsaCSP.SignData(data, CryptoConfig.MapNameToOID("SHA256"));
            return Convert.ToBase64String(SignedData);
        }
    
        public static bool VerifySignature(byte[] data, string signature, string publicCert)
        {
            X509Certificate2 partnerCert = new X509Certificate2(publicCert);
            RSACryptoServiceProvider rsaCSP = (RSACryptoServiceProvider)partnerCert.PublicKey.Key;
            return rsaCSP.VerifyData(data, CryptoConfig.MapNameToOID("SHA256"), Convert.FromBase64String(signature));
        }
    

    请记住,您的项目需要添加对System.安全性

  • 司马彬
    2023-03-14

    不要使用RSACryptoServiceProvider,除非您正在与CAPI进行互操作,例如打开命名密钥。

    要使用SHA-(2-)256执行RSA签名,请执行以下操作:

    byte[] signature = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    

    您可以从证书中获取RSA对象:

    using (RSA rsa = cert.GetRSAPrivateKey())
    {
        ...
    }
    

    或者,您可以根据现有的RSA参数制作一个:

    using (RSA rsa = RSA.Create(rsaParameters))
    {
       ...
    }
    

    或者,您可以从无到有地创建一个新密钥:

    using (RSA rsa = RSA.Create(2048))
    {
        // you’ll need to save the parameters somewhere to have a stable key
        rsaParameters = rsa.ExportParameters(true));
        ...
    }
    
     类似资料:
    • 我有一个包含EC私钥的文件: 我有一个证书,它的公钥对应于私钥: 在 pem 格式中: 以txt格式: 我正在努力完成两件事: < li >使用ecdsa-with-SHA256签名算法使用私钥对字节数组进行签名 < li >使用证书中的公钥验证签名是否正确 我尝试过使用充气城堡图书馆。这是我到目前为止所拥有的。我的断言是失败的。

    • 我需要使用RSA-SHA1算法对XML文档的一个节点进行签名(并最终验证)。W3.org链接 RSA-SHA1 URI: http://www.w3.org/2000/09/XMLDSIG#RSA-SHA1 指定于: [XMLDSIG-CORE2002]第6.4.2节 签名生成发生在以下位置: 唯一带有参数的重写需要: (链接) 在.NET中用RSA-SHA1签署XML最轻松的方式是什么? 编辑:

    • 问题内容: 我是Visual Studio用户,习惯于调试断点。我现在在Linux环境中工作,并且正在使用Eclipse作为IDE。我是linux和eclipse的新手。我不知道如何在Eclipse中使用gdb。我尝试在命令行中使用gdb,但它并不像拥有UI那样容易。 如何在Eclipse中使用gdb? 问题答案: 以下说明适用于Eclipse 3.5(Galileo)。对于3.6(Helios)

    • 我想分两步使用RSA/PSS签名制作SHA256,首先散列一条消息,然后使用RSASSA-PSS签名摘要 但我使用SHA256时RSA/PSS无法验证 我需要一些帮助,谢谢你的帮助。

    • 我正在编写dijkstra算法的代码,对于我们应该找到与当前使用的节点之间距离最小的节点的部分,我使用了一个数组,并完全遍历它来找出节点。 这部分可以用二进制堆代替,我们可以在O(1)时间内计算出节点,但是我们也在进一步的迭代中更新节点的距离,我将如何合并那个堆? 对于数组,我所要做的就是转到(ith-1)索引并更新该节点的值,但在二进制堆中不能做同样的事情,我必须进行完整的搜索以确定节点的位置,

    • 我能够使用带RSA私钥的bouncy castle和“SHA256withRSA”算法对证书进行签名。我使用下面的链接作为参考来实现这一点。使用Bouncy Castle签署CSR 现在我有椭圆曲线密钥与ECDSA签署我的CA。因此,我想通过这些CA用EC密钥和“SHA256 with ECDSA”算法签署证书。然而,我被困在下面的片段特定于RSA密钥,我想使用EC密钥。 请帮助我如何使用ECDS