从公钥+私钥创建 RSAParamaters 对象

2024-02-17

我需要使用私钥和公钥(.key 和 .cer 文件)在 .Net 中创建 RSAParameters 对象。是否可以在.Net 中做到这一点而不使用第三方软件?如果是这样,我应该去哪里寻找。

我最终需要从该对象中提取指数、模数、D、P、Q、DP、DQ、InverseQ,以便为 cryptoServer 创建密钥块。

Thanks!


“.key”和“.cer”文件扩展名绝不是密钥编码方式的明确规范。然而,“.cer”文件似乎是一个 X.509 证书,其中包含(以及许多其他内容)公钥;因此,您可能想使用X509Certificate and X509Certificate2类(在System.Security.Cryptography.X509Certificates命名空间)来解码证书并提取公钥。

但是,您需要私钥,而不是公钥。这关于 X509Certificate2 的 MSDN 文档 http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx非常令人困惑,因为它使用术语“证书”来指定公共部分(“.cer”文件中的内容)或公共和私有部分的联合,作为单个文件(按照 MSDN 描述的格式)作为“PKCS7(验证码)”)。

编码的 RSA 私钥通常遵循中描述的格式PKCS#1 http://www.rsa.com/rsalabs/node.asp?id=2125,并不复杂,但仍然依赖于ASN.1 http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One,其使用需要小心。有时,此类 RSA 密钥被包装到更大的结构中,该结构还指定密钥类型(即密钥用于 RSA);看PKCS#8 http://www.rsa.com/rsalabs/node.asp?id=2130了解详情。此外,这两种密钥编码通常都以 PEM 格式表示:即Base64 http://en.wikipedia.org/wiki/Base64带有标题(-----BEGIN RSA PRIVATE KEY-----)和页脚。当然,your私钥可以是任何格式(“.key”扩展名并不过分)。或者,PKCS#8 和 PEM 都可以进行对称加密(使用密码派生密钥)。还有PKCS#12 http://www.rsa.com/rsalabs/node.asp?id=2138格式,可以被视为证书和私钥集合的存档格式,环绕以前的格式; PKCS#12 包括多层加密,在 Microsoft 世界中以“PFX”(或“证书文件”,这一直令人困惑)的名称而闻名。

可以使用一些代码来解码所有这些格式,但此时建议使用已经完成此类工作的库,而不是自行开发。充气城堡 http://www.bouncycastle.org/csharp/是这项工作的常见嫌疑人。

The OpenSSL http://www.openssl.org/命令行工具可以帮助您在某些密钥和证书格式之间进行转换。

Edit:如果您的私钥采用 PKCS#8 DER 格式并且是not受密码保护(PKCS#8可以做到),然后你可以用相对简单的代码对其进行解码。 DER 是一组用于将结构化数据转换为字节序列的规则。数据元素被编码为三个连续的部分:

  • a tag它告诉我们它是什么类型的值
  • a length对第三部分中的字节数进行编码
  • a value这将被解释为由标签指定的

因此名称为“TLV”(即“标签、长度、值”)。某些元素本身是包含子元素的结构,在这种情况下,值包含子元素编码的串联,每个子元素都有自己的标签、长度和值。

标签通常是一个字节;对于 PKCS#8 和 RSA 密钥,您感兴趣的是标签 0x30(表示“SEQUENCE”,即具有子元素的元素)、0x02(“INTEGER”:整数值)和 0x04(“OCTET STRING”:一个 blob) 。

长度被编码为以下之一:

  • 单个字节的值n0 到 127 之间(含):编码长度n;
  • 一个字节的值n等于或大于 129,后面紧跟n-128以大端格式编码长度的字节。例如,长度 324 将被编码为三个字节:0x82 0x01 0x44。其读作是:“0x82 是 128+2,因此我必须读取两个额外字节;长度是 256*0x01+0x44 = 324”。

对于 INTEGER,该值应使用有符号、大端约定进行解释(第一个字节是最高有效的,第一个字节的高位指定整数符号;对于 RSA,所有值都是正数,因此第一个字节应其值介于 0 到 127 之间)。注意System.Numerics.BigInteger在 .NET 4.0 中,有一个可以解码一堆字节的构造函数,但它期望它们采用小端约定,而不是大端约定,因此您必须反转字节的顺序。

