Szyfrowanie - wprowadzanie klucza
Ostatnio zmodyfikowano 2018-01-01 18:55
angelstoflyyx Temat założony przez niniejszego użytkownika |
Szyfrowanie - wprowadzanie klucza » 2017-12-30 17:51:38 Witam. Mam problem z zadaniem, a raczej jego częścią. *Szyfr polialfabetyczny to jedna z technik szyfrowania podstawieniowego, w której zmianie ulegają kody liter. Jest to szyfr, w którym do czynienia mamy z tekstem do zaszyfrowania oraz z kluczem (zawierającym liczby pozwalające na zmianę kodów znaków w szyfrowanym tekście). Klucz może jednak być krótszy niż tekst do zaszyfrowania, w takim wypadku należy go wykorzystać ponownie od początku tyle razy by zaszyfrować wszystkie znaki. Przykład szyfrowania z kluczem czteroelementowym: {3,1,2,2} * Hasło , długość klucza i klucz podaany jest z klawiatury. Mam jednak problem z sytuacją, w której klucz jest krótszy od hasła, np aaaaaa, dł klucza 3, 1 2 3. Wpadłam na pomysł, żeby wprowadzić te dane do tablicy (skoro znamy długość hasła i długość klucza to możemy wprowadzić klucz tyle razy do tablicy, by była ona długości hasła, czyli dla hasła "aaaaaa", 3, 1 2 3 byłoby to 1 2 3 1 2 3). Tylko to, co napisałam, niestety nie działa, nie jestem też pewna, czy do stringa można podstawiać wartości z tablicy int? #include <iostream> using namespace std; int g[ 250 ]; int c[ 250 ]; int main() { string s; cin >> s; int klucz; cin >> klucz; int k; float b = s.size() / klucz; int z = b; if( b - z == 0 ); else b = b + 1; for( int i = 0; i < klucz; i++ ) { cin >> k; g[ i ] = k; } int i = 0; for( int j = 0; i < s.size(); j = j + klucz ) { c[ j ] = g[ i ]; i++; } for( int i = 0; i < s.size(); i++ ) { cout << c[ i ]; } for( int i = 0; i < b; i = i + klucz ) { for( int j = 0; j < s.size(); j++ ) { s[ j ] = s[ j ] + g[ j ]; if(( unsigned int ) s[ i ] >( unsigned int ) 'z' ) s[ i ] = s[ i ] - 26; } } cout << s; }
return 0; }
|
|
pekfos |
» 2017-12-30 21:28:12 możemy wprowadzić klucz tyle razy do tablicy, by była ona długości hasła |
Można, jeśli koniecznie chcesz sobie utrudniać. for( int i = 0; i < plaintext_size; ++i ) ciphertext[ i ] = f( plaintext[ i ], key[ i % key_size ] ); |
|
latajacaryba |
» 2017-12-30 22:11:43 Jak rozumiem, chodzi o przesunięcie danej litery o n miejsc w alfabecie, gdzie n to liczba w kluczu, o indeksie takim, jak zmieniany znak? aaa 123 bcd? int main() { std::string Key; std::string Text; std::getline( std::cin, Text ); std::getline( std::cin, Key ); int KeyIndex = 0; for( int j = 0; j < Text.size(); j++ ) { Text[ j ] +=(( int ) Key[ KeyIndex++ ] - '0' ); if( KeyIndex == Key.size() ) KeyIndex = 0; } std::cout << "szyfr: " << Text << "\n"; KeyIndex = 0; for( int j = 0; j < Text.size(); j++ ) { Text[ j ] -=(( int ) Key[ KeyIndex++ ] - '0' ); if( KeyIndex == Key.size() ) KeyIndex = 0; } std::cout << "deszyfracja: " << Text; }
Do tego dorób sobie sprawdzanie, czy wszystkie znaki w Key są znakami '0' - '9', albo zabezpieczenie, żeby Text[ j ] +=(( int ) Key[ KeyIndex++ ] - '0' ); było 0 <= Text[j] <= 255 PS. błagam, bez nazw a,b,c,d,e,f,k tegoż sie nie da czytać |
|
angelstoflyyx Temat założony przez niniejszego użytkownika |
» 2018-01-01 18:55:16 Dziekuje Wam bardzo |
|
« 1 » |