.net 中 RSA 公钥模数和指数的格式是啥?

Posted

技术标签:

【中文标题】.net 中 RSA 公钥模数和指数的格式是啥?【英文标题】:what is the format of RSA public key modulus and exponent in .net?.net 中 RSA 公钥模数和指数的格式是什么? 【发布时间】:2011-01-18 14:13:28 【问题描述】:

一个简短的问题:如果我有来自第三方的以下输入,我该如何填写 RSAParameters?:

模数:123456

指数:111

长话短说,我使用以下代码:

RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(2048);

RSAParameters rsaPublic = RSAalg.ExportParameters(false);

然后我可以在字节 [] 中获取 rsa 公钥的模数和指数。为了把这些信息写成asn.1格式

      RSAPublicKey ::= SEQUENCE 
           modulus           INTEGER,  -- n
           publicExponent    INTEGER   -- e
       

我使用 asn.1 库将 byte[] 转换为它的 bigInteger 格式,但是这个 byte[] 应该是 '0', '1', '2', '3', '4 这样的格式', '5', '6', '7', '8', '9' 假设它是十进制。

但好像 rsaPublic.modulus 和 rsaPublic.exponent 不是这种格式,模数和指数的 byte[] 中有很多非数字。那么 rsaPublic.modulus 和 rsaPublic.exponent 的格式是什么,以及如何将它们转换为 byte[] 格式为 '0', '1', '2', '3', '4', '5 ', '6', '7', '8', '9'?

非常感谢

【问题讨论】:

【参考方案1】:

byte[] 值表示大整数的字节编码 Big Endian 表示。这与 DER 编码几乎但不完全相同。

对于ModulusRSAParameters 结构需要 DER 值,但删除了可选的符号填充 0x00 字节。 Exponent 也是一样。

如果您有一个私钥结构,那么D 必须具有与byte[] 相同的长度Modulus(这可能意味着您必须在前面加上0x00 值)。如果指定了D,则PQDPDQInverseQ 都是必需的,并且它们的长度必须正好是Modulus 的一半 ,这可能需要删除 DER 填充字节或可能需要插入一些。

【讨论】:

如果为真那么我的答案是错误的,我会删除它。你是怎么想出来的? @JamesKPolk 有点受折磨,不过github.com/dotnet/corefx/blob/…。如果您在 DER/ASN.1 解码器中阅读相关证书,您会看到预期的模数和指数与没有标签和长度的 DER 值相同(以及模值的填充字节)。虽然我有点担心我的回答暗示标签和长度应该存在......【参考方案2】:

格式在 ASN.1 参考中指定。使用的格式称为 DER 编码,用于整数。 reference 可用于这些丑陋的编码。您确定没有更简单的方法可以将这些值作为 bigint 获取吗?

编辑

看起来您可以通过RSACryptoServiceProvider.ExportParameters() 获取RSAParameters 对象然后从中提取ExponentModulus 字段来获取字节[] 数组。

【讨论】:

我使用的是 asn.1 库。它可以轻松处理 asn.1 公钥格式。但问题是我不知道如何将 byte[] 中的 .net 模数转换为合理的 byte[] 像 '0', '1', '2', '3', '4', '5' , '6', '7', '8', '9', byte[] 中的 rsa 模数似乎没有意义,是否以某种格式编码? 它基本上是一个大端字节数组的整数,前面有一些头字节。等效地,它是表示为以 256 为基数的整数。你想用字节[]做什么,那么也许我可以提供更好的线索。? 我需要他们通过 .net RSA 模数和指数生成 PKCS#1 asn.1 RSA 公钥。我的方法是使用 asn.1 库。它可以接受base-2、base-18、base-10或base-16中byte[]中的模数和指数,然后生成他自己的大整数,然后它可以生成PKCS#1公钥格式。所以首先我想通过 .net RSA 模数和指数生成 biginteger。 .net RSA 模数和指数在 byte[] 中,但并非这些 byte[] 中的所有元素都是 ASCII 数字,对吧?我希望你能明白我在说什么。 GregS,我想你可能是对的,RASParameters.modulus 和 RASParameters.exponent 似乎只有 byte[] 中的 big-endian base-256 numuber,即 RASParameters.modulus[0] 是最显着位,没有任何信息。我说的对吗? 正确,模数[0]是最重要的字节,模数[modulus->Length - 1]是最不重要的。

以上是关于.net 中 RSA 公钥模数和指数的格式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

RSA:在给定公钥的情况下获取指数和模数

使用Python从公钥获取RSA指数和模数

使用模数和公共指数的 C# RSA 加密

Java中的RSA加密/解密

在 Objective-c 中从模数和指数以字节为单位生成 RSA 公钥

如何验证 Apple 登录的 Jwt 令牌(后端验证)。如何从 Java 中的模数和指数 (n,e) 生成 RSA 公钥