Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Zdziwiony

[C++] Moje próby, stworzenie programu do szyfracji...

Rekomendowane odpowiedzi

Witam. Jako, że chciałem zrobić samemu sobie jakiś test ze znajomości C++ którego uczę się z 6msc, (ale baardzo nieregularnie), to postanowiłem sobie, że spróbuję zrobić program szyfrujący wiadomości tekstowe, na podstawie wiedzy, którą do tej pory zdobyłem... No cóż coś mi z tego wyszło, ale jest taki problem, że żeby rozgryźć "algorytm szyfrujący" mojego progra,u wystarczy wpisać w nim: abcd... itd, dzięki czemu można dowiedzieć się jakie ID ma poszczególny znak i po szyfrze...

 

Oto mój kod:

#include <iostream>
#include <windows.h>
#include <cstdio>
#include <conio.h>
#include <fstream>
using namespace std;
void szyfruj();
void deszyfruj();
void deszyfrujplik();
void szyfrujplik();
int main()
{

   cout << "Witaj w Programie szyfrujacym wiadomosci!\nCo chcesz zrobic? Wpisz jedna z komend:\n\nSzyfruj - encrypt\nOdszyfruj - decrypt\nPodaj lokalizacje pliku i go zaszyfruj - encryptfile\nPodaj lokalizacje pliku i go zdeszyfruj - decryptfile";
   SetConsoleTitleA( "Szyfruj v0.1" );
   do{
   string menu;
   cout << endl;
   getline( cin, menu ); //wpisz
   if (menu == "encrypt")
   {
      system("cls");
      szyfruj();
   }
   else if (menu == "decrypt")
   {
       system("cls");
       deszyfruj();
   }
   else if (menu == "decryptfile")
   {
       system("cls");
       cout << "nie okodzono";
       //deszyfrujplik();
   }
   else if (menu == "encryptfile")
   {
       system("cls");

       szyfrujplik();
   }

   else
   {
       cout << "Zla komenda!" <<endl;
   }



   }while (true);
}

void szyfruj()
{
   //odczyt znak po znaku
   string tekst;
   cout << "Podaj tekst do szyfracji (nie uzywaj polskich znakow!):\n";
   getline( cin, tekst ); //wpisz
   cout << "Oto szyfr:\n";
   //tworzenie pliku
   ofstream plik("temp.tmp");
   plik.close(); //zamknij
   Sleep(500);
   plik.open("temp.tmp", std::ios::in | std::ios::out); //otworz
   if (plik.good() == true)
   {
       plik << tekst;
       plik.close(); //zapsiano
   } else cout << "blad";
   ifstream plikodczyt ("temp.tmp", std::ios::in | std::ios::out); //otworz
   if (plikodczyt.good() == true)
   {
   plikodczyt.seekg( 0, ios::end ); //wskaznik na koncu pliku
   streampos koniecpliku = plikodczyt.tellg(); //odczyt pozycji
   long long koniec;
   koniec = koniecpliku;
   //cout << "pozycja: " << koniec << endl;

   long long pozycja;
   pozycja = 0;
   do{
   char znak;

       if (znak == ' ') //spacje
       {
           cout << " ";
       }
       if (znak == 'a')
       {
           cout << "c";
       }
       if (znak == 'b')
       {
           cout << "d";
       }
       if (znak == 'c')
       {
           cout << "e";
       }
       if (znak == 'd')
       {
           cout << "f";
       }
       if (znak == 'e')
       {
           cout << "g";
       }
       if (znak == 'f')
       {
           cout << "h";
       }
       if (znak == 'g')
       {
           cout << "i";
       }
       if (znak == 'h')
       {
           cout << "j";
       }
       if (znak == 'i')
       {
           cout << "k";
       }
       if (znak == 'j')
       {
           cout << "l";
       }
       if (znak == 'k')
       {
           cout << "m";
       }
       if (znak == 'l')
       {
           cout << "n";
       }
       if (znak == 'm')
       {
           cout << "o";
       }
       if (znak == 'n')
       {
           cout << "p";
       }
       if (znak == 'o')
       {
           cout << "r";
       }
       if (znak == 'p')
       {
           cout << "s";
       }
       if (znak == 'r')
       {
           cout << "t";
       }
       if (znak == 's')
       {
           cout << "u";
       }
       if (znak == 't')
       {
           cout << "w";
       }
       if (znak == 'u')
       {
           cout << "x";
       }
       if (znak == 'w')
       {
           cout << "y";
       }
       if (znak == 'x')
       {
           cout << "z";
       }
       if (znak == 'y')
       {
           cout << "a";
       }
       if (znak == 'z')
       {
           cout << "b";
       }


   plikodczyt.seekg( pozycja, ios::beg );
   plikodczyt >> std::noskipws >> znak;


  // cout << "pozycja w petli: " << pozycja << endl;
   ++pozycja;
   }while (pozycja <= koniec);
   plikodczyt.close(); //zamknac
   } else cout << "blad";

       cout << "\n\n\nCo chcesz zrobic? Wpisz jedna z komend:\nSzyfruj - encrypt\nOdszyfruj - decrypt";

}


