Advertisement
Pi0trek

base64 kodowanie

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