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

时间:2010-02-19 00:18:56

标签: rsa

在一个简短的问题中:如果我从第三方获得以下输入,我如何填写RSAParameters?:

模数:123456

Exponet:111

长话讲述,我使用以下代码:

RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(2048);

RSAParameters rsaPublic = RSAalg.ExportParameters(false);

然后我可以在byte []中获得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的格式是什么,以及如何将它们转换为具有{'0','1','2','3','4','5等格式的byte [] ','6','7','8','9'}?

非常感谢

2 个答案:

答案 0 :(得分:0)

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

修改

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

答案 1 :(得分:0)

byte[]值表示大整数的字节编码Big Endian表示。这与DER编码差不多,但并不完全一样。

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

如果您有私钥结构,则D必须与byte[]具有相同的长度Modulus(这可能意味着您必须预先添加0x00个值)。如果指定P,则QDPDQInverseQD都是必需的,并且所有人都必须正好是Modulus的长度的一半,这可能需要删除DER填充字节或者可能需要插入一些。