Равносильная конвертация byte[] -> BigInteger -> byte[] - C#
Формулировка задачи:
Здравствуйте. Пишу проект для дипломной работы по криптографии и в нем необходимо считывать из файла заданное количество байт, преобразовывать их в беззнаковое длинное число, шифровать и потом записывать в другой файл. Затем проводится обратная операция и исходный и полученный в результате этой операции файлы должны совпадать. Проблема в том что при преобразовании byte[] в BigInteger иногда получаются отрицательные числа, и при преобразовании из BigInteger в byte[] получаются не одинаковые массивы байт.
Помогите написать два метода конвертации из byte[] в BigInteger и BigInteger в byte[], так чтобы исходный и результирующий массив совпадали причем BigInteger должен быть всегда положительным.
Мои попытки:
№1:
№2:
Вот так я это тестировал:
P.S. Я задавал этот же вопрос на stackoverflow но там ответа не получил. Очень надеюсь на вашу помощь.
public ExtendedBigInteger(byte[] data)
{
if (!data.Any())
throw new ArgumentNullException();
if (data.Last() != 0)
{
IsNegative = true;
Array.Resize(ref data, data.Length +1);
Value = new BigInteger(data);
}
}
public byte[] ToByteArray()
{
byte[] data = Value.ToByteArray();
if (IsNegative)
{
Array.Resize(ref data, data.Length - 1);
}
return data;
}public UnsignedBigInteger(byte[] data, bool isNormalData)
{
_initialDataLength = data.Length;
if (!data.Any())
throw new ArgumentNullException();
if (data.Last() != 0)
{
IsNegative = true;
Array.Resize(ref data, data.Length + 1);
Value = new BigInteger(data);
}
}
public byte[] ToByteArray(bool toNormalData)
{
byte[] data = Value.ToByteArray();
if (IsNegative)
{
Array.Resize(ref data, data.Length - 1);
}
if (_initialDataLength != null)
{
Array.Resize(ref data, _initialDataLength.Value);
}
return data;
}using (var stream = new FileStream(myFile, FileMode.Open, FileAccess.Read)) {
byte[] buffer = new byte[32];
using (var reader = new BinaryReader(stream))
{
for (int i = 0; i < stream.Length; i += bufferSize)
{
buffer = reader.ReadBytes(32);
var bigValue = new ExtendedBigInteger(buffer);
//var bigValue = new UnsignedBigInteger(buffer);
var data = bigValue.ToByteArray();
if (!buffer.SequenceEqual(data))
{
//Breakpoint - error
}
}
}
}Решение задачи: «Равносильная конвертация byte[] -> BigInteger -> byte[]»
textual
Листинг программы
static void Main(string[] args)
{
var bufferSize = 32;
var myFile = @"C:\myFile.jpg";
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
using (var stream = new FileStream(myFile, FileMode.Open, FileAccess.Read))
{
using (var reader = new BinaryReader(stream))
{
while (stream.Position < stream.Length)
{
var buffer = reader.ReadBytes(bufferSize);
BigInteger b1 = BigInteger.Parse(string.Join("", buffer.Select(d => d.ToString("d3")).ToArray()));
string s1 = b1.ToString("0,0");
byte[] outData = s1.Split(new char[] { ',' }).Select(s => byte.Parse(s)).ToArray();
if(b1.Sign == -1)
{
}
if(!buffer.SequenceEqual(outData))
{
}
}
}
}
}