RSA公钥指数16个字节

时间:2017-01-09 18:38:11

标签: c# encryption rsa

我正在编写一个使用Exponents中有16个字节的公钥的软件

我有以下代码

string longKey = @"-----BEGIN RSA PUBLIC KEY-----
MIGWAoGBAMqfGO9sPz+kxaRh/qVKsZQGul7NdG1gonSS3KPXTjtcHTFfexA4MkGA
mwKeu9XeTRFgMMxX99WmyaFvNzuxSlCFI/foCkx0TZCFZjpKFHLXryxWrkG1Bl9+
+gKTvTJ4rWk1RvnxYhm3n/Rxo2NoJM/822Oo7YBZ5rmk8NuJU4HLAhAYcJLaZFTO
sYU+aRX4RmoF
-----END RSA PUBLIC KEY-----";

using (var reader = new StringReader(longKey))
{
    var pem = new PemReader(reader);
    var o = (RsaKeyParameters)pem.ReadObject();
    using (var rsa = new RSACryptoServiceProvider())
    {
        var parameters = new RSAParameters
        {
            Modulus = o.Modulus.ToByteArray(),
            Exponent = o.Exponent.ToByteArray()
        };
        rsa.ImportParameters(parameters);

    //other code is here that uses the rsa

    }
}

该密钥与某些条形码一起使用并提供给我,但也可在其他不同网站上在线获取

我面临的问题是ImportParameters提供了一个例外,在研究后我只发现“坏数据”我发现RSACryptoServiceProvider在Exponents中只使用了4个字节,但这个公钥在指数中有16个字节。如果我将Exponent设为静态字节数组1,0,1那么ImportParameters可以工作,但显然我的其余代码都失败了

我可以使用其他方法来使用此密钥,例如C ++,还是可以在C#中完成。我不是RSA加密方面的专家

1 个答案:

答案 0 :(得分:1)

如果您使用的是.NET 4.6或更高版本,则可以使用RSACng作为RSACryptoServiceProvider的替代品。

它有一个不幸的支持矩阵:

  • 4.6:只要您在自己的代码中使用它,RSACng就能很好地工作。
  • 4.6.1:有些但不是所有的框架库都能理解RSACng对象(RSACryptoServiceProvider是特殊的)
  • 4.6.2:几乎所有框架库都理解RSACng

RSACng对Exponent值的大小没有4字节的限制。