Advertisement
Guest User

Untitled

a guest
Apr 1st, 2015
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <conio.h>
  4. #include <stdlib.h>
  5. #include <sstream>
  6. #include <fstream>
  7.  
  8. using namespace std;
  9. int main()
  10. {
  11. int k; //выбор шифрования или дешифрования
  12. string result = "";
  13. string result1;
  14. string keyV = ""; //ключ Виженера
  15. string keyG = ""; //ключ Гамма
  16. string key_v = ""; //строка,в которую будет растягиваться ключ на длину исходного текста для Виженера
  17. string key_g = "";//строка,в которую будет растягиваться ключ на длину исходного текста для Гаммы
  18. bool flag;
  19. int x = 0, y = 0; //Координаты нового символа из таблицы Виженера
  20. int reg = 0; //Регистр символа
  21. char cop; //Копия прописной буквы
  22.  
  23. //Формирование таблицы Виженера
  24. int shift = 0;
  25. char **tabv = new char *[59]; //Таблица Виженера
  26. for (int i=0;i<26;i++)
  27. tabv[i] = new char [26];
  28. string alf = "abcdefghijklmnopqrstuvwxyz"; //Алфавит
  29.  
  30. for (int i = 0; i < 26; i++)
  31. for (int j = 0; j < 26; j++)
  32. {
  33. shift = j + i;
  34. if (shift >= 26) shift = shift % 26;
  35. tabv[i][j] = alf[shift];
  36. }
  37. cout<<"Enter 1 for encryption and decryption of 2"<<endl;
  38. cin>>k;
  39. switch (k) //Если k
  40. {
  41. case 1: //Если выбрано шифрование
  42. {
  43. cout<<"Enter key encryption for Vizhener"<<endl;
  44. cin>>keyV;
  45. cout<<endl<<"Enter key encryption for Gamma"<<endl;
  46. cin>>keyG;
  47. setlocale(LC_ALL,"Russian");//Чтение файла
  48. string s; //Строка считанная из файла
  49. ifstream in("Open_text.txt");
  50. getline(in,s);
  51. string s1=s;
  52. cout<<endl<<"Open text: "<<s<<endl;
  53. in.close();
  54.  
  55. //Формирование строки, длиной шифруемой, состоящей из повторений ключа
  56. for (int i = 0; i < s.length(); i++)
  57. {
  58. key_v += keyV[i % keyV.length()];
  59. }
  60.  
  61. //заполняем массив с символами ключа для Гаммы
  62.  
  63. for (int i = 0; i < keyG.length(); i++)
  64. {
  65. key_g += keyG[i % keyG.length()];
  66. }
  67.  
  68. //Шифруем Гаммой
  69.  
  70. for (int i = 0; i < s.length(); i++)
  71. {
  72. s1[i+1] = (s1[i+1]+key_g[i%keyG.length()])%255;
  73. }
  74. cout<<"Result Gamma:";
  75. cout<<s1<<endl;
  76. ofstream out1("Result_Gamma.txt");
  77.  
  78. out1<<s1;
  79.  
  80. //Шифрование при помощи таблицы Виженера
  81. for (int i = 0; i < s.length(); i++)
  82. {
  83. //Если нешифруемый символ
  84. if (((int)(s[i]) < 65) || ((int)(s[i]) > 122))
  85. result += s[i];
  86. else
  87. {
  88. //Поиск в первом столбце строки, начинающейся с символа ключа
  89. int l = 0;
  90. flag = false;
  91. //Пока не найден символ
  92. while ((l < 26) && (flag == false))
  93. {
  94. //Если символ найден
  95. if (key_v[i] == tabv[l][0])
  96. {
  97. //Запоминаем в х номер строки
  98. x = l;
  99. flag = true;
  100. }
  101. l++;
  102. }
  103. //Уменьшаем временно регистр прописной буквы
  104. if (((int)(s[i]) <= 90) && ((int)(s[i]) >= 65))
  105. {
  106. cop = (char)((int)(s[i]) + 32);
  107. reg = 1;
  108. }
  109. else
  110. {
  111. reg = 0;
  112. cop = s[i];
  113. }
  114. l = 0;
  115. flag = false;
  116. //Пока не найден столбец в первой строке с символом строки
  117. while ((l < 26) && (flag == false))
  118. {
  119. if (cop == tabv[0][l])
  120. {
  121. //Запоминаем номер столбца
  122. y = l;
  123. flag = true;
  124. }
  125. l++;
  126. }
  127. //Увеличиваем регистр буквы до прописной
  128. if (reg == 1)
  129. {
  130. //Изменяем символ на первоначальный регистр
  131. cop = char((int)(tabv[x][y]) - 32);
  132. result += cop;
  133. }
  134. else
  135. result += tabv[x][y];
  136. }
  137. }
  138.  
  139. cout<<"Result Vizhener:";
  140. cout<<result; //Вывод результата
  141. ofstream out("Result_Vizhener.txt");
  142. out<<result;
  143. break;
  144. }
  145. case 2: //Если выбрано дешифрование
  146. {
  147. cout<<"Enter key decryption for Vizhener"<<endl;
  148. cin>>keyV;
  149. cout<<"Enter key decryption for Gamma"<<endl;
  150. cin>>keyG;
  151. setlocale(LC_ALL,"Russian");
  152. string s;
  153. ifstream in("Open_text.txt");
  154. getline(in,s);
  155. string s1=s;
  156. cout<<"Open text: "<<s<<endl;
  157. in.close();
  158. //Формирование строки, длиной дешифруемой, состоящей из повторений ключа
  159. for (int i = 0; i < s.length(); i++)
  160. {
  161. key_v += keyV[i % keyV.length()];
  162. }
  163. //Дешифрование при помощи таблицы
  164. for (int i = 0; i < s.length(); i++)
  165. {
  166. //Если недешифруемый символ
  167. if (((int)(s[i]) < 65) || ((int)(s[i]) > 122))
  168. result += s[i];
  169. else
  170. {
  171. //Поиск в первом столбце строки, начинающейся с символа ключа
  172. int l = 0;
  173. flag = false;
  174. //Пока не найден символ
  175. while ((l < 26) && (flag == false))
  176. {
  177. //Если символ найден
  178. if (key_v[i] == tabv[l][0])
  179. {
  180. //Запоминаем в х номер строки
  181. x = l;
  182. flag = true;
  183. }
  184. l++;
  185. }
  186. //Уменьшаем временно регистр прописной буквы
  187. if (((int)(s[i]) <= 90) && ((int)(s[i]) >= 65))
  188. {
  189. cop = (char)((int)(s[i]) + 32);
  190. reg = 1;
  191. }
  192. else
  193. {
  194. reg = 0;
  195. cop = s[i];
  196. }
  197. l = 0;
  198. flag = false;
  199. //Пока не найден столбец в x строке с символом строки
  200. while ((l < 26) && (flag == false))
  201. {
  202. if (cop == tabv[x][l])
  203. {
  204. //Запоминаем номер столбца
  205. y = l;
  206. flag = true;
  207. }
  208. l++;
  209. }
  210. //Увеличиваем регистр буквы до прописной
  211. if (reg == 1)
  212. {
  213. //Изменяем символ на первоначальный регистр
  214. cop = char((int)(tabv[0][y]) - 32);
  215. result += cop;
  216. }
  217. else
  218. result += tabv[0][y];
  219. }
  220.  
  221. //Формирование строки, длиной дешифруемой, состоящей из повторений ключа
  222. for (int i = 0; i < s.length(); i++)
  223. {
  224. key_g += keyG[i % keyG.length()];
  225. }
  226. for (int i = 0; i < keyG.length(); i++)
  227. key_g[i] = keyG[i+1];
  228. for (int i = 0; i < s.length(); i++)
  229. s1[i+1] = (s1[i+1]-key_g[i%keyG.length()])%255;
  230.  
  231. }
  232.  
  233. cout<<"Result Vizener:"<<endl;
  234. cout<<result; //Вывод результата
  235. ofstream out2("Result_Vizhener.txt");
  236. out2<<result;
  237. out2.close();
  238. cout<<"Result Gamma:"<<endl;;
  239. cout<<s1;
  240. ofstream out3("Result_Gamma.txt");
  241. out3<<s1;
  242. out3.close();
  243. break;
  244. }
  245. default: //Если ошибочное значение
  246. {
  247. cout<<"ERROR!!!";
  248. break;
  249. }
  250. }
  251. getch();
  252. return 0;
  253. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement