从 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 Documentation,BigInteger
构造函数期望数组按小端顺序排列(如果您期望结果 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));
作为作业的一部分,我需要在 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 Documentation,BigInteger
构造函数期望数组按小端顺序排列(如果您期望结果 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));