从 byte[] 转换为 BigInteger 时 DSAParameters 为负数

DSAParameters are negative when converted from byte[] to BigInteger

作为作业的一部分,我需要在 C# 中实现没有任何库(密钥生成除外)的 DSA。 我设法生成了 public 和私钥,但是当我尝试获取 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);

有什么解决办法吗?

根据 Microsoft DocumentationBigInteger 构造函数期望数组按小端顺序排列(如果您期望结果 BigInteger 具有特定值,请牢记).

BigInteger 构造函数的注释表明,如果在末尾附加 00 字节,则可以确保从 byte[] 创建的任何 BigInteger 都是无符号的调用构造函数之前的数组。在您的情况下,这将类似于:

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));