PKCS#8的结构是:

PrivateKeyInfo ::= SEQUENCE {
        version              Version,
        privateKeyAlgorithm  AlgorithmIdentifier,
        privateKey           OCTET STRING,
        attributes           [0] Attributes OPTIONAL
}

Version ::= INTEGER { v1(0) }

这就是 ASN.1 表示法。这里必须理解的是,该对象是一个 SEQUENCE 元素:它被编码为一个 SEQUENCE 标签(0x30),然后是一个长度(n),然后是一个值 (n字节,确切地说)。该值由一系列编码元素组成,每个元素都采用 TLV 格式。第一个元素是一个 INTEGER,在正常情况下其数值应为 0(零编码为“0x02 0x01 0x00”)。第二个元素是AlgorithmIdentifier,我这里就不详细说了;它实际上是一个 SEQUENCE 并且它标识密钥类型(这里应该说“这是一个 RSA 密钥”);只需读取标签(应为 0x30),然后读取长度,然后跳过该值。第三个元素是一个八位字节字符串:一个 0x04 标签,然后是一个长度m,以及值为m字节。这就是我们感兴趣的。应该提取该值,即八位字节字符串的内容;我们将在下一段中对其进行解码。第四个元素PrivateKeyInfoSEQUENCE 是可选的(它可能根本不存在,并且通常不会),可用于对此格式的各种扩展进行编码。

假设您已提取 OCTET STRING 的内容。这是一个字节序列,实际上是一个结构的 DER 编码,在 ASN.1 中,如下所示:

RSAPrivateKey ::= SEQUENCE {
        version            INTEGER,
        modulus            INTEGER,  -- n
        publicExponent     INTEGER,  -- e
        privateExponent    INTEGER,  -- d
        prime1             INTEGER,  -- p
        prime2             INTEGER,  -- q
        exponent1          INTEGER,  -- d mod (p-1)
        exponent2          INTEGER,  -- d mod (q-1)
        coefficient        INTEGER,  -- (inverse of q) mod p
        otherPrimeInfos    OtherPrimeInfos OPTIONAL
                -- otherPrimeInfos must be absent if version is two-prime,
                -- present if version is multi-prime.
}