void deszyfruj()
{
       //odczyt znak po znaku
   string tekst;

   cout << "Podaj tekst do deszyfracji (nie uzywaj polskich znakow!):";
   getline( cin , tekst ); //wpisz
   cout << "Oto zdeszyfrowana wiadomosc:\n";
   //tworzenie pliku
   ofstream plik("temp.tmp");
   plik.close(); //zamknij
   Sleep(500);
   plik.open("temp.tmp", std::ios::in | std::ios::out); //otworz
        if (plik.good() == true)
        {
          plik << tekst;
          plik.close(); //zapsiano
        } else cout << "blad";
   ifstream plikodczyt ("temp.tmp", std::ios::in | std::ios::out); //otworz
        if (plikodczyt.good() == true)
        {
          plikodczyt.seekg( 0, ios::end ); //wskaznik na koncu pliku
          streampos koniecpliku = plikodczyt.tellg(); //odczyt pozycji
          long long koniec;
          koniec = koniecpliku;
          long long pozycja;
          pozycja = 0;
               do{
                   char znak;


                   if (znak == ' ') //spacje
                   {
                   cout << " ";
                   }
                   if (znak == 'c')
                   {
                   cout << "a";
                   }
                   if (znak == 'd')
                   {
                   cout << "b";
                   }
                   if (znak == 'e')
                   {
                   cout << "c";
                   }
                   if (znak == 'f')
                   {
                   cout << "d";
                   }
                   if (znak == 'g')
                   {
                   cout << "e";
                   }
                   if (znak == 'h')
                   {
                   cout << "f";
                   }
                   if (znak == 'i')
                   {
                   cout << "g";
                   }
                   if (znak == 'j')
                   {
                   cout << "h";
                   }
                   if (znak == 'k')
                   {
                   cout << "i";
                   }
                   if (znak == 'l')
                   {
                   cout << "j";
                   }
                   if (znak == 'm')
                   {
                   cout << "k";
                   }
                   if (znak == 'n')
                   {
                   cout << "l";
                   }
                   if (znak == 'o')
                   {
                   cout << "m";
                   }
                   if (znak == 'p')
                   {
                   cout << "n";
                   }
                   if (znak == 'r')
                   {
                   cout << "o";
                   }
                   if (znak == 's')
                   {
                   cout << "p";
                   }
                   if (znak == 't')
                   {
                   cout << "r";
                   }
                   if (znak == 'u')
                   {
                   cout << "s";
                   }
                   if (znak == 'w')
                   {
                   cout << "t";
                   }
                   if (znak == 'x')
                   {
                   cout << "u";
                   }
                   if (znak == 'y')
                   {
                   cout << "w";
                   }
                   if (znak == 'z')
                   {
                   cout << "x";
                   }
                   if (znak == 'a')
                   {
                   cout << "y";
                   }
                   if (znak == 'b')
                   {
                   cout << "z";
                   }


                   plikodczyt.seekg( pozycja, ios::beg );
                   plikodczyt >> std::noskipws >> znak;
                   ++pozycja;
               }while (pozycja <= koniec);
                   plikodczyt.close(); //zamknac
           } else cout << "blad";
   cout << "\n\n\nCo chcesz zrobic? Wpisz jedna z komend:\nSzyfruj - encrypt\nOdszyfruj - decrypt";
}


