如果两者均为十进制格式,则如何在C#中使用RSA模数和指数

时间:2018-07-13 09:55:41

标签: c# rsa

我正在研究RSA加密,并将我的公共密钥放在C#中。但是我的公钥模数和指数为十进制格式,如下所示:

模数: 18597082174523508716390621410767314599038866539779750637065684697259605002694360104971398651747704217448206242771805831180528356170981586469477958663193117845356353634469679095227815268434823260637917891539622982485837392495877800705071553435850492058570460745900129552907596604479063007676795998193064078987369363544131073880694736862904482385332020513837955197528182597410203652025183467149166026077910473816908590029574674997850683021938033561647681780168764842253700974777073181357779101690539999736174329578178742236883520017849893817175274405622018571899733008344137833140207194792223664500885734080606246950229

公共指数: 65537

我如何在c#中将以上用于RSA加密?

2 个答案:

答案 0 :(得分:1)

对于其他发现此问题的人,我们现在可以使用对此功能的内置内置支持。 https://github.com/dotnet/runtime/issues/23812

var bi1 = BigInteger.Parse("18597082174523508716390621410767314599038866539779750637065684697259605002694360104971398651747704217448206242771805831180528356170981586469477958663193117845356353634469679095227815268434823260637917891539622982485837392495877800705071553435850492058570460745900129552907596604479063007676795998193064078987369363544131073880694736862904482385332020513837955197528182597410203652025183467149166026077910473816908590029574674997850683021938033561647681780168764842253700974777073181357779101690539999736174329578178742236883520017849893817175274405622018571899733008344137833140207194792223664500885734080606246950229");
var bi2 = BigInteger.Parse("65537");
var bytes1 = bi1.ToByteArray(true, true); // isUnsigned: true, isBigEndian: true
var bytes2 = bi2.ToByteArray(true, true);

var pars = new RSAParameters();
pars.Modulus = bytes1;
pars.Exponent = bytes2;

答案 1 :(得分:0)

您可以尝试:

public static class BigIntegerExtensions
{
    public static byte[] ToByteArrayBigEndianUnsigned(this BigInteger bi, int minSize = 0)
    {
        byte[] bytes = bi.ToByteArray();

        int length;

        if (bytes[bytes.Length - 1] != 0)
        {
            if (minSize == 0 || minSize <= bytes.Length)
            {
                Array.Reverse(bytes);
                return bytes;
            }

            length = bytes.Length;
        }
        else
        {
            length = bytes.Length - 1;
        }

        var bytes2 = new byte[minSize == 0 ? length : Math.Max(minSize, length)];

        for (int i = 0, j = bytes2.Length - 1; i < length && j >= 0; i++, j--)
        {
            bytes2[j] = bytes[i];
        }

        return bytes2;
    }
}

var bi1 = BigInteger.Parse("18597082174523508716390621410767314599038866539779750637065684697259605002694360104971398651747704217448206242771805831180528356170981586469477958663193117845356353634469679095227815268434823260637917891539622982485837392495877800705071553435850492058570460745900129552907596604479063007676795998193064078987369363544131073880694736862904482385332020513837955197528182597410203652025183467149166026077910473816908590029574674997850683021938033561647681780168764842253700974777073181357779101690539999736174329578178742236883520017849893817175274405622018571899733008344137833140207194792223664500885734080606246950229");
var bi2 = BigInteger.Parse("65537");
var bytes1 = bi1.ToByteArrayBigEndianUnsigned();
var bytes2 = bi2.ToByteArrayBigEndianUnsigned();

var pars = new RSAParameters();
pars.Modulus = bytes1;
pars.Exponent = bytes2;

关于BigInteger.ToByteArray()如何导出到byte[]以及RsaParameters如何期望其参数有两个区别:BigInteger是带符号的并且是小端的,所以有些Modulus附加一个0使它们为正(对于1024位密钥,长度为129个字节而不是128个字节),而最高有效位是最后一位,RsaParameters期望其参数为无符号的(因此,必须使用1024位密钥长度为128个字节)和大尾数(因此,最高有效位是第一个)。

请注意,从BigInteger导入私钥更加复杂:-)

注2:minSize中的ToByteArrayBigEndianUnsigned()用于导入带有InvariantQ.Length < Exponent.Length / 2的私钥。忽略它。