Равносильная конвертация byte[] -> BigInteger -> byte[] - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Пишу проект для дипломной работы по криптографии и в нем необходимо считывать из файла заданное количество байт, преобразовывать их в беззнаковое длинное число, шифровать и потом записывать в другой файл. Затем проводится обратная операция и исходный и полученный в результате этой операции файлы должны совпадать. Проблема в том что при преобразовании byte[] в BigInteger иногда получаются отрицательные числа, и при преобразовании из BigInteger в byte[] получаются не одинаковые массивы байт. Помогите написать два метода конвертации из byte[] в BigInteger и BigInteger в byte[], так чтобы исходный и результирующий массив совпадали причем BigInteger должен быть всегда положительным. Мои попытки: №1:
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;
}
№2:
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
            }
        }
    }
}
P.S. Я задавал этот же вопрос на stackoverflow но там ответа не получил. Очень надеюсь на вашу помощь.

Решение задачи: «Равносильная конвертация 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))
                        {
 
                        }
                    }
                }
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5