我需要在C#中实现DSA而不使用任何库(除了密钥生成)作为我作业的一部分。 我设法生成公钥和私钥,但是当我尝试获取G或Y等参数并将它们转换为BigInteger时,我有时会得到负参数。参数本身在字节数组中是正数!当我将它们转换为BigInteger时,它们会变成负面的。这是我尝试的方式:
DSAParameters keys;
DSACryptoServiceProvider DSAalg = new DSACryptoServiceProvider();
keys = DSAalg.ExportParameters(true);
BigInteger G = new BigInteger(keys.G);
Console.WriteLine("G is {0} \n", G);
我有什么想法可以解决这个问题?
答案 0 :(得分:0)
根据Microsoft Documentation,BigInteger
构造函数期望数组采用小端顺序(如果期望结果BigInteger
具有特定值,请记住这一点)。
BigInteger
构造函数的备注指出,如果您在BigInteger
字节末尾添加byte[]
字节,则可以确保从00
创建的任何DSAParameters keys;
var DSAalg = new DSACryptoServiceProvider();
keys = DSAalg.ExportParameters(true);
byte[] bytes = keys.G;
if ((bytes[bytes.Length - 1] & 0x80) > 0)
{
var temp = new byte[bytes.Length];
Array.Copy(bytes, temp, bytes.Length);
bytes = new byte[temp.Length + 1];
Array.Copy(temp, bytes, temp.Length);
}
Console.WriteLine("G is {0} \n", new BigInteger(bytes));
都是无符号的。调用构造函数之前的数组。在你的情况下,这将是:
ChromeDriver