Created
January 20, 2016 21:52
-
-
Save karpie28/de065a1953209cd7c117 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<iostream> | |
#include<math.h> | |
#include<string.h> | |
#include<stdlib.h> | |
#include<cstdio> | |
#include<fstream> | |
using namespace std; | |
long int p, q, n, t, read, flag, e[100], d[100], temp[100], j, m[100], en[100], i; | |
char msg[100]; | |
int pierwsza(long int);//Sprawdzenie, czy liczba jest pierwsza. | |
void ce();//Oblicza wartosc e. | |
long int cd(long int); // Oblicza wartosc d. | |
void encrypt(); //Fukcja szyfrujaca. | |
void decrypt(); //Funkcja deszyfrujaca. | |
//Wywolanie glownego programu. | |
int main() | |
{ | |
fstream file("input.txt", ios::in); | |
fstream binfile("output.bin", ios::binary | ios::out | ios::trunc); | |
cout << "Podaj pierwsza liczbe pierwsza: " << endl; | |
cin >> p; | |
flag = pierwsza(p); | |
if (flag == 0) | |
{ | |
cout << "Liczba nie jest pierwsza." << endl; | |
return(1); | |
} | |
cout << "Podaj druga liczbe pierwsza: " << endl; | |
cin >> q; | |
flag = pierwsza(q); | |
if (flag == 0 || p == q) | |
{ | |
cout << "Liczba nie jest pierwsza."; | |
return(1); | |
} | |
cout << "Podaj co chcesz zrobić:"<< endl; | |
cout << "1: Wczytaj z pliku"<<endl;; | |
cout << "2: Wczytaj z klawiatury" << endl; | |
cin >> read; | |
if(read==1){ | |
if (file.good()==false) | |
{ | |
cout << "plik nie istnieje"; | |
exit (0); | |
} | |
file >> msg; | |
} | |
if(read==2){ | |
cout << "Podaj wiadomosc do zaszyfrowania: " << endl; | |
cin >> msg; | |
} | |
for (i = 0; msg[i] != NULL; i++) m[i] = msg[i]; | |
n = p * q; | |
t = (p - 1) * (q - 1); | |
ce(); | |
encrypt(); | |
decrypt(); | |
file.close(); | |
return 0; | |
} | |
//Sprawdzam, czy liczba jest pierwsza. | |
int pierwsza(long int n) | |
{ | |
j = sqrt(n); | |
for (int i= 2; i <= j; i++) | |
{ | |
if (n % i == 0) | |
return 0; | |
} | |
return 1; | |
} | |
//Obliczanie wartosci e. | |
void ce() | |
{ | |
int k; | |
k = 0; | |
for (i = 2; i < t; i++) | |
{ | |
if (t % i == 0) | |
continue; | |
flag = pierwsza(i); | |
if (flag == 1 && i != p && i != q) | |
{ | |
e[k] = i; | |
flag = cd(e[k]); | |
if (flag > 0) | |
{ | |
d[k] = flag; | |
k++; | |
} | |
if (k == 99) | |
break; | |
} | |
} | |
} | |
//Obliczanie wartosci d. | |
long int cd(long int x) | |
{ | |
long int k = 1; | |
while (1) | |
{ | |
k = k + t; | |
if (k % x == 0) | |
return (k / x); | |
} | |
} | |
// Funkcja szyfrujaca. | |
void encrypt() | |
{ | |
long int pt, ct, key = e[0],k, len; | |
fstream binfile("output.bin", ios::binary | ios::out | ios::trunc); | |
i = 0; | |
len = strlen(msg); | |
while (i != len) | |
{ | |
pt = m[i]; | |
pt = pt - 96; | |
k = 1; | |
for (j = 0; j < key; j++) | |
{ | |
k = k * pt; // t^e | |
k = k % n; // mod n | |
} | |
temp[i] = k; | |
ct = k + 96; | |
en[i] = ct; | |
i++; | |
} | |
en[i] = -1; | |
cout << endl << "Zakodowana wiadomosc: " << endl; | |
for (i = 0; en[i] != -1; i++) | |
printf("%c", en[i]); | |
cout << endl; | |
binfile.write(reinterpret_cast<char*>(&en), sizeof(en)); | |
binfile.close(); | |
} | |
// Funkcja deszyfrujaca. | |
void decrypt() | |
{ | |
long int pt, ct, key = d[0], k; | |
i = 0; | |
while (en[i] != -1) | |
{ | |
ct = temp[i]; | |
k = 1; | |
for (j = 0; j < key; j++) | |
{ | |
k = k * ct; // c^d | |
k = k % n; // mod n | |
} | |
pt = k + 96; | |
m[i] = pt; | |
i++; | |
} | |
m[i] = -1; | |
cout << "Odkodowana wiadomosc: "; | |
for (i = 0; m[i] != -1; i++) | |
printf("%c", m[i]); | |
cout << endl; | |
} | |
// pt - tymczasowa zmienna |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment