Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] Szyfruj deszyfruj program

Ostatnio zmodyfikowano 2015-10-15 16:52
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[c++] Szyfruj deszyfruj program
» 2015-09-27 13:15:49
Napisałem taki bardzo prosty program do szyfrowania i deszyfrowania ... Program do pewnego momentu działa znakomicie. Problemem jest natomiast to że nie chce rozszyfrowywać tekstu powyżej dwudziestu, trzydziestu znaków. Czy ktoś mógłby wskazać gdzie tkwi błąd?

C/C++
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;

int main()
{
    ofstream out( "zaszyfrowany.txt" );
    string word;
    int i = 0;
    cout << "Szyfrowanie wedlug klucza:" << endl;
    cout << "--------------------------" << endl;
    for( char zn = 'a'; zn <= 'z'; ++zn ) {
        ++i;
        cout << " " << zn << " = [" << i << "]" << "\t";
    }
    cout << endl;
    cout << "Podaj tekst do zaszyfrowania malymi literami:";
    getline( cin, word );
    for( unsigned int i = 0; i < word.length() + 1; ++i )
    switch( word[ i ] )
    {
    case 'a': out << 1 << " "; break;
    case 'b': out << 2 << " "; break;
    case 'c': out << 3 << " "; break;
    case 'd': out << 4 << " "; break;
    case 'e': out << 5 << " "; break;
    case 'f': out << 6 << " "; break;
    case 'g': out << 7 << " "; break;
    case 'h': out << 8 << " "; break;
    case 'i': out << 9 << " "; break;
    case 'j': out << 10 << " "; break;
    case 'k': out << 11 << " "; break;
    case 'l': out << 12 << " "; break;
    case 'm': out << 13 << " "; break;
    case 'n': out << 14 << " "; break;
    case 'o': out << 15 << " "; break;
    case 'p': out << 16 << " "; break;
    case 'q': out << 17 << " "; break;
    case 'r': out << 18 << " "; break;
    case 's': out << 19 << " "; break;
    case 't': out << 20 << " "; break;
    case 'u': out << 21 << " "; break;
    case 'v': out << 22 << " "; break;
    case 'w': out << 23 << " "; break;
    case 'x': out << 24 << " "; break;
    case 'y': out << 25 << " "; break;
    case 'z': out << 26 << " "; break;
       
    }
    out.close();
    cout << "Koniec szyfrowania - plik zaszyfrowany i zapisany" << endl;
    cout << "--------------------------------------" << endl;
   
    ofstream ods( "odszyfrowany.txt" );
    ifstream in( "zaszyfrowany.txt" );
    int szyfr = 0;
    cout << "Odszyfrowywanie pliku" << endl;
    cout << "----------------------" << endl;
    while( in >> szyfr && !in.eof() )
    {
        switch( szyfr )
        {
        case 1: ods << "a" << " "; break;
        case 2: ods << "b" << " "; break;
        case 3: ods << "c" << " "; break;
        case 4: ods << "d" << " "; break;
        case 5: ods << "e" << " "; break;
        case 6: ods << "f" << " "; break;
        case 7: ods << "g" << " "; break;
        case 8: ods << "h" << " "; break;
        case 9: ods << "i" << " "; break;
        case 10: ods << "j" << " "; break;
        case 11: ods << "k" << " "; break;
        case 12: ods << "l" << " "; break;
        case 13: ods << "m" << " "; break;
        case 14: ods << "n" << " "; break;
        case 15: ods << "o" << " "; break;
        case 16: ods << "p" << " "; break;
        case 17: ods << "q" << " "; break;
        case 18: ods << "r" << " "; break;
        case 19: ods << "s" << " "; break;
        case 20: ods << "t" << " "; break;
        case 21: ods << "u" << " "; break;
        case 22: ods << "v" << " "; break;
        case 23: ods << "w" << " "; break;
        case 24: ods << "x" << " "; break;
        case 25: ods << "y" << " "; break;
        case 26: ods << "z" << " "; break;
           
        }
    }
    cout << "Koniec odszyfrowywania - plik odszyfrowany i zapisany " << endl;
    cout << "-------------------------------------------" << endl;
   
    ods.close();
    in.close();
   
    cin.get();
    cin.get();
    return 0;
}
P-137959
pekfos
» 2015-09-27 13:32:41
C/C++
for( unsigned int i = 0; i < word.length() + 1; ++i )
Dlaczego +1?

C/C++
while( in >> szyfr && !in.eof() )
Po co ten eof()?

I dlaczego szyfrowanie i deszyfrowanie zajmuje 100 razy więcej kodu niż powinno?
C/C++
for( char zn = 'a'; zn <= 'z'; ++zn ) {
    ++i;
    cout << " " << zn << " = [" << i << "]" << "\t";
}
Tu jakoś się domyśliłeś, że kolejne znaki chcesz zmienić na kolejne liczby. To liniowe przekształcenie, to się załatwia jedną operacją arytmetyczną, a nie instrukcją wyboru z ponad 20 wariantami.
P-137960
wojownik266
Temat założony przez niniejszego użytkownika
» 2015-09-27 17:03:56
Usunicie in.eof() rozwiązało problem z szyfrowaniem i odszyfrowywaniem tekstu po wyżej trzydziestu znaków. za to należą ci się podziękowania a co do tego że ten program można napisać w paru linijkach to mógłbyś podać jakiś kawałek kodu?
P-137962
pekfos
» 2015-09-27 17:21:52
C/C++
word[ i ] - 'a' + 1
Do tego filtruj sobie znaki funkcjami z <cctype>.
P-137963
C-Objective
» 2015-10-15 16:52:34
C/C++
#include <stdio.h>
void xor( char * str, char key ) {
    for( i = 0; i < strlen( str ); i++ )
         str[ i ] = str[ i ] ^ key;
   
}
main() {
    char * doszyfrowania = "Ala ma kota bo nie wzięła leków";
    char key = 36;
    xor( doszyfrowania, key );
    printf( doszyfrowania );
    return 0;
}
easy peasy lemon squeezy
P-138610
« 1 »
  Strona 1 z 1