void szyfrujplik()
{
     //odczyt znak po znaku
   string tekst, nazwa, dane, nazwa2;
   cout << "Podaj lokalizacje pliku do szyfracji!" << endl;
   getline( cin, nazwa ); //wpisz
   cout << "Podaj lokalizacje w ktorej mam zapisac zaszyfrowany plik!" << endl;
   getline( cin, nazwa2 ); //wpisz
   fstream plikdoodczytu (nazwa.c_str(), std::ios::in | std::ios::out);

       if( plikdoodczytu.good() == true )
       {
           while( !plikdoodczytu.eof() )
            {
            getline( plikdoodczytu, dane ); //odczyt pliku
            tekst +=( dane + '\n' );
            }
       }else cout << "Nie mozna otworzyc pliku!" << endl;
   ofstream plikzapisz (nazwa2.c_str());
   plikzapisz.close();
   plikzapisz.open (nazwa2.c_str(),  std::ios::in | std::ios::out);
   if( plikzapisz.good() == true )
   {

   //tworzenie pliku
   ofstream plik("temp.tmp");
   plik.close(); //zamknij
   Sleep(500);
   plik.open("temp.tmp", std::ios::in | std::ios::out); //otworz
   if (plik.good() == true)
   {
       plik << tekst;
       plik.close(); //zapsiano
   } else cout << "blad";
   ifstream plikodczyt ("temp.tmp", std::ios::in | std::ios::out); //otworz
   if (plikodczyt.good() == true)
   {
   plikodczyt.seekg( 0, ios::end ); //wskaznik na koncu pliku
   streampos koniecpliku = plikodczyt.tellg(); //odczyt pozycji
   long long koniec;
   koniec = koniecpliku;
   //cout << "pozycja: " << koniec << endl;

   long long pozycja;
   pozycja = 0;
   do{
   char znak;

       if (znak == ' ') //spacje
       {
           cout << " ";
           plikzapisz << " ";
       }
       if (znak == 'a')
       {
           cout << "c";
           plikzapisz << "c";
       }
       if (znak == 'b')
       {
           cout << "d";
           plikzapisz << "d";
       }
       if (znak == 'c')
       {
           cout << "e";
           plikzapisz << "e";
       }
       if (znak == 'd')
       {
           cout << "f";
           plikzapisz << "f";
       }
       if (znak == 'e')
       {
           cout << "g";
           plikzapisz << "g";
       }
       if (znak == 'f')
       {
           cout << "h";
           plikzapisz << "h";
       }
       if (znak == 'g')
       {
           cout << "i";
           plikzapisz <<  "i";
       }
       if (znak == 'h')
       {
           cout << "j";
           plikzapisz << "j";
       }
       if (znak == 'i')
       {
           cout << "k";
           plikzapisz << "k";
       }
       if (znak == 'j')
       {
           cout << "l";
           plikzapisz << "l";
       }
       if (znak == 'k')
       {
           cout << "m";
           plikzapisz << "m";
       }
       if (znak == 'l')
       {
           cout << "n";
           plikzapisz << "n";
       }
       if (znak == 'm')
       {
           cout << "o";
           plikzapisz << "o";
       }
       if (znak == 'n')
       {
           cout << "p";
           plikzapisz << "p";
       }
       if (znak == 'o')
       {
           cout << "r";
           plikzapisz << "r";
       }
       if (znak == 'p')
       {
           cout << "s";
           plikzapisz << "s";
       }
       if (znak == 'r')
       {
           cout << "t";
           plikzapisz << "t";
       }
       if (znak == 's')
       {
           cout << "u";
           plikzapisz << "u";
       }
       if (znak == 't')
       {
           cout << "w";
           plikzapisz << "w";
       }
       if (znak == 'u')
       {
           cout << "x";
           plikzapisz << "x";
       }
       if (znak == 'w')
       {
           cout << "x";
           plikzapisz << "x";
       }
       if (znak == 'x')
       {
           cout << "z";
           plikzapisz << "z";
       }
       if (znak == 'y')
       {
           cout << "a";
           plikzapisz << "a";
       }
       if (znak == 'z')
       {
           cout << "b";
           plikzapisz << "b";
       }


   plikodczyt.seekg( pozycja, ios::beg );
   plikodczyt >> std::noskipws >> znak;

  // cout << "pozycja w petli: " << pozycja << endl;
   ++pozycja;


   }while (pozycja <= koniec);
   plikodczyt.close(); //zamknac

   } else cout << "blad";
   cout << "\n\n\nCo chcesz zrobic? Wpisz jedna z komend:\nSzyfruj - encrypt\nOdszyfruj - decrypt";

   } else cout << "Nie mozna zapisac pliku!" << endl;
}

 

