2016-03-01 2 views
1

Мне нужно реализовать DSA без каких-либо libaries (кроме генерации ключей) в C# в качестве части моей домашней работы. Мне удалось создать открытый и закрытый ключ, но когда я пытаюсь получить такие параметры, как G или Y, и преобразовать их в BigInteger, я иногда получаю отрицательные параметры. Сами параметры положительны в массиве байтов! Они превращаются в негативные, когда я конвертирую их в BigInteger. Вот как я это делаю:DSAParameters отрицательны при преобразовании из байта [] в BigInteger

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 Documentation в BigInteger конструктор ожидает массив, чтобы быть в прямой порядок байтов порядка (стоит иметь в виду, если вы ожидаете, что в результате BigInteger иметь особое значение).

Замечание для государства BigInteger конструктора, которые вы можете убедиться, что любой BigInteger создан из byte[] беззнакового а если вы добавите 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