dakodev

Untitled

Oct 25th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.68 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. void error() {
  7. printf("UNSUPPORTED_ALPHABET\n");
  8. exit(0);
  9. }
  10.  
  11. int mapci(char c) {
  12. switch(c) {
  13. case '0': return 0;
  14. case '1': return 1;
  15. case '2': return 2;
  16. case '3': return 3;
  17. case '4': return 4;
  18. case '5': return 5;
  19. case '6': return 6;
  20. case '7': return 7;
  21. case '8': return 8;
  22. case '9': return 9;
  23. case 'A': return 10;
  24. case 'B': return 11;
  25. case 'C': return 12;
  26. case 'D': return 13;
  27. case 'E': return 14;
  28. case 'F': return 15;
  29. case 'G': return 16;
  30. case 'H': return 17;
  31. case 'I': return 18;
  32. case 'J': return 19;
  33. case 'K': return 20;
  34. case 'L': return 21;
  35. case 'M': return 22;
  36. case 'N': return 23;
  37. case 'O': return 24;
  38. case 'P': return 25;
  39. case 'Q': return 26;
  40. case 'R': return 27;
  41. case 'S': return 28;
  42. case 'T': return 29;
  43. case 'U': return 30;
  44. case 'V': return 31;
  45. case 'W': return 32;
  46. case 'X': return 33;
  47. case 'Y': return 34;
  48. case 'Z': return 35;
  49. case 'a': return 36;
  50. case 'b': return 37;
  51. case 'c': return 38;
  52. case 'd': return 39;
  53. case 'e': return 40;
  54. case 'f': return 41;
  55. case 'g': return 42;
  56. case 'h': return 43;
  57. case 'i': return 44;
  58. case 'j': return 45;
  59. case 'k': return 46;
  60. case 'l': return 47;
  61. case 'm': return 48;
  62. case 'n': return 49;
  63. case 'o': return 50;
  64. case 'p': return 51;
  65. case 'q': return 52;
  66. case 'r': return 53;
  67. case 's': return 54;
  68. case 't': return 55;
  69. case 'u': return 56;
  70. case 'v': return 57;
  71. case 'w': return 58;
  72. case 'x': return 59;
  73. case 'y': return 60;
  74. case 'z': return 61;
  75. case ' ': return 62;
  76. case ',': return 63;
  77. }
  78. error();
  79. return 0;
  80. }
  81.  
  82. char mapic(int i) {
  83. switch (i) {
  84. case 0: return '0';
  85. case 1: return '1';
  86. case 2: return '2';
  87. case 3: return '3';
  88. case 4: return '4';
  89. case 5: return '5';
  90. case 6: return '6';
  91. case 7: return '7';
  92. case 8: return '8';
  93. case 9: return '9';
  94. case 10: return 'A';
  95. case 11: return 'B';
  96. case 12: return 'C';
  97. case 13: return 'D';
  98. case 14: return 'E';
  99. case 15: return 'F';
  100. case 16: return 'G';
  101. case 17: return 'H';
  102. case 18: return 'I';
  103. case 19: return 'J';
  104. case 20: return 'K';
  105. case 21: return 'L';
  106. case 22: return 'M';
  107. case 23: return 'N';
  108. case 24: return 'O';
  109. case 25: return 'P';
  110. case 26: return 'Q';
  111. case 27: return 'R';
  112. case 28: return 'S';
  113. case 29: return 'T';
  114. case 30: return 'U';
  115. case 31: return 'V';
  116. case 32: return 'W';
  117. case 33: return 'X';
  118. case 34: return 'Y';
  119. case 35: return 'Z';
  120. case 36: return 'a';
  121. case 37: return 'b';
  122. case 38: return 'c';
  123. case 39: return 'd';
  124. case 40: return 'e';
  125. case 41: return 'f';
  126. case 42: return 'g';
  127. case 43: return 'h';
  128. case 44: return 'i';
  129. case 45: return 'j';
  130. case 46: return 'k';
  131. case 47: return 'l';
  132. case 48: return 'm';
  133. case 49: return 'n';
  134. case 50: return 'o';
  135. case 51: return 'p';
  136. case 52: return 'q';
  137. case 53: return 'r';
  138. case 54: return 's';
  139. case 55: return 't';
  140. case 56: return 'u';
  141. case 57: return 'v';
  142. case 58: return 'w';
  143. case 59: return 'x';
  144. case 60: return 'y';
  145. case 61: return 'z';
  146. case 62: return ' ';
  147. case 63: return ',';
  148. }
  149. error();
  150. return 0;
  151. }
  152.  
  153. int main(void) {
  154. char what[256];
  155. scanf("%s", what);
  156.  
  157. int offsets[64], off;
  158. for (int i = 0; i < 64; i++) {
  159. scanf("%d", &off);
  160. offsets[i] = off;
  161. }
  162. getchar();
  163.  
  164. char key[256];
  165. char text[256];
  166. scanf("%[^\n]", key);
  167. getchar();
  168. scanf("%[^\n]", text);
  169.  
  170.  
  171. int keylength = strlen(key);
  172.  
  173. // Zmapuj klucz używając offsetów
  174. for (int i = 0; i < keylength; i++) {
  175. key[i] = mapic(offsets[mapci(key[i])]);
  176. }
  177.  
  178. // Dopełnij klucz cyklicznie do długości tekstu
  179. int textlength = strlen(text);
  180. int idx = keylength;
  181. while (idx < textlength) {
  182. key[idx] = key[idx % keylength];
  183. idx++;
  184. }
  185. key[idx] = 0;
  186. keylength = strlen(key);
  187.  
  188. // Wygeneruj cykliczny alfabet
  189. char alphabet[256];
  190. for (int i = 0; i < 256; i++) {
  191. alphabet[i] = i % 64;
  192. }
  193.  
  194. if (strcmp(what, "encrypt") == 0) {
  195. // Zaszyfruj wiadomość
  196. char cipher[256];
  197. for (int i = 0; i < textlength; i++) {
  198. cipher[i] = mapic(alphabet[mapci(key[i]) + mapci(text[i])]);
  199. }
  200.  
  201. printf("%s\n", cipher);
  202. } else {
  203. // Odszyfruj wiadomość
  204. // Odwróc klucz
  205. char revkey[256];
  206. for (int i = 0; i < keylength; i++) {
  207. revkey[i] = mapic((64 - mapci(key[i])) % 64);
  208. }
  209.  
  210. // Odszyfruj wiadomośc
  211. char deciphered[256];
  212. for (int i = 0; i < textlength; i++) {
  213. deciphered[i] = mapic(alphabet[mapci(revkey[i]) + mapci(text[i])]);
  214. }
  215.  
  216. printf("%s\n", deciphered);
  217. }
  218.  
  219.  
  220. return 0;
  221. }
Advertisement
Add Comment
Please, Sign In to add comment