Program działa oczywiście tak jak napisałem wyżej, ale nasunęło mi się pewne rozwiązanie dzięki któremu program byłby bezpieczniejszy w szyfrowaniu, a mianowicie, miałoby to działać tak:

1.Podaj tekst!

2. "Ala ma kota"

3. Wybierz metodę szyfracji! (Wartość od 1-10000) // ta część kodu odpowiadałaby za coś takiego jak w poniższym kodzie:

#include <iostream>
#include <windows.h>
#include <cstdio>
#include <conio.h>
#include <fstream>
using namespace std;
void szyfruj();
void szyfruj2etap();
void deszyfruj();
void deszyfrujplik();
void szyfrujplik();
int main()
{

   cout << "Witaj w Programie szyfrujacym wiadomosci!\nCo chcesz zrobic? Wpisz jedna z komend:\n\nSzyfruj - encrypt\nOdszyfruj - decrypt\nPodaj lokalizacje pliku i go zaszyfruj - encryptfile\nPodaj lokalizacje pliku i go zdeszyfruj - decryptfile";
   SetConsoleTitleA( "Szyfruj v0.1" );
   do{
   string menu;
   cout << endl;
   getline( cin, menu ); //wpisz
   if (menu == "encrypt")
   {
      system("cls");
      szyfruj();
      szyfruj2etap();
   }
   else if (menu == "decrypt")
   {
       system("cls");
       //deszyfruj();
   }
   else if (menu == "decryptfile")
   {
       system("cls");
       cout << "nie okodzono";
       //deszyfrujplik();
   }
   else if (menu == "encryptfile")
   {
       system("cls");

      // szyfrujplik();
   }

   else
   {
       cout << "Zla komenda!" <<endl;
   }



   }while (true);
}





