【问题标题】:DSAParameters are negative when converted from byte[] to BigInteger从 byte[] 转换为 BigInteger 时,DSAParameters 为负数
【发布时间】:2023-04-07 22:31:01
【问题描述】:

我需要在 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);

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 高于 127 的最重要字节被视为负数,除非前面有 00 字节。这可能会使您的某些结果为负。请参阅“ToByteArray”的文档。

标签: c# bytearray biginteger dsa


【解决方案1】:

根据Microsoft DocumentationBigInteger 构造函数期望数组采用 little-endian 顺序(如果您期望生成的 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));

【讨论】:

  • 是的,这对我有很大帮助并解决了问题,谢谢!
猜你喜欢
  • 2019-03-08
  • 1970-01-01
  • 2011-10-10
  • 2016-01-29
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多