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

在C中使用RSA私钥文件创建RSACryptServiceProvider对象#

闻人吕恭
2023-03-14

如何使用RSA私钥文件正确创建RSACryptoServiceProvider对象?我生成了一个RSA私钥,并使用以下方法将其导出到OSX上的p12文件:

openssl genrsa -out rsakey.pem 2048
openssl pkcs12 -export -out rsakey.p12 -inkey rsakey.pem -nocerts

在Windows笔记本电脑上运行的C#代码中,我尝试实例化X509Certificate2对象时出错,因此我可以从中获取私钥作为RSACryptServiceProvider对象:

var privateKey = new X509Certificate2(p12_file, "pass", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet).PrivateKey as RSACryptoServiceProvider;

CryptographicException:参数不正确。

下面是整个C代码供参考。注意,我只是试图通过遵循X509Certificate2类的文档来获取作为RSACryptServiceProvider对象的私钥。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using System.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Globalization;
using Jose;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string p12_file = @"C:\Root\rsakey.p12";

            DateTime issued = DateTime.Now;
            DateTime expire = DateTime.Now.AddHours(10);

            var payload = new Dictionary<string, object>()
            {
                { "iss", "auth0_user"},
                { "exp", ToUnixTime(expire).ToString() }
            };

            var privateKey = new X509Certificate2(p12_file, "pass", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet).PrivateKey as RSACryptoServiceProvider;

            string token = Jose.JWT.Encode(payload, privateKey, JwsAlgorithm.RS256);

            Console.WriteLine(token);

        }

        static long ToUnixTime(DateTime dateTime)
        {
            return (int)(dateTime.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
        }

    }
}

更新:我尝试使用创建我的自签名证书

openssl req -key rsakey.pem -new -out domain.crt

然后将其包装成p12:

openssl pkcs12 -export -out rsakey.p12 -in rsakey.pem -certfile domain.crt

但是命令永远挂起,直到我杀了它。

共有2个答案

帅彦
2023-03-14

由于您的P12文件不包含X509证书,因此X509证书2不会将该文件解释为正确的输入。

崔棋
2023-03-14

.NET没有用于读取与证书无关的私钥(或公钥)的内置功能。

最简单的修复方法是将新的RSA密钥封装在自签名证书中,然后将证书和私钥放入。p12文件。

替代方法是手动解析私钥文件/blob并构建RSAParameters结构;或者使用可以为您执行此操作的第3方库。

 类似资料:
  • 我有以下代码。 当我使用rsacyncrypt方法时,它采用参数“RSAKeyInfo”(用于加密的公钥和用于解密的私钥)。 如何获取此方法用于加密和解密的私钥和公钥的值。 谢谢

  • 我一直在搜索,但我似乎找不到一个简单的方法解密使用RSA。 我生成了一个公钥和私钥,它们存储在两个单独的文件中,并且是XML格式的。使用FromXmlString将公钥关联到RSACryptoServiceProvider对象,然后加密一个字符串,这一点没有问题。当我试图解密一个加密的字符串时,我的困惑就来了。我不确定如何将私钥数据与RSACryptoServiceProvider关联,以便使用D

  • 我试图通过RSA加密字符串。我也有java样本,但我不能正确地将其转换为c#。 RSA示例: 这是我在c#中生成的代码,但我的c#代码结果与javaCode结果不同。我的代码怎么了?

  • 根据给定的私钥生成密钥对,并在保存后返回其ID。 调用: web3.shh.addPrivateKey(privateKey, [callback]) 参数: privateKey:String - 要导入的私钥,16进制字符串 callback:Function - 可选的回调函数,其第一个参数为错误对象,第二个对象为返回结果 返回值: String - 成功时返回ID,失败则返回错误信息 示

  • 我需要在C#中加密数据,以便将其传递给Java。Java代码属于第三方,但我得到了相关的源代码,因此我决定,由于Java使用Bouncy Castle库,所以我将使用C#端口。 解密工作正常。但是,解密仅在使用私钥使用encrypt时有效,而不是使用公钥。使用公钥时,解密失败,出现。 编辑: 我还添加了一个单元测试,它证明公钥等于从私钥中提取的公钥:

  • 我知道可以使用此链接为OpenSSL中的自签名证书生成一个公钥和一个私钥。但是对于给定的公钥,我有没有可能算出对应的私钥呢?我一直在使用1024位的RSA公钥。