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