Commit 193a5ab1 authored by Pavel Grega's avatar Pavel Grega
Browse files

Add new file

parent 140d2e16
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include "playfair.h"
char* playfair_encrypt(const char* key, const char* text){
if(key==NULL || text==NULL)
return NULL;
if(strlen(key)==0 || strlen(text)==0)
return NULL;
int counter_medzier=0;
for(int i=0; i<strlen(key);i++){
if(key[i]==' '){
counter_medzier++;
}
}
if(counter_medzier==strlen(key)){
return NULL;
}
char abeceda[26]={"ABCDEFGHIJKLMNOPQRSTUVXYZ"};
char kluc[5][5] = {
{' ', ' ', ' ', ' ',' '},
{' ', ' ', ' ', ' ',' '},
{' ', ' ', ' ', ' ',' '},
{' ', ' ', ' ', ' ',' '},
{' ', ' ', ' ', ' ',' '}
};
// vytvorenie pola cez adresu co obsahuje parameter key
char* dest = (char*) calloc(strlen(key)+ 1, sizeof(char));
for(int i=0; key[i] != '\0'; i++){
dest[i] = (char)toupper(key[i]);
}
size_t len=strlen(dest);
for(size_t i=0;i<len;i++){
if(dest[i]==' ' || isalpha(dest[i])){
counter_medzier++;
continue;
}
else{
free(dest);
dest=NULL;
return NULL;
}
}
for(int i=0;i<len;i++){
if(dest[i]=='w'||dest[i]=='W'){
dest[i]='V';
}
}
// premena rovnakych pismen na medzery
for(size_t i=len-1;i>0;i--){
for(int j=0;j<i;j++){
if(dest[i]==dest[j]){
dest[i]=' ';
}
}
}
// presunutie medzier na koniec slova
for(int c=0;c<len-1;c++){
for(size_t i=len-1;i>0;i--){
if(dest[i-1]==' ' && dest[i]!=' '){
char tmp=dest[i];
dest[i]=' ';
dest[i-1]=tmp;
}
}
}
// naplnenie matice sifrovacieho kluca
int counter=0;
int counter2=0;
for(int y=0; y<5; y++){
for(int x=0; x<5; x++){
if(counter<len && dest[counter]!=' '){
kluc[y][x]=dest[counter];
counter++;
}
else{
int counter3=0;
for(int z=0; z<len;z++){
if(abeceda[counter2]!=dest[z]){
counter3++;
}
}
if(counter3==len){
kluc[y][x]=abeceda[counter2];
}
else{
if(x>0)
x--;
else{
y--;
x=4;
}
}
counter2++;
}
}
}
size_t lan = strlen(text);
char* desttext = (char*) calloc(lan+300, sizeof(char));
int counterx=0;
for(int i=0; text[i] != '\0'; i++){
desttext[i] = (char)toupper(text[i]);
counterx++;
}
for(int i=counterx;i<(299+lan); i++){
desttext[i] = ' ';
}
size_t len1 = strlen(desttext);
for(size_t i=0;i<len1;i++){
if(desttext[i]=='w'||desttext[i]=='W'){
desttext[i]='V';
}
}
// posunutie medzier na koniec slova
for(int c=0;c<len1-1;c++){
for(size_t i=len1-1;i>0;i--){
if(desttext[i]!= ' ' && desttext[i-1]==' '){
char tmp=desttext[i];
desttext[i]=' ';
desttext[i-1]=tmp;
}
}
}
// chcem pridat X po dvojiciach zlava
for(int i=0;i<len1; i++){
if(desttext[i]!= ' ' && desttext[i]==desttext[i+1] && desttext[i]!='X'){
for(size_t v=len1-2; v>i;v--){
char tmp=desttext[v];
desttext[v+1]=tmp;
}
desttext[i+2]=desttext[i];
desttext[i+1]='X';
}
i++;
}
// pridanie X na konci ak je neparny pocet
int countery=0;
for(int i=0;desttext[i]!=' ';i++){
countery++;
}
int q=countery%2;
if(q==1)
desttext[countery]='X';
// vytvorenie poli so suradnicami textu v kluci
int countx[300];
int county[300];
for(int i=0;desttext[i]!=' ';i++){
for(int y=0; y<5; y++){
for(int x=0; x<5; x++){
if(desttext[i]==kluc[y][x]){
county[i]=y;
countx[i]=x;
}
}
}
}
// posunutie medzier na koniec slova
for(int c=0;c<len1-1;c++){
for(size_t i=len1-1;i>0;i--){
if(desttext[i]!= ' ' && desttext[i-1]==' '){
char tmp=desttext[i];
desttext[i]=' ';
desttext[i-1]=tmp;
}
}
}
// sifrovanie
for(int i=0;desttext[i]!=' ';i++){
if(desttext[i]==desttext[i+1] && desttext[i]=='X'){
if(county[i]==4){
county[i]=-1;
}
if(county[i+1]==4){
county[i+1]=-1;
}
desttext[i]=kluc[county[i]+1][countx[i]];
desttext[i+1]=kluc[county[i+1]+1][countx[i+1]];
}
else if(county[i]==county[i+1]){
if(countx[i]==4){
countx[i]=-1;
}
if(countx[i+1]==4){
countx[i+1]=-1;
}
desttext[i]=kluc[county[i]][countx[i]+1];
desttext[i+1]=kluc[county[i]][countx[i+1]+1];
}
else if(countx[i]==countx[i+1]){
if(county[i]==4){
county[i]=-1;
}
if(county[i+1]==4){
county[i+1]=-1;
}
desttext[i]=kluc[county[i]+1][countx[i]];
desttext[i+1]=kluc[county[i+1]+1][countx[i+1]];
}
else{
desttext[i]=kluc[county[i]][countx[i+1]];
desttext[i+1]=kluc[county[i+1]][countx[i]];
}
i++;
}
// rozdelenie sifrovaneho textu na dvojice
for(int i=0;i<len1-3; i++){
if(desttext[i+2]!= ' '){
for(size_t v=len1-2; v>i+1;v--){
char tmp=desttext[v];
desttext[v+1]=tmp;
}
desttext[i+2]=' ';
}
i++;i++;
}
// pridanie terminatora
size_t p=1;
for(size_t i=len1-1;i>0;i--){
if(desttext[i]==desttext[i+1] && desttext[i]==desttext[i+2] && desttext[i]==' '){
p=i;
}
}
desttext[p]='\0';
// vypis matice
/* for(int y=0; y<5;y++){
for(int x=0; x<5;x++){
printf("%c",kluc[y][x]);
}
printf("\n");
}*/
free(dest);
dest = NULL;
return desttext;
}
char* playfair_decrypt(const char* key, const char* text){
if(key==NULL || text==NULL)
return NULL;
if(strlen(key)==0 || strlen(text)==0)
return NULL;
int counter_medzier=0;
for(int i=0; i<strlen(key);i++){
if(key[i]==' '){
counter_medzier++;
}
}
if(counter_medzier==strlen(key)){
return NULL;
}
for(int i=0;i<strlen(key);i++){
if(key[i]==' ' || isalpha(key[i])){
continue;
}
else{
return NULL;
}
}
for(int i=0;i<strlen(text);i++){
if(text[i]=='w' || text[i]=='W'){
return NULL;
}
}
char abeceda[26]={"ABCDEFGHIJKLMNOPQRSTUVXYZ"};
char kluc[5][5] = {
{' ', ' ', ' ', ' ',' '},
{' ', ' ', ' ', ' ',' '},
{' ', ' ', ' ', ' ',' '},
{' ', ' ', ' ', ' ',' '},
{' ', ' ', ' ', ' ',' '}
};
char* dest = (char*) calloc(strlen(key) + (size_t) 1, sizeof(char));
for(int i=0; key[i] != '\0'; i++){
dest[i] = (char)toupper(key[i]);
}
size_t len=strlen(dest);
for(int i=0;i<len;i++){
if(dest[i]=='w'||dest[i]=='W'){
dest[i]='V';
}
}
// premena rovnakych pismen na medzery
for(size_t i=len-1;i>0;i--){
for(int j=0;j<i;j++){
if(dest[i]==dest[j]){
dest[i]=' ';
}
}
}
// presunutie medzier na koniec slova
for(int c=0;c<len-1;c++){
for(size_t i=len-1;i>0;i--){
if(dest[i-1]==' ' && dest[i]!=' '){
char tmp=dest[i];
dest[i]=' ';
dest[i-1]=tmp;
}
}
}
// naplnenie matice sifrovacieho kluca
int counter=0;
int counter2=0;
for(int y=0; y<5; y++){
for(int x=0; x<5; x++){
if(counter<len && dest[counter]!=' '){
kluc[y][x]=dest[counter];
counter++;
}
else{
int counter3=0;
for(int z=0; z<len;z++){
if(abeceda[counter2]!=dest[z]){
counter3++;
}
}
if(counter3==len){
kluc[y][x]=abeceda[counter2];
}
else{
if(x>0)
x--;
else{
y--;
x=4;
}
}
counter2++;
}
}
}
// vypisanie matice
for(int y=0; y<5;y++){
for(int x=0; x<5;x++){
printf("%c",kluc[y][x]);
}
printf("\n");
}
char* desttext = (char*) calloc(strlen(text)+300, sizeof(char));
for(int i=0; text[i] != '\0'; i++){
desttext[i] = (char)toupper(text[i]);
}
int countx[300];
int county[300];
for(int i=0;i<strlen(desttext);i++){
for(int y=0; y<5; y++){
for(int x=0; x<5; x++){
if(desttext[i]==kluc[y][x]){
county[i]=y;
countx[i]=x;
}
}
}
}
// int y0=county[0];int y1=county[1];
// int x0=countx[0];int x1=countx[1];
// printf("%d %d\n",y0,y1);
// printf("%d %d\n",x0,x1);
// printf("%s\n",desttext);
for(int i=0;i<strlen(desttext);i++){
if(desttext[i]==desttext[i+1]){
desttext[i]='X';
desttext[i+1]='X';
}
else if(county[i]==county[i+1]){
if(countx[i]==0){
countx[i]=5;
}
if(countx[i+1]==0){
countx[i+1]=5;
}
desttext[i]=kluc[county[i]][countx[i]-1];
desttext[i+1]=kluc[county[i]][countx[i+1]-1];
}
else if(countx[i]==countx[i+1]){
if(county[i]==0){
county[i]=5;
}
if(county[i+1]==0){
county[i+1]=5;
}
desttext[i]=kluc[county[i]-1][countx[i]];
desttext[i+1]=kluc[county[i+1]-1][countx[i+1]];
}
else{
desttext[i]=kluc[county[i]][countx[i+1]];
desttext[i+1]=kluc[county[i+1]][countx[i]];
}
i++;i++;
}
// posunutie medzier na koniec slova
for(int c=0;c<strlen(desttext)-1;c++){
for(size_t i=strlen(desttext)-1;i>0;i--){
if(desttext[i-1]==' ' && desttext[i]!=' '){
char tmp=desttext[i];
desttext[i]=' ';
desttext[i-1]=tmp;
}
}
}
// pridanie terminatora
int p=1;
for(int i=strlen(desttext)-1;i>0;i--){
if(desttext[i]==' '){
p=i;
}
}
desttext[p]='\0';
free(dest);
dest=NULL;
return desttext;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment