DSAParameter在从byte[]转换为BigInteger时为负数
本文关键字:BigInteger 转换 在从 byte DSAParameter | 更新日期: 2023-09-27 18:37:00
作为家庭作业的一部分,我需要在没有任何库(密钥生成除外)的情况下在 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);
有什么想法吗?
根据Microsoft文档,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));