void szyfruj()
{
   //odczyt znak po znaku
   string tekst;
   cout << "Podaj tekst do szyfracji (nie uzywaj polskich znakow!):\n";
   getline( cin, tekst ); //wpisz
   cout << "Oto szyfr:\n";
   //tworzenie pliku
   ofstream plik("temp.tmp");
   ofstream plik2("temp2.tmp");
   plik.close(); //zamknij
   plik2.close(); //zamknij
   Sleep(500);
   plik.open("temp.tmp", std::ios::in | std::ios::out); //otworz
   plik2.open("temp2.tmp", std::ios::in | std::ios::out); //otworz
   if (plik.good() == true)
   {
       plik << tekst;
       plik.close(); //zapsiano
   } else cout << "blad";
   ifstream plikodczyt ("temp.tmp", std::ios::in | std::ios::out); //otworz
   if (plikodczyt.good() == true)
   {
   plikodczyt.seekg( 0, ios::end ); //wskaznik na koncu pliku
   streampos koniecpliku = plikodczyt.tellg(); //odczyt pozycji
   long long koniec;
   koniec = koniecpliku;
   //cout << "pozycja: " << koniec << endl;

   long long pozycja;
   pozycja = 0;
   plikodczyt.seekg( 0, ios::beg ); //pocztatek pliku;
   do{
   char znak;
       if (znak == ' ') //spacje
       {
           cout << " ";
           plik2 << " ";
       }
       if (znak == 'a')
       {
           cout << "c";
           plik2 << "c";
       }
       if (znak == 'b')
       {
           cout << "d";
           plik2 << "d";
       }
       if (znak == 'c')
       {
           cout << "e";
           plik2 << "e";
       }
       if (znak == 'd')
       {
           cout << "f";
           plik2 << "f";
       }
       if (znak == 'e')
       {
           cout << "g";
           plik2 << "g";
       }
       if (znak == 'f')
       {
           cout << "h";
           plik2 << "h";
       }
       if (znak == 'g')
       {
           cout << "i";
           plik2 << "i";
       }
       if (znak == 'h')
       {
           cout << "j";
           plik2 << "j";
       }
       if (znak == 'i')
       {
           cout << "k";
           plik2 << "k";
       }
       if (znak == 'j')
       {
           cout << "l";
           plik2 << "l";
       }
       if (znak == 'k')
       {
           cout << "m";
           plik2 << "m";
       }
       if (znak == 'l')
       {
           cout << "n";
           plik2 << "n";
       }
       if (znak == 'm')
       {
           cout << "o";
           plik2 << "o";
       }
       if (znak == 'n')
       {
           cout << "p";
           plik2 << "p";
       }
       if (znak == 'o')
       {
           cout << "r";
           plik2 << "r";
       }
       if (znak == 'p')
       {
           cout << "s";
           plik2 << "s";
       }
       if (znak == 'r')
       {
           cout << "t";
           plik2 << "t";
       }
       if (znak == 's')
       {
           cout << "u";
           plik2 << "u";
       }
       if (znak == 't')
       {
           cout << "w";
           plik2 << "w";
       }
       if (znak == 'u')
       {
           cout << "x";
           plik2 << "x";
       }
       if (znak == 'w')
       {
           cout << "y";
           plik2 << "y";
       }
       if (znak == 'x')
       {
           cout << "z";
           plik2 << "z";
       }
       if (znak == 'y')
       {
           cout << "a";
           plik2 << "a";
       }
       if (znak == 'z')
       {
           cout << "b";
           plik2 << "b";
       }
   plikodczyt.seekg( pozycja, ios::beg );
   plikodczyt >> std::noskipws >> znak;

   ++pozycja;
   }while (pozycja <= koniec);
   plikodczyt.close(); //zamknac
   } else cout << "blad";

   //drugi etap szyfracji

   //cout << "\n\n\nCo chcesz zrobic? Wpisz jedna z komend:\nSzyfruj - encrypt\nOdszyfruj - decrypt";

}

void szyfruj2etap()
{
   string tekst;
   cout << "Oto szyfr:\n";
   //tworzenie pliku
   fstream plik("temp2.tmp", std::ios::in | std::ios::out );
   plik.close(); //zamknij
   Sleep(500);
   ifstream plikodczyt ("temp2.tmp", std::ios::in | std::ios::out); //otworz
   if (plikodczyt.good() == true)
   {
   plikodczyt.seekg( 0, ios::end ); //wskaznik na koncu pliku
   streampos koniecpliku = plikodczyt.tellg(); //odczyt pozycji
   long long koniec;
   koniec = koniecpliku;
   //cout << "pozycja: " << koniec << endl;

   long long pozycja;
   pozycja = 0;
   plikodczyt.seekg( 0, ios::beg ); //pocztatek pliku;
   do{
   char znak;
       if (znak == ' ') //spacje
       {
           cout << " ";
       }
       if (znak == 'a')
       {
           cout << "c";
       }
       if (znak == 'b')
       {
           cout << "d";
       }
       if (znak == 'c')
       {
           cout << "e";
       }
       if (znak == 'd')
       {
           cout << "f";
       }
       if (znak == 'e')
       {
           cout << "g";
       }
       if (znak == 'f')
       {
           cout << "h";
       }
       if (znak == 'g')
       {
           cout << "i";
       }
       if (znak == 'h')
       {
           cout << "j";
       }
       if (znak == 'i')
       {
           cout << "k";
       }
       if (znak == 'j')
       {
           cout << "l";
       }
       if (znak == 'k')
       {
           cout << "m";
       }
       if (znak == 'l')
       {
           cout << "n";
       }
       if (znak == 'm')
       {
           cout << "o";
       }
       if (znak == 'n')
       {
           cout << "p";
       }
       if (znak == 'o')
       {
           cout << "r";
       }
       if (znak == 'p')
       {
           cout << "s";
       }
       if (znak == 'r')
       {
           cout << "t";
       }
       if (znak == 's')
       {
           cout << "u";
       }
       if (znak == 't')
       {
           cout << "w";
       }
       if (znak == 'u')
       {
           cout << "x";
       }
       if (znak == 'w')
       {
           cout << "y";
       }
       if (znak == 'x')
       {
           cout << "z";
       }
       if (znak == 'y')
       {
           cout << "a";
       }
       if (znak == 'z')
       {
           cout << "b";
       }
   plikodczyt.seekg( pozycja, ios::beg );
   plikodczyt >> std::noskipws >> znak;

   ++pozycja;
   }while (pozycja <= koniec);
   plikodczyt.close(); //zamknac
   } else cout << "blad";
}

 

