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

有什么想法吗?

DSAParameter在从byte[]转换为BigInteger时为负数

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