Szyfrowanie z kluczem - szyfr podstawieniowy


Główne problemy:

  1. Klucz jest większy niż zakres/ilość liter alfabetu
  2. Klucz jest mniejszy równy ilości liter alfabetu lecz po zaszyfrowaniu litera przekracza zakres
  3. Stosowanie rzutowania typów

Jak sobie z nimi poradzić?

  1. Przypisać wartość modulo dzielenia klucza przez zakres czyli klucz=klucz%zakres 
  2. Spowodować, iż pierwsza litera poza zakresem jest pierwszą literą zakresu. Jak? +klucz - zakres
  3. Rzutowanie jawne:
      • (int) tekst - wartość Kodu ASCII dla zmiennej tekst
      • (char) tekst - znak Kodu ASCII dla zmiennej tekst
      • (char) ((int) tekst) - znak wartości Kodu ASCII dla zmiennej tekst

Przykład 1

//*************************************************************************

//           PROGRAM WCZYTUJE Z KLAWIATURY TEKST O MAKSYMALNEJ DŁUGOŚCI 30

//          ZNAKÓW. TEKST WPROWADZA SIĘ DUŻYMI LITERAMI ALFABETU

//               - szyfruje wprowadzony tekst

//               - czyni to wykorzystując szyfrowanie z kluczem według SZYFRU CEZARA

//               - wyświetla tekst po zaszyfrowaniu

//*************************************************************************

 

#include<iostream>

 

using namespace std;

 

 int main()

 {

               

   char tekst[31];     // tablica na tekst do szyfrowania

                                 //  31 element jest na znacznik końca tekstu '\0'           

   int klucz;              // zmienna na wczytanie rozmiaru klucza

   int i=0;                 // indeks elementu w tablicy tekst[31]

 

   

    cout<<"Podaj tekst do zaszyfrowania"<<endl;

    cin>>tekst;

    cout<<endl<<"Podaj wartosc klucza"<<endl;

    cin>>klucz;

    

    klucz=klucz%26;     // liter jest 26 czyli od A=65 do Z=90, obliczono: 90-65+1=26

    

  while(tekst[i]!='\0')

  {     

        if ( (int) tekst[i] + klucz > 90 )

            tekst[i]=(char)( (int)tekst[i]+klucz-26 );

      else

           tekst[i]=(char)((int)tekst[i]+klucz);     

      i++;

  } 

  

  cout<<endl<<tekst;

 

cin.get();

cin.ignore();

return 0;

 

 }