Rafals Temat założony przez niniejszego użytkownika |
Szyfrowanie przy użyciu permutacji. » 2014-01-18 20:32:46 Witam. Jedna z wytycznych co do projektu to: "program losuje klucz do szyfrowania, który jest dowolną permutacją o długości co najwyżej 1024 elementy". Mam rozumieć przez to, że tworzę sobie tablicę np o wielkości 500 i wpisuję w nią losowe wartości z zakresu ilości kolumn tablicy, której używam do kodowania tekstu? Czyli np tab = {0,1,2, 2,0,1, 0,2,1...} itd.? Mam dodatkowy problem, nie mam pojęcia jak napisać sprawdzanie czy liczby w trójkach są różne od siebie. Tzn, nie wiem jak sprawdzać np w 2 trójce, 3 itd. To jest pomysł na ten problem, ale coś nie idzie: #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
bool czybyla( int tab[], int wylosowana, int indeks, int trojka ) { if( indeks == 0 ) return true; for( int i = trojka; i < indeks; i++ ) if( tab[ i ] == wylosowana ) return false; return true; }
int main() { srand( time( NULL ) ); int tab[ 500 ]; int kluczlos; int a = 0; for( int i = 0; i < 500; i++ ) tab[ i ] = - 1; for( int i = 0; i < 500; ) { kluczlos = rand() % 3; if( i != 0 && i % 3 == 0 ) a += 3; if( czybyla( tab, kluczlos, i, a ) ) { tab[ i ] = kluczlos; i++; } } for( int i = 0; i < 500; i++ ) cout << tab[ i ]; return 0; }
Problem rozwiązany z losowaniem trójek, w których są cyfry różne od siebie. Pytanie dotyczące klucza nadal aktualne. Czy ten kod jest poprawny dla wymagania z projektu? |
|
Wiesiek |
» 2014-01-20 10:19:55 Permutacja o długości n, to tablica t[n], w której stoją liczby bez powtórzeń o wartościach od 0 do n-1. Informacja t /==b oznacza, że liczbę o numerze a wstawiamy na pozycji b. W szyfrowaniu słowo "program" szyfrujemy permutacją długości 7 przestawiając według wzoru permutacji litery, np permutacja 3,5,0,1,2,6,4 da szyfrogram "gapromr" |
|
Rafals Temat założony przez niniejszego użytkownika |
» 2014-01-22 19:49:34 Czyli zadanie polega na tym, aby wylosować liczby z przedziału 0 do 1024 i według tego przestawiać litery z kolejnych wierszy. Więc napiszę sobie tutaj idee programu i jak byście mogli rzucić okiem czy o to chodzi. Losuję sobie klucz o długości 1024. Następnie mam plik tekstowy o długości 2000 znaków. klucz = {1020, 3, 513, 439, 989,... } itd. Teraz mam w sumie dwie opcje i wydaje mi się że jedna z nich jest prostsza do napisania. 1) Ta łatwiejsza, pobieram 1020 znak z wiersza i zapisuję na zerowej pozycji nowej zmiennej tekstowej, pobieram 3 znak i zapisuję na pierwszej pozycji nowej zmiennej, pobieram 513 znak i zapisuję na drugiej pozycji, itd.
2) Pobieram 1 znak i zapisuję na 1020 pozycji nowej zmiennej tekstowej, pobieram drugi znak i zapisuję na 3 pozycji itd.
Następnie zapisuję wynik do pliku. Ogólna idea dobra? |
|
Wiesiek |
» 2014-01-24 11:13:51 W szyfrowaniu przestawieniowym (czyli permutacyjnym) długość szyfrowanego tekstu powinna być wielokrotnością długości klucza. Jeśli tekst jest zbyt krótki, to można jego koniec uzupełnić wybranym znakiem (albo umówionym zestawem, np. w razie potrzeby uzupełnienia w tekście do szyfrowania na koniec wstawiamy dwie kropki i dowolny ciąg znaków, aby uzyskać wymaganą długość). W Twoim przypadku tekst jawny ma 2000 znaków, więc poszerzasz go do 2048 znaków. Dalej szyfrujesz według drugiej metody (ja omyłkowo podałem sposób deszyfrowania tekstu zaszyfrowanego) |
|
Rafals Temat założony przez niniejszego użytkownika |
» 2014-01-25 00:56:40 Więc, ogarnąłem szyfrowanie. Teraz mam problem z odszyfrowaniem. Szyfrowanie zrobiłem w sposób pierwszy. Odszyfrować chcę tak, że do nowego stringa na pozcyje podana z pliku klucza, przypisuję kolejne litery z pliku z szyfrem. Dla przykładu. rafal plik_klucz = {3,4,2,1,0} plik_szyfr = alfar Problem polega na tym że jak podam do nowego stringa aby na pozycji 3 zapisał a, na pozycji 4 zapisał l, na pozycji 2 zapisał f, na pozycji 1 zapisał a i na pozycji 0 zapisał r. Problem jest w momencie jeżeli jest to ciąg znaków. W programie i zestawie danych które posiadam, np klucz zaczyna się liczbą 856 i na tej pozycji powinien mi zapisać pierwszy znak z szyfru. Lecz on zapisuje ciąg znaków z szyfru od 856 miejsca... Kod: deszyfrowanie_klucz( tab_klucz ); do { cout << "Wprowadz nazwe pliku z zaszyfrowanymi danymi.\n"; cout << "Nazwa pliku bez rozszezenia: "; cin.clear(); cin.sync(); cin >> plik_dane_de; plik_dane_de += ".txt"; plik.open( plik_dane_de.c_str() ); if( !plik.good() ) cout << "\nBrak pliku w folderze z programem lub zostala wprowadzona bledna nazwa pliku.\n\n"; } while( !plik.good() );
while( true ) { plik >> dane; tekst = dane; if( !plik.good() ) break; }
for( int i = 0; i < ROZMIAR_KLUCZA; i++ ) { dane_de_2[ tab_klucz[ i ] ] += tekst[ i ]; getch(); }
getch(); break;
funkcja deszyfrowanie_klucz po prostu przypisuje liczby klucza z pliku do tablicy. |
|
stryku |
» 2014-01-25 03:16:17 TO POD SPODEM JEST GŁUPIE BO NIE DOCZYTAŁEM. DALEJ JEST ODP Jeżeli dobrze rozumiem to powinno być tak chyba for( int i = 0; i < ROZMIAR_KLUCZA; i++ ) { dane_de_2[ i ] += tekst[ tab_klucz[ i ] ]; getch(); }
To już będzie mądrzejsze #include <string> #include <iostream>
const int rozmiar = 5;
using namespace std;
int main() { int plik_klucz[ rozmiar ] = { 3, 4, 2, 1, 0 }; string plik_szyfr = "alfar", wynik = plik_szyfr; for( int i = 0; i < rozmiar; i++ ) wynik[ plik_klucz[ i ] ] = plik_szyfr[ i ]; cout << wynik; return 0; } takie coś naskrobałem i działa myślę, że zamiast dane_de_2[ tab_klucz[ i ] ] += tekst[ i ];
dałbyś dane_de_2[ tab_klucz[ i ] ] = tekst[ i ];
i by działało |
|
Rafals Temat założony przez niniejszego użytkownika |
» 2014-01-25 12:28:58 Ok skoro problem rozwiązany usuwam ostatni wpis i zamieszczam poprawny kod oraz wyedytowany. Pewnie ilość zmiennych można jeszcze zmniejszyć, aby dla case1 i 2 były po prostu te same. Ale to później, bo już mi głowa pęka :P
|
|
« 1 » |