Ostatnio się bawiłam w kodzie. (Thx idlecode za podsunięcie pomysłu) i wyszło mi coś takiego. Poziom może niski, ale przynajmniej działa. Jak co pejstnę:
#include <iostream> #include <string> #include <cstdlib> using namespace std; union kluczyk{ long knum; char ktab[4]; }; int main(){ string napis; string wynik; unsigned int licznik_klucza = 0; unsigned int licznik_pola = 0; kluczyk kej; cout<<"\nPodaj liczbę będšcš kluczem: "; cin>>kej.knum; // cout<<"Wczytano "<<kej.knum<< "inaczej: \n"; // for (int i = 0; i<4 i++){ // cout<<kej.ktab[i]<<endl; // } //przeszło cout<<"\nPodaj tekst do zaszyfrowania: "; cin>>napis; // cout<<"Wczytano "<<napis; /*Napis wczytany prawidłowo*/ do{ licznik_klucza = licznik_pola % 4; cout<<licznik_klucza; wynik.resize(licznik_pola+1, '0'); wynik.at(licznik_pola) = kej.ktab[licznik_klucza] ^ napis.at(licznik_pola); licznik_pola ++; }while (licznik_pola < napis.length()); //while (napis.at(licznik_pola) != '\0'); cout<<"wynik: "<<wynik<<endl; }
A to wersja dla plików
#include <iostream> #include <fstream> #include <string> #include <cstdlib> #include <cstdio> using namespace std; union kluczyk{ long long knum; char ktab[8]; }; int main(int argc, char* argv[]){ //------------------------przygotowanie zmiennych ----------------------------- fstream zrodlo, cel; //--------------Sprawdzenie poprawnoci iloci argumentów-------------------- if ((argc <2) || (argc > 3)){ cerr<<"\nBłąd wywołania. Spróbuj "<<argv[0]<<" --help"; exit(1); //Błąd wywołania } //----------------Przygotowanie danych dla szyfrowania------------------------------ unsigned int licznik_klucza = 0; unsigned int licznik_pola = 0; kluczyk kej; //Tu będę przechowywać klucz, pobierany w takiej formie jaka nam pasi:) kej.knum = 0; if (!((string)argv[1]=="--help")){ //Przy helpie nie ma potrzeby podawania klucza;) cout<<"\nPodaj klucz (liczbowy, im większa tym lepiej, \nale nie większa niż 9223372036854775807): "; cin>>kej.knum; cout<<endl; } //------------Dane gotowe------------------------------------------------------------- if (argc ==2){ if ((string)argv[1]=="--help"){ cout<<"Program szyfruje plik ródłowy "; cout<<endl<<"Wywołanie: "<<argv[0]<<" <plik_zródłowy> [plik_wynikowy]"<<endl; cout<<"Plik zródłowy musi być podany i musi istnieć. \n"; cout<<"W przypadku braku podania celu, wypluwa zawartoć na ekran (ale to krzaki)\n"; cout<<"Najlepiej podawać duże liczby.\n"; exit(0); //poprawne zakończenie funkcji przy helpie } //----------------Obsługa szyfrowania z wywalaniem na ekran-------------------- zrodlo.open(argv[1], ios::in|ios::binary); if (!zrodlo.good()){ cerr<<"\nBłąd otwarcia pliku."; exit(2); //błąd otwarcia pliku ródłowego } //właciwe przeszyfrowanie z wypluciem na ekran char znak, wynik; unsigned int kolumna; cout<<"\nPodaj szerokoć kolumny przy wywietlaniu: "; cin>>kolumna; while (!zrodlo.eof()){ licznik_klucza = licznik_pola % 8; zrodlo.get(znak); wynik = kej.ktab[licznik_klucza] ^ znak; licznik_pola ++; if ((licznik_pola % kolumna) == 0) cout<<endl; //żeby ładniej wywietlało cout<<wynik; } //od while (!zrodlo.eof()) zrodlo.close(); exit(0); } //od dwójki w argc //-----------------------------teraz wywalamy z pliku do pliku:) --------------------------- zrodlo.open(argv[1], ios::in|ios::binary); if (!zrodlo.good()){ cerr<<"\nBłąd otwarcia pliku."; exit(2); //błąd otwarcia pliku ródłowego } cel.open(argv[2], ios::in); bool nadpisac = false; char a; if(cel){ cout<<"\nPlik docelowy istnieje. Nadpisać? T/N: "; cin>>a; while(1){ if (toupper(a) == 'T'){ nadpisac = true; break; } else if (toupper(a) == 'N'){ break; } else { cout<<"\nNadpisać? T/N: "; cin>>a; continue; } } } cel.close(); if ((!cel) || nadpisac ==true){ cel.open(argv[2], ios::out|ios::binary); char znak, wynik; while (!zrodlo.eof()){ licznik_klucza = licznik_pola % 8; zrodlo.get(znak); wynik = kej.ktab[licznik_klucza] ^ znak; licznik_pola ++; cel.put(wynik); } //od while (!zrodlo.eof()) zrodlo.close(); cel.close(); cout<<"\nZaszyfrowano. Wynik zapisano w "<<argv[2]<<".\n"; cout<<"Odszyfrujesz tak jak szyfrowałe, jeżeli podasz ten sam klucz."; } else { cerr<<"Plik docelowy istnieje, a nadpisać zabroniono"; exit(3); } return 0; } //od maina
😉 No dobra A tu macie całość, ze skompilowanymi binarkami do windy. Polecam te z 2, bo zostały przekonwertowane, by nie krzaczyły w terminalu:)
SSIJ_Z_TĄD