algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Szyfr Vigenere`a - Implementacja w C/C++
Ocena użytkownikóww: *****  / 18
SłabyŚwietny
Nadesłany przez Krzysztof Maćkowiak, 17 sierpnia 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

vigener_c/Vigeners.cpp:
//Program szyfrujacy tekst z pliku za pomoca algorytmu Vigenere`a
//Program pobrano ze strony www.algorytm.org
//Opracowal Krzysztof Mackowiak

#include<stdio.h>
#include<iostream.h>
#include <math.h>

//W przypadku gdy szyfrowany tekst lub haslo posiadaja dlugosc > niz 200 znakow nalezy
//powiekszyc rozmiar tablic: tablica_ASCII, haslo.
void main()
{
FILE *we, *wy;
int i, licznik;
int tablica_ASCII[200]; //przechowywane beda w niej wartosci liter odpowiadajace poszczegolnym literom w hasle
char znak;	 //znak odczytany z pliku
char haslo[200]; //tablica, w ktorej przechowywane bedzie haslo
//Przed uruchomieniem programu nalezy utworzyc 2 pliki - 1. z tekstem jawnym, 2. pusty na t.zaszyfrowany
char plik_jawny[20];  //nazwa pliku z tekstem jawnym
char plik_zaszyfrowany[20];  //nazwa pliku z tekstem zaszyfrownym
for (i=0; i<200; i++)	//wypelnienie tablicy pustymi znakami
    haslo[i]=42;

cout<<"Podaj nazwe pliku, ktorego tresc ma zostac zaszyfrowana: " ;
cin>>plik_jawny;
cout<<"Podaj nazwe pliku wynikowego: ";
cin>>plik_zaszyfrowany;
cout<<"Podaj haslo tylko duze litery, bez spacji i znakow specjalnych: " ;
cin>>haslo;

int pozycja=0;
for (i=0; i<200; i++)
   if (haslo[pozycja]!=42)
      {
	tablica_ASCII[i]=haslo[pozycja];      //wypelnienie tablicy_ASCII wartosciami
	pozycja++;
      }
   else
       {
	pozycja=0;                           //gdy skonczy sie haslo nalezy wczytywac je znowu od poczatku
	i--;
	tablica_ASCII[i]=haslo[pozycja];
	pozycja++;
      }

for (i=0; i<200; i++)           //po odjeciu wartosci 64 w tablicy_ASCII mamy wartosci o, ktore rowne sa przesunieciu jakie musi byc wykonane
     tablica_ASCII[i]-=65;


licznik=0;

if((we=fopen(plik_jawny,"rb"))!=NULL)	 //otwieranie pliku 1. do odczytu - oba pliki musza istniec
{
if((wy=fopen(plik_zaszyfrowany,"wb"))!=NULL)  //otwieranie pliku 2. do zapisu
{
   while((znak=getc(we))!=EOF)	 //pobieranie znaku z pliku 1. tak dlugo az nie nastapi znak konca pliku
   //Kazdy odczytywany znak wg kodow ASCII jest przydzielany do 2 grup duze litery, male litery
	   {
		if ((znak>=65)&&(znak<=90))
		     {
			znak-=65;
			znak+=tablica_ASCII[licznik];    //przesuniecie w prawo zgodnie z litera hasla
			if(licznik==200)  //w przypadkugdy tekst bedzie dluzszy niz 200 znakow nalezy pobierac znaki hasla od poczatku tablicy
			   licznik=0;    
			else
			   licznik++;
			znak=fmod(znak,26);
			znak+=65;
			putc(znak,wy);
		     }
		 else if ((znak>=97)&&(znak<=122))
		     {
			znak-=97;
			znak+=tablica_ASCII[licznik];
			if(licznik==200)
			   licznik=0;
			else
			   licznik++;
			znak=fmod(znak,26);
			znak+=97;
			putc(znak,wy);
		     }
		}
      
fclose(wy);
 }
fclose(we);
 }
cout<<"Szyfrowanie zostalo zakonczone";
return;
}

vigener_c/Vigenerd.cpp:
//Program deszyfrujacy tekst z pliku za pomoca algorytmu Vigenere`a
//Program pobrano ze strony www.algorytm.org
//Opracowal Krzysztof Mackowiak

#include<stdio.h>
#include<iostream.h>
#include <math.h>

void main()
{
FILE *we, *wy;
int i, licznik;
int tablica_ASCII[200];        //przechowywane beda w niej wartosci liter odpowiadajace poszczegolnym literom w hasle
char znak;                     //znak odczytany z pliku
char haslo[200];               //tablica, w ktorej przechowywane bedzie haslo 
//Przed uruchomieniem programu nalezy utworzyc 2 pliki - 1. z tekstem zaszyfrowanym, 2. pusty na t.jawny
char plik_jawny[20];          //nazwa pliku z tekstem jawnym
char plik_zaszyfrowany[20];   //nazwa pliku z tekstem zaszyfrownym
for (i=0; i<200; i++)         //wypelnienie tablicy pustymi znakami
    haslo[i]=42;

cout<<"Podaj nazwe pliku, ktorego tresc ma zostac odszyfrowana: " ;
cin>>plik_zaszyfrowany;
cout<<"Podaj nazwe pliku wynikowego: ";
cin>>plik_jawny;
cout<<"Podaj haslo tylko duze litery, bez spacji i znakow specjalnych: " ;
cin>>haslo;

int pozycja=0;
for (i=0; i<200; i++)
   if (haslo[pozycja]!=42)
      {
      	tablica_ASCII[i]=haslo[pozycja];      //wypelnienie tablicy_ASCII wartosciami
	pozycja++;
      }
   else
       {
	pozycja=0;                           //haslo wpisywane jest cyklicznie
        i--;
      	tablica_ASCII[i]=haslo[pozycja];
	pozycja++;
      }

for (i=0; i<200; i++)                       //po odjeciu wartosci 64 otrzymujemy wartosc przesuniecia
     tablica_ASCII[i]-=65;


licznik=0;

if((we=fopen(plik_zaszyfrowany,"rb"))!=NULL)    //otwieranie pliku 1. do odczytu - oba pliki musza istniec
{
if((wy=fopen(plik_jawny,"wb"))!=NULL)  //otwieranie pliku 2. do zapisu
{
   while((znak=getc(we))!=EOF)   //pobieranie znaku z pliku 1. tak dlugo az nie nastapi znak konca pliku
   //Kazdy odczytywany znak wg kodow ASCII jest przydzielany do 2 grup duze litery, male litery
	   {
		if ((znak>=65)&&(znak<=90))
		     {
			znak-=65;
			znak-=tablica_ASCII[licznik];   //przesuniecie w lewo wedlug znaku hasla
			if(licznik==200)                //w przypadku gdyby tekst byl dluzszy niz 200 liter wtedy haslo bedzie pobierane od poczatku
			   licznik=0;
                        else
			   licznik++;
			if (znak<0)                     
			     znak=26-fabs(znak);
			znak+=65;
			putc(znak,wy);
		     }
		 else if ((znak>=97)&&(znak<=122))
		     {
			znak-=97;
			znak-=tablica_ASCII[licznik];
			if(licznik==200)
			   licznik=0;
                        else
			   licznik++;
			if (znak<0)
			     znak=26-fabs(znak);
			znak+=97;
			putc(znak,wy);
		     }
	}
      
fclose(wy);
 }
fclose(we);
 }
cout<<"Deszyfrowanie zostalo zakonczone";
return;
}
Dodaj komentarz