I need to implement DSA without any libaries (except key generation) in C# as part of my homework. I managed to generate the public and private key but when i try to get the parameters like G or Y and convert them into a BigInteger i sometimes get negative parameters. The parameters itself are positive in the byte array! They just turn into negative ones when i convert them into BigInteger. Here is the way i try it:
DSAParameters keys;
DSACryptoServiceProvider DSAalg = new DSACryptoServiceProvider();
keys = DSAalg.ExportParameters(true);
BigInteger G = new BigInteger(keys.G);
Console.WriteLine("G is {0} \n", G);
Any ideas how i could solve that?
As per the Microsoft Documentation the BigInteger
constructor expects the array to be in little-endian order (worth bearing in mind if you expect the resulting BigInteger
to have a particular value).
The remarks for the BigInteger
constructor state that you can make sure any BigInteger
created from a byte[]
is unsigned if you append a 00
byte to the end of the array before calling the constructor. In your case this would be something like:
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));