Opiszę to po krótce:

Podajemy tekst "baba a baba" Program zamienia go wg ID znaków na np.

Lista ID:

a=b

b=c

c=d

d=e

 

itd...

 

Tekst zostanie z ostanie zmieniony na: "cbcb b cbcb", jednak jesli użytkowanik wybrałby tryb szyfrowania 2,3, lub więcej to ten sam kod wykonałby się kilka razy tj, według tego samego ID:

 

szyfrowanie:

"baba a baba"

1etap = "cbcb b cbcb"

2etap koduje drugi tekst wg. tych samych id, czyli wyjdzie: "dcdc c dcdc"

3etap robi to samo, czyli: "eded d eded"

 

i tak dalej jeśli wpisze się więcej, a jeśli chodzi o odszyfrowanie to działałoby one w dokładnie drugą stronę tj. wpisujemyu tryb:3 i program cofnie to id wg wzoru, do pierwotnej postaci: W takim prezypadku, aby odszyfrowac wiadomosc trzeba znać klucz czyli cyfrę, i samą wiadomość.

Jednak jak widać w zamieszczonym wyżej kodzie musiałbym zapisać dla wersji z poziomem szyfrowania 2 dwie funkcje i stworzyćz niej jedną i, dla trzech trzy funkcje (co daje nam dwie osobne funkcje czyli poziom szyfrowania 2 i 3) itd... Jest to prawie niewykonalne! No chyba, że będęto pisał przez resztę życia.... :E

 

Dlatego doszedłem do wniosku, że mój sposób jest załkiem do d**y :E

Mam nadzieję, że udało Wam się mnie zrozumieć :P

 

No a teraz (w końcu :P) Moje pytanie do Was: Jak zrobić to co usiłuję zrobić w powyższym kodzie, ale zrobić to z lepszym skutkiem i mniejszą ilością kodu ?

 

Pozdrawiam ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie potrzebujesz czytelnego pliku, więc masz do dyspozycji 0-255; szyfrowany tekst możesz potraktować jako liczby i pojechać z nimi xorem; jedziesz wtedy po tekście i po ciągu szyfrującym, kończy się ciąg szyfrujący, to zaczynasz od jego początku; przy odczycie robisz to samo, bo xor jest odwracalny

i masz symetryczny

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Te ify mnie rozwaliły :D Lepiej zdefiniowac alfabet jesli nie chcesz uzywac pelnego ascii i drukowac zawsze (znak + ileś znaków) modulo liczba liter

 

Po drugie szyfr który implementujesz to tak zwany szyfr monoalfabetyczny, podstawieniowy - stosowany chyba już w starożytnym egipcie i chyba najprostszy do złamania. Wystarczy prześledzić które znaki się pojawiają się najczęściej - w polskim alfabecie będą to kolejno a, e i tak dalej i tyle z szyfru :P

 

EDIT. Na Towim miejscu poczytałbym o DES i spróbował go zaimplementować. Chyba najprostszy algorytm szyfrujący który do dziś jest stosunkowo trudny do złamania(w domowym zaciszu raczej nie do złamania).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zamiast tej litanii ifów, napisz sobie funkcję przesuwającą pojedynczą literę o x pozycji w alfabecie. Np.

 

char shift_letter(char letter, int offset)

 

Samo działanie dla liter można napisać w jednej linijce, korzystając z operacji modulo i znając kod ASCII pierwszej litery i ilość liter w alfabecie ;)

 