因此 OCTET STRING 的内容应以 0x30(SEQUENCE 标记)开头,然后是长度 (r), then r字节。那些rbytes 是九个整数的编码。第一个 INTEGER 应该是 0;如果不是,那么 RSA 密钥有两个以上素因数,那么你就完蛋了。随后的八个 INTEGER 就是您要查找的整数;只需解码它们,就完成了。最后一个字段(otherPrimeInfos) 是可选的,如果您的 RSA 密钥是“正常”RSA 密钥(具有两个质因数,而不是三个或更多),则应该不存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从公钥+私钥创建 RSAParamaters 对象 的相关文章

  • 为什么 EF 5.0 在编译为 sql 时不支持此 EF 4.x LINQ 语法?

    我有一些代码最近从 EF 4 2 升级到 EF 5 0 实际上是 EF 4 4 因为我在 Net 4 0 上运行 我发现我必须更改查询的语法 我很好奇为什么 让我从问题开始 我有一个由客户端定期填充的事件日志表 对于每个事件日志 都会在报告
  • 无法启动 Windows 服务,错误 1064

    我编写了一个在 Win10 上运行的 Windows 服务 它运行得非常好 直到我决定对其进行一些更改 我重写了一些逻辑 在调试和发布配置中进行了测试 一切都很好 然后 我使用卸载了当前版本的服务installutil exe u serv
  • Python tkinter.filedialog Askfolder 干扰 clr

    我主要在 Spyder 中工作 构建需要弹出文件夹或文件浏览窗口的脚本 下面的代码在spyder中完美运行 在 Pycharm 中 askopenfilename工作良好 同时askdirectory什么都不做 卡住了 但是 如果在调试模式
  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 根据 VS2008 中的构建配置排除整个文件

    我的项目有三种不同的配置 这三种配置不需要将所有文件构建到应用程序中 实际上 我更希望能够从构建中排除这些文件 这将使我的应用程序更加轻量级 我正在寻找的是 if MYCONFIG or if DEBUG声明但用于文件 我已经读到这可以通过
  • 限制对记录的访问。基于声明的权限是个好主意吗

    在 net 基于声明的身份框架中 如果我想限制用户对某个帐户 特定帐户 123456 执行操作 查看或编辑 我说的是商业实体 例如银行帐户 创建索赔是个好主意吗对于他们可以查看或编辑的每个帐户 一组中有很多索赔有什么缺点吗 系统管理员可能有
  • 捕获特定的 WebException (550)

    假设我创建并执行一个System Net FtpWebRequest 我可以用catch WebException ex 捕获此请求引发的任何与 Web 相关的异常 但是 如果我有一些逻辑只想在由于以下原因引发异常时执行 550 file
  • 真的不可能使用返回类型重载吗?

    我用两种方法在MSIL中制作了一个小DLL float AddNumbers int int int AddNumbers int int 你们中有些人可能知道 MSIL 允许您创建具有相同参数的方法 只要您具有不同类型的返回类型 称为返回
  • 如何从 ReadOnlySpan 复制到 Array

    我的班级有一个财产public byte Location get new byte 30 我希望能够从 a 中填充它ReadOnlySpan
  • 将 Xml 反序列化为对象时出错 - xmlns='' 不是预期的

    我在尝试反序列化某些 XML 时遇到了真正的麻烦 希望有人可以提供一些帮助 我读过很多类似的帖子 但我无法解决这个问题 我正在尝试反序列化 XML
  • 如何在 sql server 中加密数据并在 .net 应用程序中解密

    我想加密 sql server 中的一些密码并让 c 应用程序解密它们 显然 我可以创建一个 SP 来解密所需的密码并将其传递给 c 应用程序 但这意味着通过网络发送明文密码 因此 我希望能够在 sql server 中加密我的密码 使用密
  • WPF Datagrid 循环/选择具有特定属性的单元格

    全新的 WPF 对 WinForms 非常熟悉 这可能会让过渡变得更加困难 我正在尝试将旧 WinForms 项目中的一些功能移植到 WPF 中作为学习体验 目标是在 DataGrid 中查找与 TextBox 中的字符串匹配的单元格值 我
  • 模拟 WCF 客户端代理的最佳方法

    有没有办法使用 Rhino 模拟框架来模拟 WCF 客户端代理 以便我可以访问 Channel 属性 我正在尝试对 Proxy Close 方法进行单元测试 但由于代理是使用抽象基类构造的ClientBase
  • 删除 TableLayoutPanel 中的特定行

    我有 TableLayoutPanel 我以编程方式添加行 用户基本上选择一个属性 然后与一些控件一起显示在表中 我想我在这里有一个一般性的理解问题 我会尽力解释它 每行中的控件之一是 删除 按钮 该按钮应该删除它所在的行 我所做的是将事件
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • .Net应用程序设置路径

    默认情况下 Windows 应用程序设置保存在该目录中 USERPROFILE Local Settings Application Data
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 使用 OpenSSL 相互身份验证始终成功

    我正在使用 openssl 和 zmq 编写服务器和客户端 我的客户端和服务器需要相互身份验证 但我设置后SSL CTX set verify ssl ctx SSL VERIFY FAIL IF NO PEER CERT NULL 在服务
  • 隐式将 List 转换为 List

    我正在使用 Linq to Entities 有一个实体 Order 其中有一个可为空的列 SplOrderID 我查询我的订单列表为 List
  • 无法从 nginx 获取第一个请求的 uid

    我已经在 nginx 中安装了 uid 模块 还添加了与 uid 相关的配置 userid on userid name uid userid expires 365d userid p3p policyref w3c p3p xml CP
  • 如何从基类(非抽象类)调用重载函数?

    DVD类继承了Media类 比基类多了一个变量 我声明一个指针 Media ptr new DVD 我想打印出 DVD 的内容 因此以下代码可以按预期工作 ptr gt print cout 但是使用重载的 cout lt lt ptr l
  • 如何在张量流中按元素方式将张量的每一行乘以其余行

    我有一个像这样的张量 tf docs tf constant 0 2 1 1 2 2 2 1 3 5 2 2 dtype tf int32 我需要按元素将每一行乘以其余行 然后对结果求和 完成第一行后 我们将处理第二行和其余行 然后 所以结
  • 无点动态函数组合

    我正在尝试将这个函数重构为无意义的 function siblings me return R pipe family R reject equalsMe me me 我想通过me到管道中的函数以及值family返回 尝试了一些事情R us
  • 使用带有 Pathogen 的 .vim 插件

    我想使用 lustyjuggler 和 lustyExplorer 它们是 vim 插件 但我希望我们的 Pathogen 来管理它们 通常我解压 vim 插件 整个文件夹结构进入 vim bundle 但对于 lustyJuggler 和
  • 从另一个基于应用程序的类继承 UWP 应用程序类时,名称“AppClass”不存在于命名空间“...”中

    我想要实现的只是继承 UWP App 类 而不是从 Windows UI Xaml Application 类继承 而是从某个基类继承 从 标准 类继承 但是 当我这样做时 namespace MyNamespace sealed part
  • 单例时间跨多个区域触发 Azure Function

    我有一个时间触发的 Azure 函数部署在多个区域中 我希望在它们之间具有单例行为 例如 如果这些区域是美国西部和欧洲中部 我希望每次只运行其中一个区域 这能实现吗 As the 文档 https learn microsoft com e
  • 安装设备所有者应用程序的更新

    有谁知道更新发生时通过 Google Play 分发的设备所有者应用程序的生产行为是什么 正如我们所知 安装设备所有者应用程序涉及一些动机并且并不容易 重置为出厂默认设置 然后通过 NFC 为设备提供第二个设备等 因此 即使我们认为这一步已
  • g++ 两次链接同一个库会出现问题吗?

    我注意到 当我使用 gcc 制作应用程序并在链接阶段查看输出时 我看到以下库包含两次 home rb01 opt trx HEAD gcc 4 2 4 lib lib64 libstdc so 所以我只是想知道这是 g gcc 的问题还是第
  • 有什么解决方案可以将向量解包为 C++ 中的函数参数吗?

    我实际上正在考虑类似于 python 中的 运算符的东西 如下所示 args 1 2 4 f args C 中有类似的解决方案吗 我能想到的如下 template
  • NetBeans + GWT 2.2.0 + Maven编译问题

    我正在尝试使用 NetBeans 6 9 中的 Google Web Toolkit 创建 Maven Web 应用程序项目 我已按照该视频中显示的步骤进行操作 http www youtube com watch v M iVZ5TJ21
  • 我可以更改点图上的一个标记大小吗?

    使用 Seaborn 的pointplot我创建了以下图像 我想知道是否可以将每个标记的大小更改为唯一值 该图像是通过调用制作的 sns pointplot x Partying y Province ci 95 data df join
  • 发布表单时的 post 与 put

    当评估表单是否已提交时 我检查方法是否为 post 而不是 get 有人告诉我 这是一个好方法 可以了解表单是通过单击 提交 按钮提交的 而不仅仅是由在 url 中传递数据的脚本提交的 put 方法怎么样 看起来和 post 很相似 是否可
  • AngularJS $location 没有模板

    我想使用 locationProviderAngularJS 中的服务 无需在我的中渲染新的 HTML 模板ng view 我有一个div通过按需显示的元素ng show绑定到数据元素的存在 我想通过以下方式将其连接到浏览器位置 locat
  • 使用三元运算符的缺点

    我的源代码中有以下语句 int tableField1 int tableField2 int propertyField1 int propertyField2 if tableField1 null propertyField1 tab
  • 在C中将XImage写入.bmp文件

    我正在使用以下代码将 XImage 写入文件 bitmap0 bmp 但是当我在 fedora 中使用 imageViewer 打开新创建的文件时 它会给出 文件过早结束 错误并且不显示任何内容 谁能指出以下代码中的问题吗 typedef
  • Synthesia 可以很好地播放 MIDI 文件而没有任何音符关闭事件吗?

    我有一个 mid file this https pastebin com amkth128具体一个 除了标题块之外 这里是 MIDI 的相关部分 第一个轨道块仅包含元事件 并被描述为 4D 54 72 6B 00 00 00 52 Tra
  • 从公钥+私钥创建 RSAParamaters 对象

    我需要使用私钥和公钥 key 和 cer 文件 在 Net 中创建 RSAParameters 对象 是否可以在 Net 中做到这一点而不使用第三方软件 如果是这样 我应该去哪里寻找 我最终需要从该对象中提取指数 模数 D P Q DP D