当前位置: 首页 > 知识库问答 >
问题:

如果模数和指数都是十进制格式,如何在C#中RSA工作

黄和怡
2023-03-14

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

公众指数:65537

我如何在C#中使用上面的RSA加密?

共有1个答案

鱼安然
2023-03-14

您可以尝试:

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:TobyTeArrayBigendianUnsigned()中的minSize用于导入具有InvariantQ.Length 的私钥。别理它。

 类似资料:
  • 我正在使用DecimalFormats将双打格式化为字符串。然后这个字符串被集成到我的表示层中。 问题:我想保留所有的小数。示例:“12345678.123456789” 格式:#.#- 我可以用##########对于大小数点,但是如果小数点更长呢? 我发现我的小测试程序很有用,想和大家分享。 你能帮我显示所有小数吗? 这导致: 编辑:一位用户提到了一个相关的问题:如何很好地将浮点数格式化为字符

  • 问题内容: 我想将整数数字格式化为十六进制字符串。 打印,但我希望它作为。我怎么做? 问题答案: 试试这个

  • 我已经在网上搜索了,我发现所有的都是使用DecimalFormat并尝试了它,但当我在Android Studio上编码时,出现了一条消息,说必须使用API24来执行这种命令。API24有错误和所有的网站,我看,建议使用API23。 因此,我需要一种方法来显示双数字,只有两个十进制数字在我的AlertDialog。

  • 问题内容: 如何在Swift中将Int转换为UInt8?例。我想将数字22转换为0b00010110 问题答案: 您可以使用带有参数的初始化程序将十进制值转换为人类可读的二进制 表示形式 : 如果您愿意,也可以很容易地用任意数量的零填充它: 斯威夫特5

  • 对于整数[1,2,4,8,16,...]我可以使用这个函数: 有没有一种优雅的类似的方法可以在不使用循环的情况下用十进制数字来做呢? 0.001 0.002 0.004 ... 2.048 并且应该可以根据一个初始值在小数点后使用任意数量的数字。 0.0001(初始值) 0.0002 0.0004 0.0016 ... 1.6384 现在我使用函数来确定十进制逗号后面是否有数字,并对它们进行计数:

  • 在我的程序中,我使用了#.#在中,如下所示: 我错误地添加了一个额外的如下所示: 但这并不影响我的输出。我尝试过使用不同的输入组合。输出没有差异。尝试过谷歌,但没有正确的解释。 那么使用“#.##”和“##.#”的确切区别是什么呢? 如果两者都是相同的,为什么Java中允许这样做? 如果两者都不同,为什么在这两种情况下输出是相同的? 编辑: 示例程序: 输出: