fork download
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string>
  5. using namespace std;
  6.  
  7. // Tu bedziemy trzymali tablice mozliwch szyfrowan dla liter od A do Z.
  8. // Poczatkowy element kazdej z takich tablic to dlugosc reszty tej tablicy.
  9. // Zakladamy ponadto, ze nie bedziemy mieli wiecej niz 5 mozliwych szyfrowan danej litery.
  10. // Rezerwujemy 0 na znaki inne niz A-Z, ktore w deszyfracji zamienimy na spacje.
  11. unsigned szyfr[26][6] =
  12. {{2, 1, 2},
  13. {2, 3, 4},
  14. {4, 5, 6, 7, 8},
  15. {3, 9, 10, 11},
  16. {2, 12, 13},
  17. {2, 14, 15},
  18. {2, 16, 17},
  19. {2, 18, 19},
  20. {2, 20, 21},
  21. {2, 22, 23},
  22. {2, 24, 25},
  23. {2, 26, 27},
  24. {2, 28, 29},
  25. {2, 30, 31},
  26. {2, 32, 33},
  27. {2, 34, 35},
  28. {2, 36, 37},
  29. {2, 38, 39},
  30. {2, 40, 41},
  31. {2, 42, 43},
  32. {2, 44, 45},
  33. {2, 46, 47},
  34. {2, 48, 49},
  35. {2, 50, 51},
  36. {2, 52, 53},
  37. {2, 54, 55}
  38. };
  39.  
  40. unsigned wybierz_losowy_element(unsigned *mozliwe_szyfrowania) {
  41. unsigned dlugosc = mozliwe_szyfrowania[0];
  42. return mozliwe_szyfrowania[rand() * dlugosc + 1]; // +1 bo pierwszy element tablicy okresla liczbe pozostalych,
  43. // wiec nie jest brany pod uwage w losowaniu
  44. }
  45.  
  46. unsigned szyfruj(char x) {
  47. return wybierz_losowy_element(szyfr[x - 'A']);
  48. }
  49.  
  50. void szyfruj(string s, unsigned* wyjscie) {
  51. for(int i = 0; i < s.length(); ++i){
  52. if(s[i] >= 'A' && s[i] <= 'Z') wyjscie[i] = szyfruj(s[i]); else s[i] = 0;
  53. }
  54. }
  55.  
  56. char odszyfruj(unsigned x) {
  57. if(x == 0) return ' ';
  58. for(int i = 0; i < 26; ++i){
  59. for(int j = 1; j < szyfr[i][0]; ++j){
  60. if(x == szyfr[i][j]) return j + 'A';
  61. }
  62. }
  63. }
  64.  
  65. string odszyfruj(unsigned *zaszyfrowany, unsigned dlugosc){
  66. string s;
  67. for(int i = 0; i < dlugosc; ++i){
  68. s.push_back(odszyfruj(zaszyfrowany[i]));
  69. }
  70. return s;
  71. }
  72.  
  73. void wypisz(unsigned *zaszyfrowany, unsigned dlugosc){
  74. cout << "Zaszyfrowany tekst to\n";
  75. for(int i = 0; i < dlugosc; ++i) cout << zaszyfrowany[i] << " ";
  76. cout << endl;
  77. }
  78.  
  79. int main() {
  80. srand(time(NULL));
  81. cout << "Wprowadz tekst do zaszyfrowania (inne znaki niz wielkie litery beda w deszyfracj zamienione na spacje)";
  82. string jawny;
  83. getline(cin, jawny);
  84. unsigned dlugosc = jawny.length();
  85. unsigned *wyjscie = new unsigned[dlugosc];
  86. szyfruj(jawny, wyjscie);
  87. wypisz(wyjscie, dlugosc);
  88. string odszyfrowany = odszyfruj(wyjscie, dlugosc);
  89. cout << "Po odszyfrowaniu\n" << odszyfrowany;
  90. }
Runtime error #stdin #stdout 0s 4188KB
stdin
DUPA
stdout
Wprowadz tekst do zaszyfrowania (inne znaki niz wielkie litery beda w deszyfracj zamienione na spacje)