Wtedy też będzie szybciej, bo zamiast wywoływać funkcję szyfrującą x razy, po prostu podasz offset jako parametr i wywołasz shift_letter() dla każdego znaku. Odszyfrowujesz tak samo, jak szyfrujesz, tylko -offset.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie potrzebujesz czytelnego pliku, więc masz do dyspozycji 0-255; szyfrowany tekst możesz potraktować jako liczby i pojechać z nimi xorem; jedziesz wtedy po tekście i po ciągu szyfrującym, kończy się ciąg szyfrujący, to zaczynasz od jego początku; przy odczycie robisz to samo, bo xor jest odwracalny

i masz symetryczny

Nie za bardzo wiem o co ci chodzi :E, Czym jest ten XOR ?

Chodzi ci moze o to, że jakby podmieniam ID znaków z klawiatury ? (Coś w deseń biblioteki <conio.h>, która pozwala na obsługę klawiatury w konsoli?)

 

Te ify mnie rozwaliły :D Lepiej zdefiniowac alfabet jesli nie chcesz uzywac pelnego ascii i drukowac zawsze (znak + ileś znaków) modulo liczba liter

 

Po drugie szyfr który implementujesz to tak zwany szyfr monoalfabetyczny, podstawieniowy - stosowany chyba już w starożytnym egipcie i chyba najprostszy do złamania. Wystarczy prześledzić które znaki się pojawiają się najczęściej - w polskim alfabecie będą to kolejno a, e i tak dalej i tyle z szyfru :P

 

EDIT. Na Towim miejscu poczytałbym o DES i spróbował go zaimplementować. Chyba najprostszy algorytm szyfrujący który do dziś jest stosunkowo trudny do złamania(w domowym zaciszu raczej nie do złamania).

A kogo, by te if'y nie rozwaliły :E, wiem to na 99%, że da się to lepiej zapisać, ale sam znalazłem tylko taki sposób :x

A jeśli chodzi o mój "nieudolny szyfr" to wydaje mi się, że zrobienie czegośtakiego jak w drugim kodzie wyżej, trochę by utrudniło deszyfrację :D, chociaż służej myśląc:

ID:

a=b

b=c

c=d

e=f

g=h

i=j

j=k

k=l

l=m

m=n

n=o

o=p

p=r

s=t

t=u

u=w

Teraz: "Ala ma kota" = "bkb nb lpub"

