Переделать unsafe код в safe - C#

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

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

Есть реализация криптоалгоритма Xtea с использованием unsafe кода. Как передалать его в safe? Фрагмент, который нужно переделать.
Листинг программы
  1. fixed (byte* bufferPtr = buffer)//????????????????????
  2. {
  3. uint* words = (uint*)(bufferPtr + index);//????????????????????
Весь код:
Листинг программы
  1. public static class Xtea
  2. {
  3. public unsafe static bool Encrypt(ref byte[] buffer, ref int length, int index, uint[] key)
  4. {
  5. if (key == null)//проверяем ключ
  6. return false;
  7. int msgSize = length - index;//задаем размер с учетом индекса
  8. int pad = msgSize % 8;//длина блока 64 бит, должно быть 8 байт(8 байт *8 = 64 бит)
  9. if (pad > 0)//делаем длину меседжа 8*n
  10. {
  11. msgSize += (8 - pad);
  12. length = index + msgSize;
  13. }
  14.  
  15. fixed (byte* bufferPtr = buffer)//????????????????????
  16. {
  17. uint* words = (uint*)(bufferPtr + index);//????????????????????
  18. //дальше все понятно
  19. for (int pos = 0; pos < msgSize / 4; pos += 2)
  20. {
  21. uint x_sum = 0, x_delta = 0x9e3779b9, x_count = 32;
  22. while (x_count-- > 0)
  23. {
  24. words[pos] += (words[pos + 1] << 4 ^ words[pos + 1] >> 5) + words[pos + 1] ^ x_sum
  25. + key[x_sum & 3];
  26. x_sum += x_delta;
  27. words[pos + 1] += (words[pos] << 4 ^ words[pos] >> 5) + words[pos] ^ x_sum
  28. + key[x_sum >> 11 & 3];
  29. }
  30. }
  31. }
  32. return true;
  33. }
  34. public unsafe static bool Decrypt(ref byte[] buffer, ref int length, int index, uint[] key)
  35. {
  36. if (length <= index || (length - index) % 8 > 0 || key == null)
  37. return false;
  38. fixed (byte* bufferPtr = buffer)//????????????????????
  39. {
  40. uint* words = (uint*)(bufferPtr + index);//????????????????????
  41. int msgSize = length - index;
  42. //дальше все понятно
  43. for (int pos = 0; pos < msgSize / 4; pos += 2)
  44. {
  45. uint x_count = 32, x_sum = 0xC6EF3720, x_delta = 0x9E3779B9;
  46. while (x_count-- > 0)
  47. {
  48. words[pos + 1] -= (words[pos] << 4 ^ words[pos] >> 5) + words[pos] ^ x_sum
  49. + key[x_sum >> 11 & 3];
  50. x_sum -= x_delta;
  51. words[pos] -= (words[pos + 1] << 4 ^ words[pos + 1] >> 5) + words[pos + 1] ^ x_sum
  52. + key[x_sum & 3];
  53. }
  54. }
  55. }
  56. length = (int)(BitConverter.ToUInt16(buffer, index) + 2 + index);
  57. return true;
  58. }
  59. }

Решение задачи: «Переделать unsafe код в safe»

textual
Листинг программы
  1. uint word1 = BitConverter.ToUInt32(buffer, index);
  2. uint word2 = BitConverter.ToUInt32(buffer, index + 4);
  3. uint wordn = BitConverter.ToUInt32(buffer, index + 4 * n);

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


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

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

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

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

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

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