- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在尝试创建一个 RSACryptoServiceProvider
对象仅来自解码的 PEM 文件。经过几天的搜索,我确实设法解决了一个可行的解决方案,但它不是一个可以用于生产的解决方案。
简而言之,为了创建一个RSACryptoServiceProvider
从构成 PEM 文件中的公钥的字节中创建对象,我必须创建指定 key 大小的对象(目前使用 SHA256 为 2048,特别是),然后导入 RSAParameters
对象与 Exponent
和 Modulus
放。我就是这样做的;
byte[] publicKeyBytes = Convert.FromBase64String(deserializedPublicKey.Replace("-----BEGIN PUBLIC KEY-----", "")
.Replace("-----END PUBLIC KEY-----", ""));
// extract the modulus and exponent based on the key data
byte[] exponentData = new byte[3];
byte[] modulusData = new byte[256];
Array.Copy(publicKeyBytes, publicKeyBytes.Length - exponentData.Length, exponentData, 0, exponentData.Length);
Array.Copy(publicKeyBytes, 9, modulusData, 0, modulusData.Length);
// import the public key data (base RSA - works)
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(dwKeySize: 2048);
RSAParameters rsaParam = rsa.ExportParameters(false);
rsaParam.Modulus = modulusData;
rsaParam.Exponent = exponentData;
rsa.ImportParameters(rsaParam);
deserializedPublicKey
是不可行的。将正好是 270 个字节,我需要的模数在位置 9 处找到,并且长度始终为 256 个字节。
最佳答案
您不需要导出现有参数,然后在它们之上重新导入。这会强制您的机器生成一个 RSA key ,然后将其丢弃。因此,为构造函数指定 key 大小并不重要(如果您不使用 key ,则通常不会生成 key ……)。
公钥文件是一个 DER 编码的 blob。
-----BEGIN PUBLIC KEY-----
MIGgMA0GCSqGSIb3DQEBAQUAA4GOADCBigKBggC8rLGlNJ17NaWArDs5mOsV6/kA
7LMpvx91cXoAshmcihjXkbWSt+xSvVry2w07Y18FlXU9/3unyYctv34yJt70SgfK
Vo0QF5ksK0G/5ew1cIJM8fSxWRn+1RP9pWIEryA0otCP8EwsyknRaPoD+i+jL8zT
SEwV8KLlRnx2/HYLVQkCAwEAAQ==
-----END PUBLIC KEY-----
30 81 A0 30 0D 06 09 2A 86 48 86 F7 0D 01 01 01
05 00 03 81 8E 00 30 81 8A 02 81 82 00 BC AC B1
A5 34 9D 7B 35 A5 80 AC 3B 39 98 EB 15 EB F9 00
EC B3 29 BF 1F 75 71 7A 00 B2 19 9C 8A 18 D7 91
B5 92 B7 EC 52 BD 5A F2 DB 0D 3B 63 5F 05 95 75
3D FF 7B A7 C9 87 2D BF 7E 32 26 DE F4 4A 07 CA
56 8D 10 17 99 2C 2B 41 BF E5 EC 35 70 82 4C F1
F4 B1 59 19 FE D5 13 FD A5 62 04 AF 20 34 A2 D0
8F F0 4C 2C CA 49 D1 68 FA 03 FA 2F A3 2F CC D3
48 4C 15 F0 A2 E5 46 7C 76 FC 76 0B 55 09 02 03
01 00 01
30
81 A0
lengthLength & 0x7F
)中编码了真实长度。因此,这个 SEQUENCE 的内容总共是 160 个字节。 (在这种情况下,“其余数据”,但 SEQUENCE 可能已包含在其他内容中)。那么让我们阅读一下内容:
30 0D
0x30
),长度值为
0x0D
,所以我们有一个 13 字节的有效载荷。
06 09 2A 86 48 86 F7 0D 01 01 01 05 00
06
是对象标识符,带有
0x09
字节有效载荷。 OID 有一种稍微不直观的编码,但是这个编码等同于文本表示
1.2.840.113549.1.1.1
, 即
id-rsaEncryption
(
http://www.oid-info.com/get/1.2.840.113549.1.1.1 )。
05 00
),我们看到它是一个 NULL(带有 0 字节的有效负载,因为它是 NULL)。
SEQUENCE
SEQUENCE
OID 1.2.840.113549.1.1.1
NULL
143 more bytes.
03 81 8E 00
03
表示位串。 BIT STRING 被编码为 [tag] [length] [未使用的位数]。未使用的位基本上总是零。所以这是一个位序列,
0x8E
字节长,并且所有这些都被使用。
30 81 8A
0x8A
有效载荷字节,方便地对应于“剩下的一切”。
02 81 82
02
标识一个整数,这个有
0x82
有效载荷字节:
00 BC AC B1 A5 34 9D 7B 35 A5 80 AC 3B 39 98 EB
15 EB F9 00 EC B3 29 BF 1F 75 71 7A 00 B2 19 9C
8A 18 D7 91 B5 92 B7 EC 52 BD 5A F2 DB 0D 3B 63
5F 05 95 75 3D FF 7B A7 C9 87 2D BF 7E 32 26 DE
F4 4A 07 CA 56 8D 10 17 99 2C 2B 41 BF E5 EC 35
70 82 4C F1 F4 B1 59 19 FE D5 13 FD A5 62 04 AF
20 34 A2 D0 8F F0 4C 2C CA 49 D1 68 FA 03 FA 2F
A3 2F CC D3 48 4C 15 F0 A2 E5 46 7C 76 FC 76 0B
55 09
02 03 01 00 01
01 00 01
.我们已经完成了。
SEQUENCE
SEQUENCE
OID 1.2.840.113549.1.1.1
NULL
BIT STRING
SEQUENCE
INTEGER 00 BC AC ... 0B 55 09
INTEGER 01 00 01
SubjectPublicKeyInfo
结构体:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL }
-- contains a value of the type
-- registered for use with the
-- algorithm object identifier value
An RSA public key shall have ASN.1 type RSAPublicKey:
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e }
0x00
来自 Modulus 的值。
internal static RSAParameters ReadRsaPublicKey(...)
,然后你只需要做
RSAParameters rsaParameters = ReadRsaPublicKey(...);
using (RSA rsa = RSA.Create())
{
rsa.ImportParameters(rsaParameters);
// things you want to do with the key go here
}
关于c# - 从公钥正确创建 RSACryptoServiceProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41808094/
如果您查看下面的代码,它只是创建了一个 RSACryptoServiceProvider 的新实例。 key 容器名称是从一个属性初始化的,该属性根据各种参数创建名称。我在此演示代码中添加了硬编码值。
我需要使用 RSA 加密一些文本,然后使用私钥恢复它。我的问题是 RSACryptoServiceProvider.Encrypt() 每次都输出不同的值,即使使用相同的 key 也是如此。这是我放入
有人告诉我,对于非对称加密,您可以使用公钥加密明文并使用私钥解密。所以我尝试了以下方法: static void Main(string[] args) { RSACr
我在 MSDN( see Important note ) 上读到必须处理 RSACryptoServiceProvider。他们给出了例子: using (RSACryptoServiceProvi
我对商店的证书有疑问。在我的应用程序中,用户可以使用文件中的证书或商店中的证书。加载证书后,我使用证书作为签名数据。 可以使用文件中的证书,但我不能使用商店中的等效证书。 签名代码: // Sign
我正在使用 key 对对我的 XML 进行签名(使用 SignedXml),并将公钥作为嵌入式资源嵌入到我的应用中。 这里是我如何创建 key 对 sn -k Warehouse.snk sn -p
我有以下使用 RSA 生成公钥和私钥的代码。 // generate RSA 1024 using (var rsa = new RSACryptoServicePro
我正在尝试使用我自己的公钥和私钥初始化 RSACryptoServiceProvider。 据我所知,方法是调用构造函数 RSACryptoServiceProvider RSAalg = new R
我目前正在尝试创建一个 RSACryptoServiceProvider对象仅来自解码的 PEM 文件。经过几天的搜索,我确实设法解决了一个可行的解决方案,但它不是一个可以用于生产的解决方案。 简而言
我们正在导出公钥和私钥。私钥将由用 Magic 编写的非 .net 软件使用。开发人员对导出 key 的格式有疑问。是否有白皮书或其他资源来解释导出数据的格式? 最佳答案 关于导出的 blob 类型的
我有使用 RSACryptoServiceProvider 在 C# 中生成的公钥: 4kKhD/FWAMtQTRifArfXjxZN+6bOXTkHrVpyz/1wODhSOB
我有一个 X509Certificate2 变量,我正在尝试将该变量的私钥转换为 RSACryptoServiceProvider RSACryptoServiceProvider pkey = (R
我需要解密文本,但收到消息 The parameter is incorrect。 证书获取正确,已在 Windows 中注册。 在搜索问题时,我可以阅读建议更改分配给 IIS 网站的应用程序池中的用
我使用 RSACryptoServiceProvider 加密了一段文本。我导出了公钥和私钥。显然我只是想在解码器应用程序中公开公钥,所以我编写了如下代码: private const string
如果我有一个从非托管应用程序创建的 key ,并且如果我想将此 key 导入托管应用程序并生成另一个 key 或对其进行加密。基本上相同的 key 将从托管和非托管代码来回导入/导出。 因此什么相当于
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Can RSACryptoServiceProvider (.NET’s RSA) use SHA256 f
一段时间以来,我一直在阅读 CodeProject 上的一篇文章,该文章解释了如何使用 RSA 提供程序进行加密和解密: RSA Private Key Encryption 虽然 2009 年的旧版
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.S
我正在尝试使用公钥加密与客户端和服务器进行通信。服务器应该生成一个 1024 位的公钥并将其发送给客户端,客户端将使用该 key 将加密数据发送回服务器。到目前为止,我已经用这个初始化了 RSACry
我目前正在处理一个简单的数据签名。这是我第一次使用签名,所以也许我做错了什么。但我认为使用 512 位 RSA 和 SHA1 哈希对 448 字节进行签名需要 4.6 秒是不正常的。 代码: byte
我是一名优秀的程序员,十分优秀!