szyfrujemy jeszcze jeden raz :D "bkb nb lpub" = "clc oc mrwc" i tak można powtarzać kilka razy (w zależności od decyzji użytkownika) i cofać szyfr tyle samo razy, bo przecież ktoś kto będzie to deszyfrował nie wie, czy "c" ma być równe "a", czy b, ma być równe "a", więc jest to jakieś utrudnienie :P. (początkowo myślałem też o ID znaków jako o liczbach, ale miałem problemy z wczytywaniem ID 10<x, bo charem tego nie wczytam z pliku, a stringiem też będzie ciężko, dlatego zastanawiam się jak pozbyć się tych if'ów :E

 

EDIT: Oczywiście myślę takim utrudnieniu, że po wpisaniu do programu danych typu abcde... nie otrzymamy właściwego typu ID znaków do zaszyfrowanej wiadomości, jeśli nie wiemy ile razy miałaby się wykonać ewentualna pętla (no włąśnie jak zrobić tu pętle, która kodowałaby wiadomość kilka razy (mój sposób wymaga tworzenia coraz to większej ilości plików :E)

 

 

Zamiast tej litanii ifów, napisz sobie funkcję przesuwającą pojedynczą literę o x pozycji w alfabecie. Np.

 

char shift_letter(char letter, int offset)

 

Samo działanie dla liter można napisać w jednej linijce, korzystając z operacji modulo i znając kod ASCII pierwszej litery i ilość liter w alfabecie ;)

 

Wtedy też będzie szybciej, bo zamiast wywoływać funkcję szyfrującą x razy, po prostu podasz offset jako parametr i wywołasz shift_letter() dla każdego znaku. Odszyfrowujesz tak samo, jak szyfrujesz, tylko -offset.

 

Można rzec, że jestem dość początkujący... i nie wiem jak to zapisać :(, a żeby przesuwać pojedynczą literę o x miejsc w alfabecie to też trzeba jakoś zapisać listę ID znaków ( w tym przypadku alfabet, czyli abcde...) No i tu zaczyna się też problem: Jak rozbić wczytany tekst przez getline(), na pojedyncze znaki i zmieniać ich wartości ? To dla mnie czarna magia :E.

Niemniej jednak dzięki za zainteresowanie :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
bo przecież ktoś kto będzie to deszyfrował nie wie, czy "c" ma być równe "a", czy b, ma być równe "a"

Nie chodziło mi o to. Żeby to rozszyfrować wystarczy wiedzieć, że tak to zostało zaszyfrowane(a to akurat najprostsza część każdego deszyfrowania :) ). Nie potrzeba twojego programu. Wystarczy patrzeć które znaki występują w zaszyfrowanym tekście najczęściej. I zawsze najczęściej występujący znak będzie odpowiadał znakowi - 'a' i tak dalej... Jak masz kilka znaków to już znasz cały szyfr. I cokolwiek byś nie wymyślił nie będzie to tak naprawdę utrudnieniem ponieważ wciąż tworzysz szyfr monoalfabetyczny tzn. operujesz zawsze na jednym znaku naraz.

 

Każda litera ma przypisane w C swoje ID. Jest to tzw. kod ASCII. Odsyłam do wikipedii. Czemu chcesz rozbijać wczytany ciąg znaków? Przecież czy to char*(w C) czy też string(w c++) można się do każdej litery odnosić poprzez indeks tablicy? Indeks możesz traktować jako id znaku jeśli nie chcesz używać ASCII(ascii wydobywasz traktując char jako int).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

hmm... Rzeczywiście masz rację o tym nie pomyślałem! :)

Skleciłem coś takiego jako podstawędo dalszego kodzenia, ale jest pewne ale...

int main()
{

   cout << "Wpisz cos" << endl;
   SetConsoleTitleA( "Szyfruj v0.1" );
   do{
   int id;
   char znak;
   cout << endl;
   cin >> znak;
   id = znak;
   cout << id;
   }while (true);
}

 

Jeśli utworzę chara, który przechowa więcej znaków niż 1, to program się nie kompiluje ;(

Wywali:

C:\Users\Łukasz\Desktop\Projekt\main.cpp:17:10: error: invalid conversion from 'char*' to 'int' [-fpermissive]

 

Jak to rozwiązać ?

 

Edit: Dobra jednak nie działa :P, chyba, że zrobię pętlę w cin >> znak; hmm dobra pomyślę coś zakodzę i wtedy odpiszę ;p

 

EDIT2: No cóż teraz mam następny problem :E, kod który jest wyżej działa, ale tylko dzięki temu że jest tam pętla nieskończona... i program zatrzymuje się dopiero wtedy kiedy program che wczytać kolejnego chara... a jeśli chcę wczytać cały tekst, czyli tworzę tablicę znaków, to konwersja do int się nie uda ;/

Mam na to taki pomysł: Stworzyć pętle z cinem, i zapisać wszystkie znaki do pliku (:E) sprawdzić ile znaków ma plik wskaźnikiem wczytać te dane do zmiennej i jej ilość podać za warunek w pętli, jednak znowy będę babrał się z ifami i plikami :E

Chyba sobie to daruje na razie :E

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie wiem, czy do końca zrozumiałem, co chcesz osiągnąć, ale do przeglądania kolejnych literek stringa wystarczyłoby coś takiego:

for(int i = 0; i < napis.length(); ++i)
{
  zrob_costam( napis[i] );
}

Do przesuwania literek też nie potrzeba zbyt wielu if-ów:

char przesunMalaLiterke ( char malaLiterka, int przesuniecie )
{
int foo = (malaLiterka - 'a' + przesuniecie) % ('z'-'a'+1);
return (foo < 0 ? ('z'+1) : 'a') + foo;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Właśnie o to chodziło :)

Dzięki ! :D

Teraz czas ogarniać :>

 

Temat do zamknięcia

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...