aircampro

file / message encrryption and decrypt

Dec 15th, 2022 (edited)
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.70 KB | Software | 0 0
  1. // ----------------------------------------------------------------------------------------------------------------------------
  2. //
  3. // compiles as :- gcc -O2 -o file_crypt file_crypt.cpp -lcrypto -Wall -lstdc++ on ubuntu with gcc v8.0
  4. // usage to encrypt :- ./file_crypt input_file_name.txt --> outputs to crypted_msg.txt
  5. //          decrypt :- ./file_crypt crypted_msg.txt
  6. //
  7. // ----------------------------------------------------------------------------------------------------------------------------
  8.  
  9. #include <iostream>
  10. #include <string>
  11. #include <cstdlib>  
  12. #include <time.h>
  13. #include <locale>
  14. //#include <Windows.h>
  15. #include <fstream>
  16. #include <cstring>
  17. #include <iostream>
  18. #include <cctype>
  19.  
  20. using namespace std;
  21.  
  22. char* g_alphabetENG = new char[26]{ 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
  23.    
  24. char* input(char*& path, int& raw_length, int& msg_length) {
  25.     int length = 0;
  26.     ifstream is;
  27.     is.open(path, ios::binary);
  28.     is.seekg(0, ios::end);
  29.     length = is.tellg();
  30.     char* buffer = new char[length];
  31.     is.seekg(0, ios::beg);
  32.     is.read(buffer, length);
  33.     is.close();
  34.     int j = 0;
  35.     for (int i = 0; i < length; ++i) {
  36.         ++j;
  37.         if ((int)buffer[i] != 32 && (int)buffer[i] != 10 && (int)buffer[i] != 13)
  38.             msg_length++;
  39.         if (isupper(buffer[i])) {
  40.             buffer[i] = tolower(buffer[i]);
  41.         }
  42.     }
  43.     raw_length = length;
  44.     return buffer;
  45. }
  46.  
  47. void output(char* buffer, const int& raw_length) {
  48.     ofstream out;
  49.     out.open("crypted_msg.txt", ios::binary);
  50.     out.write(buffer, raw_length);
  51.     out.close();
  52. }
  53.  
  54. // caesar 's cipher
  55. void caesar(const int& change_Caesar, char*& encrypt, char*& alphabet, const int& len, const int& lenalp) {
  56.     char help;
  57.     for (int i = 0; i < len; ++i) {
  58.         for (int j = 0; j < lenalp; ++j) {
  59.             if (encrypt[i] == alphabet[j]) {
  60.                 if (j + change_Caesar >= lenalp)
  61.                     help = alphabet[change_Caesar + j - lenalp];
  62.                 else
  63.                     help = alphabet[j + change_Caesar];
  64.                 encrypt[i] = help;
  65.                 cout << help;
  66.                 break;
  67.             }
  68.         }
  69.     }
  70.     cout << " - " << "Encrypted with caesars cypher" << endl;
  71. }
  72.  
  73. // atbash cipher
  74. void atbash(char*& encrypt, char*& alphabet, const int& len, const int& lenalp) {
  75.     char help;
  76.     for (int i = 0; i < len; ++i) {
  77.         for (int j = 0; j < lenalp; ++j) {
  78.             if (encrypt[i] == alphabet[j]) {
  79.                 help = alphabet[lenalp - j - 1];
  80.                 encrypt[i] = help;
  81.                 cout << help;
  82.                 break;
  83.             }
  84.         }
  85.     }
  86.     cout << " - " << "Encrypted with the atbash cipher" << endl;
  87. }
  88.  
  89. // weiners cipher
  90. void weiner(char*& encrypt, char*& alphabet, const int& len, const string& key, const int& lenalp) {
  91.     int* change = new int[len];
  92.     int lenkey = key.length();
  93.     char help;
  94.     int help2;
  95.     for (int i = 0, k = 0; i < len; ++i) {
  96.         if (k + 1 != lenkey) {
  97.             help = key[k];
  98.             k++;
  99.         }
  100.         else {
  101.             help = key[k];
  102.             k = 0;
  103.         }
  104.         for (int j = 0; j < lenalp; ++j) {
  105.             if (help == alphabet[j]) {
  106.                 help2 = j + 1;
  107.                 change[i] = help2;
  108.             }
  109.         }
  110.     }
  111.     for (int i = 0; i < len; ++i) {
  112.         help2 = change[i];
  113.         for (int j = 0; j < lenalp; ++j) {
  114.             if (encrypt[i] == alphabet[j]) {
  115.                 if (j + help2 >= lenalp)
  116.                     help = alphabet[help2 + j - lenalp];
  117.                 else
  118.                     help = alphabet[j + help2];
  119.                 encrypt[i] = help;
  120.                 cout << help;
  121.                 break;
  122.             }
  123.         }
  124.     }
  125.     delete[] change;
  126.     cout << " - " << "Encrypted with the weiner cypher" << endl;
  127. }
  128.  
  129. // reverse order cipher
  130. void reverse(char*& encrypt, const int& len) {
  131.     for (int i = 0; i < len / 2; ++i) {
  132.         char rev = encrypt[i];
  133.         encrypt[i] = encrypt[len - i - 1];
  134.         encrypt[len - i - 1] = rev;
  135.     }
  136.     for (int i = 0; i < len; ++i)
  137.         cout << encrypt[i];
  138.     cout << " - " << "Encrypted with a reverse-order cipher" << endl;
  139. }
  140.  
  141. // cipher a1z26
  142. void a1z26(char*& encrypt, char*& alphabet, const int& len, const int& lenalp, char*& fbuffer, const int& fbuffer_size, char*& sm_buffer, const int& change_Caesar) {
  143.     int sm_count = 0, b_count = 0;
  144.     for (int i = 0; i < (fbuffer_size - 5); ) {
  145.         if ((int)encrypt[b_count] == 32 || (int)encrypt[b_count] == 10 || (int)encrypt[b_count] == 13) {
  146.             fbuffer[i] = encrypt[b_count];
  147.             b_count++;
  148.             i++;
  149.         }
  150.         else {
  151.  
  152.             for (int j = 0; j < lenalp; ++j) {
  153.                 if (sm_buffer[sm_count] == alphabet[j]) {
  154.                     if ((j + 1) < 10) {
  155.                         fbuffer[i] = '0';
  156.                         fbuffer[i + 1] = (j + 1) + '0';
  157.                         fbuffer[i + 2] = '-';
  158.                     }
  159.                     else {
  160.                         fbuffer[i] = ((j + 1) / 10) + '0';
  161.                         fbuffer[i + 1] = ((j + 1) % 10) + '0';
  162.                         fbuffer[i + 2] = '-';
  163.                     }
  164.                     cout << fbuffer[i] << fbuffer[i + 1] << fbuffer[i+2];
  165.                     i += 3;
  166.                     break;
  167.                 }
  168.             }
  169.             b_count++;
  170.             sm_count++;
  171.         }
  172.     }
  173.     if (change_Caesar < 10) {
  174.         fbuffer[(fbuffer_size - 1) - 1] = '0';
  175.         fbuffer[(fbuffer_size - 1)] = change_Caesar + '0';
  176.     }
  177.     else {
  178.         fbuffer[(fbuffer_size - 1) - 1] = (change_Caesar / 10) + '0';
  179.         fbuffer[(fbuffer_size - 1)] = (change_Caesar % 10) + '0';
  180.     }
  181.     fbuffer[(fbuffer_size - 1) - 2] = '-';
  182.     if (alphabet[1] == 'b') {
  183.         fbuffer[(fbuffer_size - 1) - 3] = '2';
  184.         fbuffer[(fbuffer_size - 1) - 4] = '5';
  185.     }
  186.     else {
  187.         fbuffer[(fbuffer_size - 1) - 3] = '6';
  188.         fbuffer[(fbuffer_size - 1) - 4] = '6';
  189.     }
  190.  
  191.     cout << " - " << "Encrypted with a1z26" << endl << endl;
  192. }
  193.  
  194. // rot13 cipher
  195. void rot13CipherEncode( char*& cipherText, char*& message, size_t raw_length  )
  196. {
  197.    char c;
  198.    size_t i;
  199.      
  200.    for (i = 0; i < raw_length; i++)
  201.    {
  202.         c = cipherText[i];
  203.         if (c >= 'a' && c <= 'z')
  204.         {
  205.            c = c + 13;
  206.            if (c > 'z')
  207.            {
  208.               c = c - 26;
  209.            }
  210.         }
  211.         else if (c >= 'A' && c <= 'Z')
  212.         {
  213.             c = c + 13;
  214.             if (c > 'Z')
  215.             {
  216.                c = c - 26;
  217.             }
  218.         }
  219.         message[i] = c;
  220.     }
  221.     message[raw_length] = '\0';
  222.  
  223. }
  224.  
  225. // rot13 de-cipher
  226. void rot13CipherDecode( char*& cipherText, char*& message, size_t raw_length  )
  227. {
  228.    char c;
  229.    size_t i;
  230.      
  231.    for (i = 0; i < raw_length; i++)
  232.    {
  233.       c = message[i];
  234.       if (c >= 'a' && c <= 'z')
  235.       {
  236.         c -= 13;
  237.         if (c < 'a')
  238.         {
  239.             c += 26;
  240.         }
  241.       }
  242.       else if (c >= 'A' && c <= 'Z')
  243.       {
  244.         c -= 13;
  245.         if (c < 'A')
  246.         {
  247.             c += 26;
  248.         }
  249.       }
  250.       cipherText[i] = c;
  251.    }
  252. }
  253.  
  254. void DEreverse(char*& encrypt, const int& len) {
  255.     for (int i = 0; i < len / 2; ++i) {
  256.         char rev = encrypt[i];
  257.         encrypt[i] = encrypt[len - i - 1];
  258.         encrypt[len - i - 1] = rev;
  259.     }
  260.     for (int i = 0; i < len; ++i)
  261.         cout << encrypt[i];
  262.     cout << " - " << "Decrypted by a reverse - order cipher" << endl;
  263. }
  264.  
  265. void DEweiner(char*& crypt, char*& alphabet, const int& len, const string& key, const int& lenalp) {
  266.     int lenkey = key.length();
  267.     int* change = new int[len];
  268.     char help;
  269.     int help2;
  270.     for (int i = 0, k = 0; i < len; ++i) {
  271.         if (k + 1 != lenkey) {
  272.             help = key[k];
  273.             k++;
  274.         }
  275.         else {
  276.             help = (char)(key[k]);
  277.             k = 0;
  278.         }
  279.         for (int j = 0; j < lenalp; ++j) {
  280.             if (help == alphabet[j]) {
  281.                 help2 = j + 1;
  282.                 change[i] = help2;
  283.             }
  284.         }
  285.     }
  286.     for (int i = 0; i < len; ++i) {
  287.         help2 = change[i];
  288.         for (int j = 0; j < lenalp; ++j) {
  289.             if (crypt[i] == alphabet[j]) {
  290.                 if (j + (lenalp - help2) >= lenalp)
  291.                     help = alphabet[(lenalp - help2) + j - lenalp];
  292.                 else
  293.                     help = alphabet[j + (lenalp - help2)];
  294.                 crypt[i] = help;
  295.                 cout << help;
  296.                 break;
  297.             }
  298.         }
  299.     }
  300.     cout << " - " << "Deciphered by the weiner cipher" << endl;
  301.     delete[] change;
  302. }
  303.  
  304. // decipher using atbash
  305. void DEatbash(char*& crypt, char*& alphabet, const int& len, const int& lenalp) {
  306.     char help;
  307.     for (int i = 0; i < len; ++i) {
  308.         for (int j = 0; j < lenalp; ++j) {
  309.             if (crypt[i] == alphabet[j]) {
  310.                 help = alphabet[lenalp - j - 1];
  311.                 crypt[i] = help;
  312.                 cout << help;
  313.                 break;
  314.             }
  315.         }
  316.     }
  317.     cout << " - " << "Deciphered by the atbash cipher" << endl;
  318. }
  319.  
  320. // decipher using caesar
  321. void DEcaesar(const int& DEchange_Caesar, char*& crypt, char*& alphabet, int& len, const int& lenalp, char*& buffer, int& raw_length) {
  322.     char help;
  323.     for (int i = 0; i < len; ++i) {
  324.         for (int j = 0; j < lenalp; ++j) {
  325.             if (crypt[i] == alphabet[j]) {
  326.                 if (j + (lenalp - DEchange_Caesar) >= lenalp)
  327.                     help = alphabet[(lenalp - DEchange_Caesar) + j - lenalp];
  328.                 else
  329.                     help = alphabet[j + (lenalp - DEchange_Caesar)];
  330.                 cout << help;
  331.                 crypt[i] = help;
  332.                 break;
  333.             }
  334.         }
  335.     }
  336.     cout << " - " << "Deciphered by Caesar 's cipher" << endl << endl;
  337.     int sm_count = 0, b_count = 0;
  338.     len = ((raw_length - 5) - len * 3) + len;
  339.     char* fbuffer = new char[len];
  340.     for (int i = 0; i < raw_length - 5; ) {
  341.         if ((int)buffer[i] == 32 || (int)buffer[i] == 10 || (int)buffer[i] == 13) {
  342.             fbuffer[sm_count] = buffer[i];
  343.             sm_count++;
  344.             i++;
  345.         }
  346.         else {
  347.             fbuffer[sm_count] = crypt[b_count];
  348.             b_count++;
  349.             sm_count++;
  350.             i += 3;
  351.         }
  352.     }
  353.     crypt = fbuffer;
  354. }
  355.  
  356. int setting_up(char first_letter, char*& lang, int& change_Caesar, bool& crypt, int& lenalp, char*& buffer, char*& n_buffer, int& raw_length, int& msg_length) {
  357.     //SetConsoleCP(1251);
  358.     //SetConsoleOutputCP(1251);
  359.     //setlocale(LC_ALL, "Russian");
  360.     srand(time(NULL));
  361.  
  362.     if (int(first_letter) >= 97 && int(first_letter) <= 122) {
  363.         lang = g_alphabetENG;
  364.         crypt = true;
  365.         lenalp = 26;
  366.     }
  367.     else if (int(first_letter) >= 65 && int(first_letter) <= 90) {
  368.         lang = g_alphabetENG;
  369.         crypt = true;
  370.         lenalp = 26;
  371.     }
  372.     else if (first_letter - '0' >= 0 && first_letter - '0' < 10) {
  373.         crypt = false;
  374.         if (buffer[(raw_length - 1) - 3] == '2') {
  375.             lang = g_alphabetENG;
  376.             lenalp = 26;
  377.         }
  378.     }
  379.     else {
  380.         cout << "error, wrong text language or crypted msg";
  381.         system("pause");
  382.     }
  383.     if (crypt == true)
  384.         change_Caesar = rand() % 25 + 1;
  385.     else {
  386.         if (buffer[(raw_length - 1) - 1] == '0')
  387.             change_Caesar = buffer[(raw_length - 1)] - '0';
  388.         else
  389.             change_Caesar = ((buffer[(raw_length - 1) - 1] - '0') * 10) + (buffer[(raw_length - 1)] - '0');
  390.     }
  391.     int k = 0;
  392.     char* g_sm_buffer;
  393.     if (crypt == true) {
  394.         g_sm_buffer = new char[msg_length];
  395.         for (int i = 0; i < raw_length; ) {
  396.             if ((int)buffer[i] != 32 && (int)buffer[i] != 10 && (int)buffer[i] != 13) {
  397.                 g_sm_buffer[k] = buffer[i];
  398.                 ++k;
  399.                 ++i;
  400.             }
  401.             else
  402.                 i++;
  403.         }
  404.     }
  405.     else {
  406.         msg_length = (msg_length - 5) / 3;
  407.         g_sm_buffer = new char[msg_length];
  408.         for (int i = 0; i < (raw_length - 5); ) {
  409.             if ((int)buffer[i] != 32 && (int)buffer[i] != 10 && (int)buffer[i] != 13) {
  410.                 if (buffer[i] == '0') {
  411.                     g_sm_buffer[k] = lang[(buffer[i + 1] - '0') - 1];
  412.                     k++;
  413.                     i += 3;
  414.                 }
  415.                 else {
  416.                     g_sm_buffer[k] = lang[(((buffer[i] - '0') * 10) + (buffer[i + 1] - '0')) - 1];
  417.                     k++;
  418.                     i += 3;
  419.                 }
  420.             }
  421.             else
  422.                 i++;
  423.  
  424.         }
  425.     }
  426.     n_buffer = g_sm_buffer;
  427.     return 1;
  428. }
  429.  
  430. int main(int argc, char* argv[]) {
  431.    
  432.     int raw_length, change_Caesar, lenalp, msg_length = 0;
  433.     char* lang;
  434.     char* sm_buffer;
  435.     bool crypt = true;
  436.     char* buffer = input(argv[1], raw_length, msg_length);
  437.     sm_buffer = new char[msg_length];
  438.     try {
  439.         if (setting_up(buffer[0], lang, change_Caesar, crypt, lenalp, buffer, sm_buffer, raw_length, msg_length) == 0)
  440.             return 0;
  441.     } catch (...) {
  442.             cout << "error setting up" << endl;
  443.     }
  444.     string key;
  445.     char* fbuffer;
  446.     char* message;
  447.     int fbuffer_size;
  448.     cout << "Enter the cipher key: ";
  449.     getline(cin, key);
  450.     if (crypt == true) {
  451.         // encrypt the message and write it to the file
  452.         fbuffer_size = 3 * msg_length + (raw_length - msg_length) + 5;
  453.         fbuffer = new char[fbuffer_size];
  454.         caesar(change_Caesar, sm_buffer, lang, msg_length, lenalp);
  455.         atbash(sm_buffer, lang, msg_length, lenalp);
  456.         weiner(sm_buffer, lang, msg_length, key, lenalp);
  457.         reverse(sm_buffer, msg_length);
  458.         a1z26(buffer, lang, raw_length, lenalp, fbuffer, fbuffer_size, sm_buffer, change_Caesar);
  459.         output(fbuffer, fbuffer_size);
  460.         cout << "output is crypted_msg.txt" << endl;
  461.         // just example of how to call rot13
  462.         message = new char[msg_length];
  463.         rot13CipherEncode( sm_buffer, message, static_cast<size_t>(msg_length) );
  464.         cout << "with rot13 cipher (just printed here) " << message << " from the output of the reverse cipher " << sm_buffer << endl;
  465.        
  466.         delete[] fbuffer;
  467.         delete[] message;
  468.     }
  469.     else {
  470.         // decrypt the message and write it to the file
  471.         DEreverse(sm_buffer, msg_length);
  472.         DEweiner(sm_buffer, lang, msg_length, key, lenalp);
  473.         DEatbash(sm_buffer, lang, msg_length, lenalp);
  474.         DEcaesar(change_Caesar, sm_buffer, lang, msg_length, lenalp, buffer, raw_length);
  475.         output(sm_buffer, msg_length);
  476.     }
  477.     delete[] buffer;
  478.     delete[] sm_buffer;
  479.     delete[] lang;
  480.     return 0;
  481. }
Add Comment
Please, Sign In to add comment