Pi0trek

base64.RC

Apr 24th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <cstddef>
  7. #include <bitset>
  8. #include <sstream>
  9. #include <bitset>  
  10.  
  11. using namespace std;
  12.  
  13. void decrypt(string plik_do_rozkodowania);
  14. int bace64Encrypt(string plik_do_zakodowania, string plik_zakodowany);
  15. int odszukaj_w_tablicy(char c);
  16. char *toBase64(char *c, int flaga);
  17. char *rozkoduj(char *tmp, int flaga);
  18.  
  19. const static char encodeLookup[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // tablca kodu
  20.  
  21. int bace64Encrypt(string plik_do_zakodowania, string plik_zakodowany)
  22. {
  23.     /////////////////////////////////otwierani pliku do zakodawania//////////////////////////////////////////////////////////
  24.  
  25.     ifstream plik;
  26.     size_t rozmiar = 0;
  27.     plik.open(plik_do_zakodowania, std::ios::binary | ios::in);
  28.     if (plik.good() == true)
  29.     {
  30.         cout << "plik otwarty prawidlowo" << endl;
  31.     }
  32.     else
  33.     {
  34.         cout << "nie udalo sie ";
  35.         return 1;
  36.     }
  37.  
  38.     plik.seekg(0, ios::end);
  39.     rozmiar = plik.tellg();
  40.     cout << "długosć pliku " << rozmiar << endl;
  41.     plik.seekg(0, ios::beg);
  42.  
  43.     /////////////////////////////////////tworzenie pliku do zapisu kodu/////////////////////////////////////////////////////////
  44.  
  45.     fstream zapis;
  46.     string nazwa_pliku_ = plik_zakodowany.append(".txt"); // tworzy plik o podanej nazwie przez urzytkownika
  47.     zapis.open(nazwa_pliku_, ios::out);
  48.     //--------------------------------------------------------------------------------------------------------------------------
  49.     char c[3];
  50.     char *tempo;
  51.     size_t licznik = 0;
  52.     //--------------------------------------------------------------------------------------------------------------------------
  53.     while (licznik + 3 <= rozmiar && plik.read(c, 3))// wczytanie pliku po 3 bajty oraz sprawdzenie długośći tak aby zatrzymać się na baj przed końcem
  54.     {
  55.         licznik += 3;
  56.         tempo = toBase64(c, 0);// wywołanie funkcji kodującje, podanie 3 bajtów oraz flagi ile 6bitowych znaków musi zostać dopisane
  57.         for (int i = 0; i < 4; i++)
  58.         {
  59.             zapis << tempo[i];
  60.         }
  61.     }
  62.  
  63.     //--------------------------------------------------------------------------------------------------------------------------
  64.     if (rozmiar - licznik == 0) //sprawdzenie czy należy uzupełnić plik bajtam aby były wielokrotnością 3
  65.     {
  66.         return 0;
  67.     }
  68.  
  69.     //--------------------------------------------------------------------------------------------------------------------------
  70.     else if (rozmiar - licznik == 1)//== // sprawdzanie ile bajtów pozostało nam do wczytania gdy wielkość pliku nie jest wielokrotnością 3 ( jeżeli 1 to mamy 2 puste bajy które musimy dopisać aby wielkość paczki danych wynosiła 3 bajty i zapamiętać informację że dopisalićmy 2. oznaczamy to 2 znakami ==)
  71.     {
  72.         plik.read((c + 0), 1); // wczytujemy ten jedn bajt który nam pozostał do wczytania
  73.         c[1] = 0; // nie możemy odrazu dopisać po rosu znaku = ponieważ bo przy podziale do ostatniego 6bitowego znaku musimy dopisać 2 zera.
  74.         c[2] = 0;//uzupełnienie zerami
  75.         tempo = toBase64(c, 2); // wywołujemy funkcję do kodowani i podajemy jej flagę ile znaków ==  ma dopisa na końcu
  76.         for (int i = 0; i < 4; i++)
  77.         {
  78.             zapis << tempo[i];
  79.         }
  80.     }
  81.  
  82.     //--------------------------------------------------------------------------------------------------------------------------
  83.     else if (rozmiar - licznik == 2)//= // sprawdzanie ile bajtów pozostało nam do wczytania gdy wielkość pliku nie jest wielokrotnością 3 ( jeżeli 2 to mamy 1 pusty bajt który musimy dopisać aby wielkość paczki danych wynosiła 3 bajty i zapamiętać informację że dopisalićmy 1. oznaczamy to 1 znakami =)
  84.     {
  85.         plik.read((c + 0), 1);// wczytujemy to co pozostało do wczytania
  86.         plik.read((c + 1), 1);
  87.         c[2] = 0;
  88.         tempo = toBase64(c, 1);
  89.         for (int i = 0; i < 4; i++)
  90.         {
  91.             zapis << tempo[i];
  92.         }
  93.     }
  94.     plik.close();
  95.     zapis.close();
  96.     delete tempo;
  97.     return 0;
  98. }
  99.  
  100. //////////////////////////////////funkcja kodująca /////////////////////////////////////////////////////////////////////////
  101.  
  102. char *toBase64(char *c, int flaga)
  103. {
  104.     int licznik = 0;
  105.     bool bufor[24];
  106.     for (int z = 0; z < 3; z++)
  107.     {
  108.         for (int i = 7; i >= 0; i--, licznik++)
  109.         {
  110.             bufor[licznik] = ((c[z] >> i) & 1); // konwersja z wczytanej tablicy bajtów na tablicę bitów
  111.         }
  112.     }
  113.  
  114.     licznik = 0;
  115.     unsigned int przed_zakodowaniem[4]; // utworzenie z 3 bajtów 4sześcio bitowych znaków
  116.     for (int z = 0; z < 24; z += 6) // pętla interpretująca 6bitów jako liczbę int
  117.     {
  118.         przed_zakodowaniem[licznik] = (((bufor[z + 0]) ? 1 : 0) * pow(2, 5)) +//
  119.             (((bufor[z + 1]) ? 1 : 0) * pow(2, 4)) +//
  120.             (((bufor[z + 2]) ? 1 : 0) * pow(2, 3)) +//  konwersj bulowskoej tablicy na inta
  121.             (((bufor[z + 3]) ? 1 : 0) * pow(2, 2)) +//
  122.             (((bufor[z + 4]) ? 1 : 0) * pow(2, 1)) +//
  123.             (((bufor[z + 5]) ? 1 : 0) * pow(2, 0)); //
  124.         licznik++;
  125.     }
  126.  
  127.     //------------dla 0-----------------------------------------------------------------------------------------------------------------------
  128.     char *kod = new char[4]; // kodowanie korzystając z wcześniej zdefiniowanej tablicy poprostu podstawinie wcześniej wyliczonej wartości jako element  tablicy
  129.     if (flaga == 0)// sprawdzenie czy musimy dopisać =
  130.     {
  131.         for (int i = 0; i < 4; i++)
  132.         {
  133.             *(kod + i) = encodeLookup[przed_zakodowaniem[i]];
  134.         }
  135.         //cout << kod[0] << kod[1] << kod[2] << kod[3] << endl;
  136.     }
  137.  
  138.     //------------dla 1(=)-----------------------------------------------------------------------------------------------------------------------
  139.     else if (flaga == 1)
  140.     {
  141.         for (int i = 0; i < 3; i++)
  142.         {
  143.             *(kod + i) = encodeLookup[przed_zakodowaniem[i]];
  144.         }
  145.         kod[3] = '=';// dopisanie = jeżeli funkcja została wywołana z taką flagą          
  146.     }
  147.  
  148.     //------------dla 2(==)-----------------------------------------------------------------------------------------------------------------------
  149.     else if (flaga == 2)
  150.     {
  151.         for (int i = 0; i < 2; i++)
  152.         {
  153.             *(kod + i) = encodeLookup[przed_zakodowaniem[i]];
  154.         }
  155.         kod[2] = '=';
  156.         kod[3] = '=';
  157.     }
  158.  
  159.     return kod;
  160. }
  161.  
  162. ///////////////////////////////////funkcja rozkodowywująca//////////////////////////////////////////////////////////////
  163.  
  164. void decrypt(string plik_do_rozkodowania)
  165. {
  166.     ifstream plik;
  167.     size_t rozmiar = 0;
  168.     plik.open(plik_do_rozkodowania, ios::in);
  169.     if (plik.good() == true)
  170.     {
  171.         cout << "plik otwarty prawidlowo" << endl;
  172.     }
  173.     else
  174.     {
  175.         cout << "nie udalo sie ";
  176.         return;
  177.     }
  178.  
  179.     plik.seekg(0, ios::end);
  180.     rozmiar = plik.tellg();
  181.     cout << "długosć pliku " << rozmiar << endl;
  182.     plik.seekg(0, ios::beg);
  183.  
  184.     //--------------------------------------------------------------------------------------------------------------------------
  185.     ofstream fout;
  186.     fout.open("file.bin", ios::binary | ios::out);
  187.  
  188.     //--------------------------------------------------------------------------------------------------------------------------
  189.     char *c = new char;
  190.     char *tmp = new char[4];
  191.     char *odkodowane = new char[3];
  192.     int licznik = 0;
  193.     int pomoc = 0;
  194.  
  195.     //--------------------------------------------------------------------------------------------------------------------------
  196.     while (licznik + 4 <= rozmiar)
  197.     {
  198.         for (int i = 0; i < 4; i++)
  199.         {
  200.             plik.read(c, 1);
  201.             if (*c != '=')
  202.             {
  203.                 tmp[i] = *c;
  204.                 licznik++;
  205.             }
  206.             else
  207.             {
  208.                 if (i == 2)// == czyli mam 2 znaki odkodowany będzie 1
  209.                 {
  210.                     odkodowane = rozkoduj(tmp, 1);
  211.                     char test1[3];
  212.                     test1[0] = odkodowane[0];
  213.                     fout << test1[0];
  214.                     pomoc = 1;
  215.                     break;
  216.  
  217.                 }
  218.                 else if (i == 3)// = czyli mam 3 znaki zwrot 2 znaki
  219.                 {
  220.                     odkodowane = rozkoduj(tmp, 2);
  221.                     char test1[3];
  222.                     test1[0] = odkodowane[0];
  223.                     test1[1] = odkodowane[1];
  224.  
  225.                     fout << test1[0];
  226.                     fout << test1[1];
  227.                     pomoc = 1;
  228.                     break;
  229.                 }
  230.             }
  231.         }
  232.  
  233.         if (pomoc == 1)break;
  234.  
  235.         odkodowane = rozkoduj(tmp, 0);
  236.         char test1[3];
  237.         test1[0] = odkodowane[0];
  238.         test1[1] = odkodowane[1];
  239.         test1[2] = odkodowane[2];
  240.  
  241.         for (int i = 0; i < 3; i++)
  242.         {
  243.             fout << test1[i];
  244.         }
  245.  
  246.     }
  247.     delete c, tmp, odkodowane;
  248.     plik.close();
  249. }
  250.  
  251. //--------------------------------------------narzędzie funkcji rozkodowywujący ------------------------------------------------------------------------------
  252. char *rozkoduj(char *tmp_, int flaga)
  253. {
  254.     char *temp = tmp_;
  255.     int licznik = 0;
  256.     bool bufor[24];
  257.     int tablicaint[4];
  258.  
  259. //------------------------------------------flaga 0-------------------------------------------------------------------------
  260.     if (flaga == 0)
  261.     {
  262.         for (int i = 0; i < 4; i++)
  263.         {
  264.             tablicaint[i] = odszukaj_w_tablicy(temp[i]);
  265.         }
  266.  
  267.         for (int z = 0; z < 4; z++)
  268.         {
  269.             for (int i = 5; i >= 0; i--, licznik++) // 7//0
  270.             {
  271.                 bufor[licznik] = ((tablicaint[z] >> i) & 1); // konwersja z wczytanej tablicy bajtów na tablicę bitów
  272.             }
  273.         }
  274. //--------------------------------------------------------------------------------------------------------------------------
  275.         licznik = 0;
  276.         char rozkodowany[3]; // utworzenie z 3 bajtów
  277.         for (int z = 0; z < 24; z += 8) // pętla interpretująca 8bitów jako liczbę int
  278.         {
  279.             rozkodowany[licznik] =
  280.                 (((bufor[z + 0]) ? 1 : 0) * pow(2, 7)) +//
  281.                 (((bufor[z + 1]) ? 1 : 0) * pow(2, 6)) +//
  282.                 (((bufor[z + 2]) ? 1 : 0) * pow(2, 5)) +//  konwersj bulowskoej tablicy na inta
  283.                 (((bufor[z + 3]) ? 1 : 0) * pow(2, 4)) +//
  284.                 (((bufor[z + 4]) ? 1 : 0) * pow(2, 3)) +//
  285.                 (((bufor[z + 5]) ? 1 : 0) * pow(2, 2)) +
  286.                 (((bufor[z + 6]) ? 1 : 0) * pow(2, 1)) +
  287.                 (((bufor[z + 7]) ? 1 : 0) * pow(2, 0));
  288.             licznik++;
  289.         }
  290.  
  291.         return rozkodowany;
  292.     }
  293.  
  294. //----------------------------------------------flaga1----------------------------------------------------------------------
  295.     if (flaga == 1)
  296.     {
  297.         for (int i = 0; i < 2; i++)
  298.         {
  299.             tablicaint[i] = odszukaj_w_tablicy(temp[i]);
  300.         }
  301.  
  302.         for (int z = 0; z < 2; z++)
  303.         {
  304.             for (int i = 5; i >= 0; i--, licznik++) // 7//0
  305.             {
  306.                 bufor[licznik] = ((tablicaint[z] >> i) & 1); // konwersja z wczytanej tablicy bajtów na tablicę bitów
  307.             }
  308.         }
  309. //--------------------------------------------------------------------------------------------------------------------------
  310.         licznik = 0;
  311.         char rozkodowany[3]; // utworzenie z 3 bajtów
  312.         for (int z = 0; z < 8; z += 8) // pętla interpretująca 8bitów jako liczbę int
  313.         {
  314.             rozkodowany[licznik] =
  315.                 (((bufor[z + 0]) ? 1 : 0) * pow(2, 7)) +//
  316.                 (((bufor[z + 1]) ? 1 : 0) * pow(2, 6)) +//
  317.                 (((bufor[z + 2]) ? 1 : 0) * pow(2, 5)) +//  konwersj bulowskoej tablicy na inta
  318.                 (((bufor[z + 3]) ? 1 : 0) * pow(2, 4)) +//
  319.                 (((bufor[z + 4]) ? 1 : 0) * pow(2, 3)) +//
  320.                 (((bufor[z + 5]) ? 1 : 0) * pow(2, 2)) +
  321.                 (((bufor[z + 6]) ? 1 : 0) * pow(2, 1)) +
  322.                 (((bufor[z + 7]) ? 1 : 0) * pow(2, 0));
  323.             licznik++;
  324.         }
  325.  
  326.         return rozkodowany;
  327.     }
  328.  
  329. //----------------------------------------------flaga2----------------------------------------------------------------------
  330.     if (flaga == 2)
  331.     {
  332.         for (int i = 0; i < 3; i++)
  333.         {
  334.             tablicaint[i] = odszukaj_w_tablicy(temp[i]);
  335.         }
  336.  
  337.         for (int z = 0; z < 3; z++)
  338.         {
  339.             for (int i = 5; i >= 0; i--, licznik++) // 7//0
  340.             {
  341.                 bufor[licznik] = ((tablicaint[z] >> i) & 1); // konwersja z wczytanej tablicy bajtów na tablicę bitów
  342.             }
  343.         }
  344. //--------------------------------------------------------------------------------------------------------------------------
  345.         licznik = 0;
  346.         char rozkodowany[3]; // utworzenie z 3 bajtów
  347.         for (int z = 0; z < 9; z += 8) // pętla interpretująca 8bitów jako liczbę int wykona się 2 razy
  348.         {
  349.             rozkodowany[licznik] =
  350.                 (((bufor[z + 0]) ? 1 : 0) * pow(2, 7)) +//
  351.                 (((bufor[z + 1]) ? 1 : 0) * pow(2, 6)) +//
  352.                 (((bufor[z + 2]) ? 1 : 0) * pow(2, 5)) +//  konwersj bulowskoej tablicy na inta
  353.                 (((bufor[z + 3]) ? 1 : 0) * pow(2, 4)) +//
  354.                 (((bufor[z + 4]) ? 1 : 0) * pow(2, 3)) +//
  355.                 (((bufor[z + 5]) ? 1 : 0) * pow(2, 2)) +
  356.                 (((bufor[z + 6]) ? 1 : 0) * pow(2, 1)) +
  357.                 (((bufor[z + 7]) ? 1 : 0) * pow(2, 0));
  358.             licznik++;
  359.         }
  360.         return rozkodowany;
  361.     }
  362. }
  363.  
  364. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  365.  
  366. int odszukaj_w_tablicy(char c)
  367. {
  368.     for (int i = 0; i<63; i++)
  369.     {
  370.         if (encodeLookup[i] == c)
  371.         {
  372.             return i;
  373.         }
  374.     }
  375. }
  376.  
  377. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  378.  
  379. int main(void)
  380. {
  381.     //bace64Encrypt("1.jpg", "base64");
  382.     decrypt("base64.txt");
  383.  
  384.     getchar();
  385. }
Add Comment
Please, Sign In to add comment