.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 编码几乎但不完全相同。
对于Modulus
,RSAParameters
结构需要 DER 值,但删除了可选的符号填充 0x00
字节。 Exponent
也是一样。
如果您有一个私钥结构,那么D
必须具有与byte[]
相同的长度Modulus
(这可能意味着您必须在前面加上0x00
值)。如果指定了D
,则P
、Q
、DP
、DQ
和InverseQ
都是必需的,并且它们的长度必须正好是Modulus
的一半 ,这可能需要删除 DER 填充字节或可能需要插入一些。
【讨论】:
如果为真那么我的答案是错误的,我会删除它。你是怎么想出来的? @JamesKPolk 有点受折磨,不过github.com/dotnet/corefx/blob/…。如果您在 DER/ASN.1 解码器中阅读相关证书,您会看到预期的模数和指数与没有标签和长度的 DER 值相同(以及模值的填充字节)。虽然我有点担心我的回答暗示标签和长度应该存在......【参考方案2】:格式在 ASN.1 参考中指定。使用的格式称为 DER 编码,用于整数。 reference 可用于这些丑陋的编码。您确定没有更简单的方法可以将这些值作为 bigint 获取吗?
编辑
看起来您可以通过RSACryptoServiceProvider.ExportParameters()
获取RSAParameters
对象然后从中提取Exponent
和Modulus
字段来获取字节[] 数组。
【讨论】:
我使用的是 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 公钥模数和指数的格式是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 Objective-c 中从模数和指数以字节为单位生成 RSA 公钥
如何验证 Apple 登录的 Jwt 令牌(后端验证)。如何从 Java 中的模数和指数 (n,e) 生成 RSA 公钥