Алгоритм шифрования ГОСТ 28147-89. Режим простой замены - C#

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

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

Реализовывал алгоритм по wiki. Но что то не то получилось.Вот код:
Листинг программы
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Windows.Forms;
  10. namespace InformationSecurity1
  11. {
  12. public partial class Form1 : Form
  13. {
  14. public Form1()
  15. {
  16. InitializeComponent();
  17. }
  18. byte[,] Sblocks = {
  19. {4, 10, 9, 2, 13, 8, 0, 14, 6, 11, 1, 12, 7, 15, 5, 3},
  20. {14, 11, 4, 12, 6, 13, 15, 10, 2, 3, 8, 1, 0, 7, 5, 9},
  21. {5, 8,1, 13, 10, 3, 4, 2, 14, 15, 12, 7, 6, 0, 9, 11},
  22. {7, 13, 10, 1, 0, 8 ,9 ,15, 14, 4, 6, 12, 11, 2, 5, 3},
  23. {6, 12, 7, 1, 5, 15, 13, 8, 4, 10, 9, 14, 0, 3, 11, 2},
  24. {4, 11, 10, 0, 7, 2, 1, 13, 3, 6, 8, 5, 9, 12, 15, 14},
  25. {13, 11, 4, 1, 3, 15, 5, 9, 0, 10, 14, 7, 6, 8, 2, 12},
  26. {1, 15, 13, 0, 5, 7, 10, 4, 9, 2, 3, 14, 6, 11, 8, 12}
  27. };//Блок замен
  28. List<byte[]> lsKey = new List<byte[]>();//Список подключей размером в 4 байта
  29. List<byte[]> lsData = new List<byte[]>();//Список блоков открытого текста размером 8 байт
  30. byte[] fillingArrayData(List<byte[]> list)
  31. {
  32. byte[] array = new byte[list.Count * 8];
  33. int index = 0;
  34. for (int i = 0; i < list.Count; ++i)
  35. {
  36. for (int j = 0; j < list[i].Length; ++j)
  37. {
  38. array[index] = list[i][j];
  39. index++;
  40. }
  41. }
  42. return array;
  43. }
  44. void fillingListData(string data)
  45. {
  46. byte[] temp = Encoding.Default.GetBytes(data);
  47. int count = 0;
  48. byte[] k = new byte[8];
  49. for (int i = 0; i < temp.Length; ++i)
  50. {
  51. if (count != 8)
  52. {
  53. k[count] = temp[i];
  54. count++;
  55. }
  56. else
  57. {
  58. lsData.Add(k);
  59. --i;
  60. count = 0;
  61. k = new byte[8];
  62. }
  63. }
  64. lsData.Add(k);
  65. }
  66. void fillingListKey(string key)
  67. {
  68. byte[] temp = Encoding.Default.GetBytes(key);
  69. int count = 0;
  70. byte[] k = new byte[4];
  71. for (int i = 0; i < temp.Length; ++i)
  72. {
  73. if (count != 4)
  74. {
  75. k[count] = temp[i];
  76. count++;
  77. }
  78. else
  79. {
  80. lsKey.Add(k);
  81. --i;
  82. count = 0;
  83. k = new byte[4];
  84. }
  85. }
  86. lsKey.Add(k);
  87. }
  88. int lengthKey(string key)
  89. {
  90. byte[] temp = Encoding.Default.GetBytes(key);
  91. return temp.Length;
  92. }
  93. byte[] retL(byte[] data)
  94. {
  95. byte[] temp = new byte[4];
  96. for (int i = 0; i < 4; ++i)
  97. {
  98. temp[i] = data[i];
  99. }
  100. return temp;
  101. }//Возвращает старшую часть 8 байтового блока данных
  102. byte[] retR(byte[] data)
  103. {
  104. byte[] temp = new byte[4];
  105. int count = 4;
  106. for (int i = 0; i < 4; ++i)
  107. {
  108. temp[i] = data[count];
  109. count++;
  110. }
  111. return temp;
  112. }//Возвращает младшую часть 8 байтового блока данных
  113.  
  114. byte[] mod2_32(byte[] a, byte[] b)
  115. {
  116. byte[] res;
  117. UInt32 A = BitConverter.ToUInt32(a, 0);
  118. UInt32 B = BitConverter.ToUInt32(b, 0);
  119. A += B;
  120. res = BitConverter.GetBytes(A);
  121. return res;
  122. }// Сложение по модулю 2^32
  123. UInt32 func(byte[] R, byte[] Ki)
  124. {
  125. byte[] s8 = new byte[8];
  126. int count = 0;
  127. byte[] s = mod2_32(R, Ki);
  128. for (int j = 0; j < s.Length; ++j)
  129. {
  130. byte e = (byte)((s[j] >> 4));
  131. s8[count] = e;
  132. ++count;
  133. byte f = (byte)((s[j] & 15));
  134. s8[count] = f;
  135. ++count;
  136. }
  137. for (int i = 0; i < 8; ++i)
  138. {
  139. s8[i] = Sblocks[i, (int)s8[i]];
  140. }
  141. UInt32 result = BitConverter.ToUInt32(s8, 0);
  142. result = result << 11;
  143. return result;
  144. }
  145. byte[] encode(byte[] data)
  146. {
  147. byte[] L = retL(data);
  148. byte[] R = retR(data);
  149. byte[] block = new byte[4];
  150. UInt32 temp = 0;
  151. int index = 0;
  152. bool flag = true;
  153. for (int i = 0; i < 32; ++i)
  154. {
  155. if (i == 24)
  156. {
  157. flag = false;
  158. }
  159. if (flag)
  160. {
  161. if (index == 8)
  162. {
  163. index = 0;
  164. }
  165. temp = func(R, lsKey[index]);
  166. index++;
  167. }
  168. else
  169. {
  170. if (index == 8)
  171. {
  172. --index;
  173. }
  174. temp = func(R, lsKey[index]);
  175. --index;
  176. }
  177. temp = BitConverter.ToUInt32(L, 0) ^ temp;
  178. L = R;
  179. R = BitConverter.GetBytes(temp);
  180. }
  181. byte[] result = new byte[8];
  182. index = 0;
  183. for (int i = 0; i < 8; ++i)
  184. {
  185. if (i < 4)
  186. {
  187. result[i] = L[i];
  188. }
  189. else
  190. {
  191. result[i] = R[index];
  192. index++;
  193. }
  194. }
  195. return result;
  196. }
  197. byte[] decode(byte[] data)
  198. {
  199. byte[] L = retL(data);
  200. byte[] R = retR(data);
  201. byte[] block = new byte[4];
  202. UInt64 temp = 0;
  203. int index = 0;
  204. bool flag = false;
  205. for (int i = 0; i < 32; ++i)
  206. {
  207. if (i == 24)
  208. {
  209. flag = true;
  210. }
  211. if (flag)
  212. {
  213. if (index == 8)
  214. {
  215. index = 0;
  216. }
  217. temp = func(R, lsKey[index]);
  218. index++;
  219. }
  220. else
  221. {
  222. if (index == 0)
  223. {
  224. index=7;
  225. }
  226. temp = func(R, lsKey[index]); //index выходит за рамки равен -1
  227. --index;
  228. }
  229. temp = BitConverter.ToUInt32(L, 0) ^ temp;
  230. L = R;
  231. R = BitConverter.GetBytes(temp);
  232. //++index;
  233. }
  234. byte[] result = new byte[8];
  235. index = 0;
  236. for (int i = 0; i < 8; ++i)
  237. {
  238. if (i < 4)
  239. {
  240. result[i] = L[i];
  241. }
  242. else
  243. {
  244. result[i] = R[index];
  245. index++;
  246. }
  247. }
  248. return result;
  249. }
  250. private void textBox2_TextChanged(object sender, EventArgs e)
  251. {
  252. if (lengthKey(textBox2.Text) < 32)
  253. {
  254. textBox2.BackColor = Color.Red;
  255. button1.Enabled = false;
  256. }
  257. else
  258. {
  259. if (lengthKey(textBox2.Text) > 32)
  260. {
  261. textBox2.BackColor = Color.Red;
  262. button1.Enabled = false;
  263. }
  264. else
  265. {
  266. textBox2.BackColor = Color.Green;
  267. button1.Enabled = true;
  268. textBox2.MaxLength = textBox2.TextLength;
  269. }
  270. }
  271. }
  272. private void button1_Click(object sender, EventArgs e)
  273. {
  274. fillingListKey(textBox2.Text);
  275. fillingListData(textBox1.Text);
  276. // byte[] temp = Encoding.Default.GetBytes(textBox1.Text);
  277. byte[] t = new byte[8];
  278. List<byte[]> result = new List<byte[]>();
  279. for (int i = 0; i < lsData.Count; ++i)
  280. {
  281. t = encode(lsData[i]);
  282. result.Add(t);
  283. }
  284. byte[] res = fillingArrayData(result);
  285. textBox3.Text = Encoding.Default.GetString(res);
  286. }
  287. private void button2_Click(object sender, EventArgs e)
  288. {
  289. fillingListKey(textBox2.Text);
  290. fillingListData(textBox3.Text);
  291. byte[] temp = Encoding.Default.GetBytes(textBox3.Text);
  292. byte[] t = new byte[8];
  293. List<byte[]> result = new List<byte[]>();
  294. for (int i = 0; i < lsData.Count; ++i)
  295. {
  296. t = decode(lsData[i]);
  297. result.Add(t);
  298. }
  299. byte[] res = fillingArrayData(result);
  300. textBox4.Text = Encoding.Default.GetString(res);
  301. }
  302. }
  303. }
Возможно я неверно понял алгоритм? P.S. Если возникли не понимания в коде спрашивайте разъясню: что делает, почему и как

Решение задачи: «Алгоритм шифрования ГОСТ 28147-89. Режим простой замены»

textual
Листинг программы
  1. byte[] bKey = {
  2.          0x33,  0x20,  0x6d,  0x54,
  3.          0x32,  0x6c,  0x65,  0x68,
  4.          0x20,  0x65,  0x73,  0x69,
  5.          0x62,  0x6e,  0x73,  0x73,
  6.          0x79,  0x67,  0x61,  0x20,
  7.          0x74,  0x74,  0x67,  0x69,
  8.          0x65,  0x68,  0x65,  0x73,
  9.                  0x73,  0x3d,  0x2C,  0x20
  10.                           };

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


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

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

14   голосов , оценка 4 из 5

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

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

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