Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C++ program szyfrujący

tomn0 21 Sty 2008 17:37 6526 7
  • Poziom 9  
    Witam
    prosze o pomoc z tym programem, już na prawde nie wiem czemu on nie działa jak powinien
    Pomoże mi ktoś ?

    Program pobiera klucz i przesuwa alfabet o ten klucz następnie wczytuje teks i go szyfruje
    np klucz =2
    tekst: ala ma kota
    wynik: cnc oc mqvc

    Code:
    #include<stdio.h>
    
    #include<iostream.h>
    #include<windows.h>

    using namespace std;

    void usun(char klucz[])
    {
             char a;
             for (int i=0;i<25;i++)
             {
                       for (int j=i+1;j<25;j++)
                       {
                                 if (klucz[i]==klucz[j])
                                 {
                                           klucz[j]=0;
                                 }
                       }
             }
    aa:      for( int i=0;i<25;i++)
             {
                       for(int j=i;j<25;j++)
                       {
                                 if(klucz[i]==0)
                                 {
                                           if(klucz[j]!=0)
                                           {
                                                     a=klucz[j];
                                                     klucz[i]=a;
                                                     klucz[j]=0;
                                                     goto aa;
                                           }
                                 }
                       }
             }
    }
    void podstaw(char klucz[], char alf[])
    {
             int licznik=0,licznik1=0;
             for(int i=0;i<25;i++)
             {
                       if(klucz[i]!=0)
                                 licznik++;
                       else break;
             }

             for(int j=0;j<25;j++)
             {
                       licznik1=0;
                       for(int k=0;k<25;k++)
                       {
                                 if(alf[j]==klucz[k])
                                 {
                                           licznik1++;
                                 }
                       }
                       if(licznik1==0 && licznik<25)
                       {
                                 klucz[licznik]=alf[j];
                                 licznik++;
                       }
             }
    }
    void szyfrowanie(char klucz[],char alf[])
    {
             FILE *we, *wy;
             char znak,znak1;
             char plik_jawny[20];
             char plik_zaszyfrowany[20];

             cout<<"Podaj nazwe pliku, ktorego tresc ma zosatc zaszyfrowana: " ;
             cin>>plik_jawny;
             cout<<"Podaj nazwe pliku wynikowego: ";
             cin>>plik_zaszyfrowany;
             if((we=fopen(plik_jawny,"rb"))!=NULL)
             {
             if((wy=fopen(plik_zaszyfrowany,"wb"))!=NULL)
             {
                       while((znak=getc(we))!=EOF)
                       {
                                 for(int i=0;i<25;i++)
                                 {
                                           if(znak==alf[i]);
                                           {
                                                     znak1=klucz[i];
                                                     putc(znak1,wy);
                                           }
                                 }
                       }
             fclose(wy);
             }
             fclose(we);
             }
    }
    void deszyfrowanie(char klucz[], char alf[])
    {
             FILE *we, *wy;
             char znak,znak1;
             char plik_jawny[20];
             char plik_zaszyfrowany[20];

             cout<<"Podaj nazwe pliku, ktorego tresc ma zosatc odszyfrowana: " ;
             cin>>plik_jawny;
             cout<<"Podaj nazwe pliku wynikowego: ";
             cin>>plik_zaszyfrowany;
             if((we=fopen(plik_jawny,"rb"))!=NULL)
             {
             if((wy=fopen(plik_zaszyfrowany,"wb"))!=NULL)
             {
                       while((znak=getc(we))!=EOF)
                       {
                                 for(int i=0;i<25;i++)
                                 {
                                           if(znak==klucz[i]);
                                           {
                                                     znak1=alf[i];
                                                     putc(znak1,wy);
                                           }
                                 }
                       }
             fclose(wy);
             }
             fclose(we);
             }
    }

    void main()
    {
             int odp,c;
             char alf[25]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','y','z'};
             cout<<"Podaj klucz: ";
             char klucz[25]={NULL};
             cin>>klucz;
             system("CLS");
             do
             {
                       cout<<"1 - szyfrowanie"<<endl;
                       cout<<"2 - deszyfrowanie"<<endl;

                       cin>>odp;
                       system("CLS");
                       switch(odp)
                       {
                                 case 1:
                                           usun(klucz);
                                           podstaw(klucz,alf);
                                           szyfrowanie(klucz,alf);
                                           cout<<klucz<<endl;
                                           system("CLS");
                                           cout<<"Szyfrowanie zosatalo zakonczone"<<endl;
                                           break;
                                 case 2:
                                           usun(klucz);
                                           podstaw(klucz,alf);
                                           deszyfrowanie(klucz,alf);
                                           system("CLS");
                                           cout<<"Deszyfrowanie zosatalo zakonczone"<<endl;
                                           break;
                       }
                       cout<<"Aby zakonczyc wcisnij 1"<<endl;
                       cin>>c;
                       system("CLS");
             }
             while(c!=1);
    }


    Kod proszę umieszczać w znacznikach code - krzychoocpp
  • Poziom 16  
    Sformatuj kod i powiedz co dokladnie kryje sie pod pojeciem "nie dziala jak powinien"?
  • Poziom 9  
    RhinoRace napisał:
    Sformatuj kod i powiedz co dokladnie kryje sie pod pojeciem "nie dziala jak powinien"?


    Program nie podstawia litery za litere tylko alfabet za litere
    a jako klucz podstawia samą cyfre nie przestawaiając alfabetu o ten klucz


    a kod wkleiłem sformatowany i on niby dalej taki jest tylko wyślwietla sie wszystko w kupie :/
  • Poziom 29  
    No bo nie używa się cytatu tylko znacznika 'code' :]
  • Poziom 16  
    Z tego co mówisz wynika, że za każdy znak podstawiasz znak zwiększony o k - czyli uproszczony kod Cezara ;)
    Jakbyś nie wiedział to zmienna typu char ma w sobie zakodowany kod znaku, czyli wystarczy ten kod zwiększyć o k oraz sprawdzić czy zwiększony kod nie wyszedł poza dozwolony zakres.
    Ogólny schemat programu:
    Code:
    void zmien(char *znak, const int klucz)
    
    {
       *znak += klucz;
       while (*znak > /*gorny zakres*/)
          *znak = /*dolny zakres*/ + *znak - /*gorny zakres*/ - 1;
          //zamiast (dolny zakres) - (gorny zakres) - 1 mozesz podstawic wyliczona wartosc poniewaz to sie nie zmienia
       while (*znak < /*dolny zakres*/)
          *znak = /*gorny zakres*/ + *znak - /*dolny zakres*/ + 1;
          //zamiast (gorny zakres) - (dolny zakres) + 1 mozesz podstawic wyliczona wartosc poniewaz to sie nie zmienia
       //(gorny zakres) i (dolny zakres) sa to kody znakow
    }

    void szyfruj_linie(char *linia, const int klucz)
    {
       for (int i=0; i < strlen(linia) ; i++)
          zmien(&linia[i], klucz);
    }

    void szyfrowanie(const int klucz)
    {
       ifstream we(/*sciezka do pliku wejsciowego*/);
       ofstream wy(/*sciezka do pliku wyjsciowego*/);
       char linia[1024];
       while (we.getline(linia, 1024))
       {
          szyfruj_linie(linia, klucz);
          wy << linia;
       }
       we.close();
       wy.close();
    }

    void main ()
    {
       int klucz = 2;
       //szyfrowanie
       szyfrowanie (klucz);
       //deszyfrowanie
       klucz = 0 - klucz;
       szyfrowanie (klucz);
    }

    to powinno działać, a kod mam nadzieje jest zrozumiały
  • Poziom 9  
    Tylko czemu sie czepia do tego fragmentu

    Code:
       while (we.getline(linia, 1024))


    Konkretnie przed kropką

    Cytat:
    [C++ Warning] Unit1.cpp(21): W8012 Comparing signed and unsigned values
    [C++ Error] Unit1.cpp(30): E2294 Structure required on left side of . or .*
    [C++ Error] Unit1.cpp(33): E2087 Illegal use of pointer
  • Poziom 16  
    Czy w tym miejscu:
    Code:
    ifstream we(/*sciezka do pliku wejsciowego*/);
    
    ofstream wy(/*sciezka do pliku wyjsciowego*/);

    zamiast komentarzy dałeś ścieżki do odpowiednich plików?
  • Poziom 20  
    Witam też pisałem kiedyś coś podobnego tylko szyfruje jedną literę jak chcesz to sobie możesz przerobić ;)
    Code:
    #include <iostream>
    
    #include <string.h>

    using namespace std;
    int main()
    {
    int k, lp;
    char l, alf[47]="abcdefghijklmnopqrstuwxyz";

      cout<<"podaj klucz szyfrowania k=";
      cin>>k;
      cout<<"podaj litere do zaszyfrowania =";
      cin>>l;
     
     
        for(lp=0; lp<25; lp++)
        {
         if(l==alf[lp])
          {
           for (int p=0; p<23; p++)
             {
              alf[25+p]=alf[0+p];
             }
          cout<<"litera zaszyfrowana to "<<alf[lp+k]<<endl;
          }}
         
         
           cout<<"podaj litere do zdeszyfrowania =";
           cin>>l;
        for(lp=0; lp<25; lp++)
        {
         if(l==alf[lp])
          {
           for (int p=0; p<23; p++)
             {
              alf[25+p]=alf[24-p];
             }
             if((24+k-lp)>24)
             {
             cout<<"litera zdeszyfrowana ="<<alf[24+k-lp]<<endl;
             }
             if((24+k-lp)<25)
             {
             cout<<"litera zdeszyfrowana to "<<alf[lp-k]<<endl;
             }}}
         
         
          cout<<"\n\nsprawdzanie\n";
          cout<<"alfabet jawny\n";
      for(int lp=0; lp<9; lp++)
       {
        cout<<alf[lp]<<" ";
       }
       for(int lp=9; lp<25; lp++)
       {
        cout<<alf[lp]<<"  ";
       }
       cout<<"\n";
      for(int lp=0; lp<25; lp++)
       {
        cout<<lp+1<<" ";
       }
       cout<<"\n";
     
      cout<<"alfabet szyfrowany\n";
     
      for(int lp=0; lp<9; lp++)
       {
        cout<<alf[lp+k]<<" ";
       }
       for(int lp=9; lp<25-k; lp++)
       {                           
        cout<<alf[lp+k]<<"  ";   
       }
       for(int lp=-1; lp<k-1; lp++)
       {
        cout<<alf[lp+1]<<"  ";
       }

       cout<<"\n";
      for(int lp=0; lp<25; lp++)
       {
        cout<<lp+1<<" ";
       }
       cout<<"\n";
       system("pause");
       return 0;
      }