2016-03-01 116 views
1

我需要在C#中没有任何libaries(除了密钥生成)之外实现DSA,这是我作业的一部分。 我设法生成公钥和私钥,但是当我尝试获取像G或Y这样的参数并将它们转换为BigInteger时,我有时会得到负面参数。字节数组中的参数本身是正数!当我将它们转换成BigInteger时,它们会变成负面的。这是我尝试它的方式:从byte []转换为BigInteger时,DSAParameters为负数

DSAParameters keys;   
DSACryptoServiceProvider DSAalg = new DSACryptoServiceProvider(); 
keys = DSAalg.ExportParameters(true); 
BigInteger G = new BigInteger(keys.G); 
Console.WriteLine("G is {0} \n", G); 

任何想法我可以解决这个问题?

+0

127以上的最重要的字节被视为负数,除非前面有一个00字节。这可能会使你的一些结果为负面。查看文档以'ToByteArray'。 –

回答

0

按照Microsoft DocumentationBigInteger构造函数期望数组处于little-endian顺序(值得注意的是,如果您期望得到的BigInteger具有特定值)。

BigInteger构造状态,你可以确保从byte[]创建的任何BigInteger是无符号的,如果你调用构造函数之前追加一个00字节数组结束的言论。在你的情况下,这将是这样的:

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

是的,这帮助了我很多并解决了问题,谢谢! – laphory