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

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

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

Здравствуйте. Пишу проект для дипломной работы по криптографии и в нем необходимо считывать из файла заданное количество байт, преобразовывать их в беззнаковое длинное число, шифровать и потом записывать в другой файл. Затем проводится обратная операция и исходный и полученный в результате этой операции файлы должны совпадать. Проблема в том что при преобразовании byte[] в BigInteger иногда получаются отрицательные числа, и при преобразовании из BigInteger в byte[] получаются не одинаковые массивы байт. Помогите написать два метода конвертации из byte[] в BigInteger и BigInteger в byte[], так чтобы исходный и результирующий массив совпадали причем BigInteger должен быть всегда положительным. Мои попытки: №1:
Листинг программы
  1. public ExtendedBigInteger(byte[] data)
  2. {
  3. if (!data.Any())
  4. throw new ArgumentNullException();
  5. if (data.Last() != 0)
  6. {
  7. IsNegative = true;
  8. Array.Resize(ref data, data.Length +1);
  9. Value = new BigInteger(data);
  10. }
  11. }
  12. public byte[] ToByteArray()
  13. {
  14. byte[] data = Value.ToByteArray();
  15. if (IsNegative)
  16. {
  17. Array.Resize(ref data, data.Length - 1);
  18. }
  19. return data;
  20. }
№2:
Листинг программы
  1. public UnsignedBigInteger(byte[] data, bool isNormalData)
  2. {
  3. _initialDataLength = data.Length;
  4. if (!data.Any())
  5. throw new ArgumentNullException();
  6. if (data.Last() != 0)
  7. {
  8. IsNegative = true;
  9. Array.Resize(ref data, data.Length + 1);
  10. Value = new BigInteger(data);
  11. }
  12. }
  13. public byte[] ToByteArray(bool toNormalData)
  14. {
  15. byte[] data = Value.ToByteArray();
  16. if (IsNegative)
  17. {
  18. Array.Resize(ref data, data.Length - 1);
  19. }
  20. if (_initialDataLength != null)
  21. {
  22. Array.Resize(ref data, _initialDataLength.Value);
  23. }
  24. return data;
  25. }
Вот так я это тестировал:
Листинг программы
  1. using (var stream = new FileStream(myFile, FileMode.Open, FileAccess.Read)) {
  2. byte[] buffer = new byte[32];
  3. using (var reader = new BinaryReader(stream))
  4. {
  5. for (int i = 0; i < stream.Length; i += bufferSize)
  6. {
  7. buffer = reader.ReadBytes(32);
  8. var bigValue = new ExtendedBigInteger(buffer);
  9. //var bigValue = new UnsignedBigInteger(buffer);
  10. var data = bigValue.ToByteArray();
  11. if (!buffer.SequenceEqual(data))
  12. {
  13. //Breakpoint - error
  14. }
  15. }
  16. }
  17. }
P.S. Я задавал этот же вопрос на stackoverflow но там ответа не получил. Очень надеюсь на вашу помощь.

Решение задачи: «Равносильная конвертация byte[] -> BigInteger -> byte[]»

textual
Листинг программы
  1. static void Main(string[] args)
  2.         {
  3.             var bufferSize = 32;
  4.             var myFile = @"C:\myFile.jpg";
  5.             Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
  6.             using (var stream = new FileStream(myFile, FileMode.Open, FileAccess.Read))
  7.             {
  8.                 using (var reader = new BinaryReader(stream))
  9.                 {
  10.                     while (stream.Position < stream.Length)
  11.                     {
  12.                         var buffer = reader.ReadBytes(bufferSize);
  13.                         BigInteger b1 = BigInteger.Parse(string.Join("", buffer.Select(d => d.ToString("d3")).ToArray()));
  14.                         string s1 = b1.ToString("0,0");
  15.                         byte[] outData = s1.Split(new char[] { ',' }).Select(s => byte.Parse(s)).ToArray();
  16.  
  17.                         if(b1.Sign == -1)
  18.                         {
  19.  
  20.                         }
  21.  
  22.                         if(!buffer.SequenceEqual(outData))
  23.                         {
  24.  
  25.                         }
  26.                     }
  27.                 }
  28.             }
  29.         }

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут