Compare commits
	
		
			6 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e3cde4be54 | |||
| 3a2e110ad2 | |||
|   | c68c270dbf | ||
| 957d28ff06 | |||
|   | 52769a7985 | ||
| 0242ed0256 | 
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										16
									
								
								examples/sonnet116.txt
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										16
									
								
								examples/sonnet116.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | Let me not to the marriage of true minds | ||||||
|  | Admit impediments. Love is not love | ||||||
|  | Which alters when it alteration finds, | ||||||
|  | Or bends with the remover to remove: | ||||||
|  | O no! it is an ever-fixed mark | ||||||
|  | That looks on tempests and is never shaken; | ||||||
|  | It is the star to every wandering bark, | ||||||
|  | Whose worth’s unknown, although his height be taken. | ||||||
|  | Love’s not Time’s fool, though rosy lips and cheeks | ||||||
|  | Within his bending sickle’s compass come: | ||||||
|  | Love alters not with his brief hours and weeks, | ||||||
|  | But bears it out even to the edge of doom. | ||||||
|  | If this be error and upon me proved, | ||||||
|  | I never writ, nor no man ever loved.  | ||||||
|  | 
 | ||||||
|  | William Shakespeare | ||||||
							
								
								
									
										2
									
								
								exec.sh
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								exec.sh
									
									
									
									
									
								
							| @ -1,3 +1,3 @@ | |||||||
| #!/bin/sh | #!/bin/sh | ||||||
| 
 | 
 | ||||||
| gcc -Wall src/main.c src/functions.c src/caesar.c src/vigenere.c -o output/main && ./output/main $1 $2 $3 $4 | gcc -Wall src/main.c src/functions.c src/caesar.c src/vigenere.c src/polybius.c -o main && ./main $1 $2 $3 $4 | ||||||
|  | |||||||
							
								
								
									
										25
									
								
								src/caesar.c
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										25
									
								
								src/caesar.c
									
									
									
									
									
								
							| @ -1,31 +1,6 @@ | |||||||
| #include "caesar.h" | #include "caesar.h" | ||||||
| 
 | 
 | ||||||
| #define BUFFER_SIZE 128 |  | ||||||
| 
 | 
 | ||||||
| /*
 |  | ||||||
|  This function read the file block by block until the end of it |  | ||||||
|  */ |  | ||||||
| int readFile(FILE *f, int *size, char *buffer){ |  | ||||||
|     int index = 0; |  | ||||||
|     char c; |  | ||||||
|     int end = 0; |  | ||||||
| 
 |  | ||||||
|     do{ |  | ||||||
|         c = fgetc(f); |  | ||||||
|         buffer[index] = c; |  | ||||||
|         index++; |  | ||||||
|         *size += 1; |  | ||||||
| 
 |  | ||||||
|         // End of the file, we stop it
 |  | ||||||
|         if (c == EOF){ |  | ||||||
|             buffer[index - 1] = '\0'; |  | ||||||
|             index = BUFFER_SIZE; |  | ||||||
|             end = 1; |  | ||||||
|         } |  | ||||||
|     }while(index < BUFFER_SIZE); |  | ||||||
| 
 |  | ||||||
|     return end; |  | ||||||
| } |  | ||||||
| /*
 | /*
 | ||||||
| 	s -> path source | 	s -> path source | ||||||
| 	d -> path destination | 	d -> path destination | ||||||
|  | |||||||
| @ -6,7 +6,6 @@ | |||||||
| #include "functions.h" | #include "functions.h" | ||||||
| 
 | 
 | ||||||
| /* Functions */ | /* Functions */ | ||||||
| int foo(FILE *, int *, char *); |  | ||||||
| int cryptCaesar(const char *, const char *, const int); | int cryptCaesar(const char *, const char *, const int); | ||||||
| int decryptCaesar(const char *, const char *, const int); | int decryptCaesar(const char *, const char *, const int); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -12,12 +12,35 @@ int fileExist(const char *path) { | |||||||
| 	FILE *f=NULL; | 	FILE *f=NULL; | ||||||
| 	f=fopen(path,"r"); | 	f=fopen(path,"r"); | ||||||
| 
 | 
 | ||||||
| 	if(f==NULL){ | 	if(f==NULL) | ||||||
| 		return -1; | 		return -1; | ||||||
| 	} |  | ||||||
| 	fclose(f); | 	fclose(f); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | /*
 | ||||||
|  |  This function read the file block by block until the end of it | ||||||
|  |  */ | ||||||
|  | int readFile(FILE *f, int *size, char *buffer){ | ||||||
|  |     int index = 0; | ||||||
|  |     char c; | ||||||
|  |     int end = 0; | ||||||
|  | 
 | ||||||
|  |     do{ | ||||||
|  |         c = fgetc(f); | ||||||
|  |         buffer[index] = c; | ||||||
|  |         index++; | ||||||
|  |         *size += 1; | ||||||
|  | 
 | ||||||
|  |         // End of the file, we stop it
 | ||||||
|  |         if (c == EOF){ | ||||||
|  |             buffer[index - 1] = '\0'; | ||||||
|  |             index = BUFFER_SIZE; | ||||||
|  |             end = 1; | ||||||
|  |         } | ||||||
|  |     }while(index < BUFFER_SIZE); | ||||||
|  | 
 | ||||||
|  |     return end; | ||||||
|  | } | ||||||
| /*
 | /*
 | ||||||
| 	path -> path source | 	path -> path source | ||||||
| 	This function copy all characters of the file in the buffer | 	This function copy all characters of the file in the buffer | ||||||
|  | |||||||
| @ -5,8 +5,11 @@ | |||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| 
 | 
 | ||||||
|  | #define BUFFER_SIZE 4096 | ||||||
|  | 
 | ||||||
| /* Functions */ | /* Functions */ | ||||||
| void usage(); | void usage(); | ||||||
|  | int readFile(FILE *, int *, char *); | ||||||
| int fileExist(const char *path); | int fileExist(const char *path); | ||||||
| int copyFile(const char *path, char *buffer); | int copyFile(const char *path, char *buffer); | ||||||
| int addDataToFile(const char *data, const char *path); | int addDataToFile(const char *data, const char *path); | ||||||
|  | |||||||
							
								
								
									
										22
									
								
								src/main.c
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										22
									
								
								src/main.c
									
									
									
									
									
								
							| @ -1,6 +1,7 @@ | |||||||
| #include "functions.h" | #include "functions.h" | ||||||
| #include "caesar.h" | #include "caesar.h" | ||||||
| #include "vigenere.h" | #include "vigenere.h" | ||||||
|  | #include "polybius.h" | ||||||
| 
 | 
 | ||||||
| int main(int argc, char *argv[]) { | int main(int argc, char *argv[]) { | ||||||
|     int error = 0; |     int error = 0; | ||||||
| @ -14,7 +15,7 @@ int main(int argc, char *argv[]) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Check kind of encryption
 |     // Check kind of encryption
 | ||||||
|     for(i = 0; i < 3; i++){ |     for(i = 0; i < 4; i++){ | ||||||
|         if(strcmp(argv[1], options[i]) == 0) |         if(strcmp(argv[1], options[i]) == 0) | ||||||
|             error++; |             error++; | ||||||
|     } |     } | ||||||
| @ -100,7 +101,24 @@ int main(int argc, char *argv[]) { | |||||||
|     } |     } | ||||||
|     // Polybius square
 |     // Polybius square
 | ||||||
|     else if(strcmp(argv[1], "-s") == 0){ |     else if(strcmp(argv[1], "-s") == 0){ | ||||||
|  |         char key[26]; | ||||||
|  |         int res; | ||||||
| 
 | 
 | ||||||
|  |         printf("Your key: "); | ||||||
|  |         scanf("%s", key); | ||||||
|  | 
 | ||||||
|  |         if (strlen(key) > 26){ | ||||||
|  |             printf("Your key is too big. Choose a small one\n"); | ||||||
|  |             return -1;     | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if(strcmp(hook, "crypt") == 0) | ||||||
|  |             res = cryptPolybius(fileSrc, fileDst, key); | ||||||
|  |         else | ||||||
|  |             res = decryptPolybius(fileSrc, fileDst, key); | ||||||
|  | 
 | ||||||
|  |         if (res != 0) | ||||||
|  |             printf("Failed to crypt/decrypt the file\n"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* Display error */ |     /* Display error */ | ||||||
| @ -111,7 +129,5 @@ int main(int argc, char *argv[]) { | |||||||
|      */ |      */ | ||||||
| 
 | 
 | ||||||
|     free(fileDst); |     free(fileDst); | ||||||
|     //free(buffer);
 |  | ||||||
|     //free(data);
 |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										174
									
								
								src/polybius.c
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										174
									
								
								src/polybius.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,174 @@ | |||||||
|  | #include "polybius.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | int cryptPolybius(const char *filenameSrc, const char *filenameDst, const char *key){ | ||||||
|  |     char polybius[POLYBIUS_SIZE][POLYBIUS_SIZE]; | ||||||
|  |     FILE *f = NULL, *fDst = NULL; | ||||||
|  |     char data[BUFFER_SIZE]; | ||||||
|  |     char dataEncrypted[BUFFER_SIZE]; | ||||||
|  |     int size = 0, end = 0, i = 0, j = 0; | ||||||
|  |     char c = 0; | ||||||
|  | 
 | ||||||
|  |     generateSquarePolybius(polybius, key); | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < POLYBIUS_SIZE; i++){ | ||||||
|  |         for (j = 0; j < POLYBIUS_SIZE; j++) | ||||||
|  |             printf("%c ", polybius[i][j]); | ||||||
|  |         printf("\n"); | ||||||
|  |     } | ||||||
|  |     // Open the file
 | ||||||
|  |     f = fopen(filenameSrc, "r+"); | ||||||
|  |     if (f == NULL) return -1; | ||||||
|  | 
 | ||||||
|  |     fDst = fopen(filenameDst, "w"); | ||||||
|  |     if (fDst == NULL) { | ||||||
|  |         fclose(f); | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |     do { | ||||||
|  |         end = readFile(f, &size, data); | ||||||
|  | 
 | ||||||
|  | 	    /********* Encryption **********/ | ||||||
|  |         for (i = 0; i < size; i++){ | ||||||
|  |             if (data[i] >= 'a' && data[i] <= 'z') | ||||||
|  |                 c = data[i] - 32; | ||||||
|  |             else c = data[i]; | ||||||
|  | 
 | ||||||
|  |             for (j = 0; j < POLYBIUS_SIZE; j++){ | ||||||
|  |                 for (int x = 0; x < POLYBIUS_SIZE; x++){ | ||||||
|  |                     if (c == polybius[j][x]){ | ||||||
|  |                        fputc(j + '0', fDst); | ||||||
|  |                        fputc(x + '0', fDst); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if (c == '\n' || c == ' '){ | ||||||
|  |                 fputc(c, fDst); | ||||||
|  |                 fputc(0, fDst); // For having a couple of number
 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         size = 0;  | ||||||
|  |         memset(data, 0, BUFFER_SIZE); | ||||||
|  |         memset(dataEncrypted, 0, BUFFER_SIZE); | ||||||
|  |     }while(end != 1); | ||||||
|  | 
 | ||||||
|  | 	/* Close files */ | ||||||
|  |     fclose(f); | ||||||
|  |     fclose(fDst); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | int decryptPolybius(const char *filenameSrc, const char *filenameDst, const char *key){ | ||||||
|  |     char polybius[POLYBIUS_SIZE][POLYBIUS_SIZE]; | ||||||
|  |     FILE *f = NULL, *fDst = NULL; | ||||||
|  |     char data[BUFFER_SIZE]; | ||||||
|  |     char dataEncrypted[BUFFER_SIZE]; | ||||||
|  |     int size = 0, end = 0, i = 0, j = 0; | ||||||
|  | 
 | ||||||
|  |     generateSquarePolybius(polybius, key); | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < POLYBIUS_SIZE; i++){ | ||||||
|  |         for (j = 0; j < POLYBIUS_SIZE; j++) | ||||||
|  |             printf("%c ", polybius[i][j]); | ||||||
|  |         printf("\n"); | ||||||
|  |     } | ||||||
|  |     // Open the file
 | ||||||
|  |     f = fopen(filenameSrc, "r+"); | ||||||
|  |     if (f == NULL) return -1; | ||||||
|  | 
 | ||||||
|  |     fDst = fopen(filenameDst, "w"); | ||||||
|  |     if (fDst == NULL) { | ||||||
|  |         fclose(f); | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |     do { | ||||||
|  |         end = readFile(f, &size, data); | ||||||
|  | 
 | ||||||
|  | 	    /********* Decryption **********/ | ||||||
|  |         for (i = 0; i < size; i += 2){ | ||||||
|  |             if (data[i] >= 48 && data[i] <= 53) { | ||||||
|  |                 int c1 = data[i] - '0'; | ||||||
|  |                 int c2 = data[i+1] - '0'; | ||||||
|  |                 char c = polybius[c1][c2]; | ||||||
|  |                 printf("%c", c); | ||||||
|  |                 fputc(c, fDst); | ||||||
|  |             } | ||||||
|  |             else{ | ||||||
|  |                 printf("%c", data[i]); | ||||||
|  |                 fputc(data[i], fDst); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         size = 0;  | ||||||
|  |         memset(data, 0, BUFFER_SIZE); | ||||||
|  |         memset(dataEncrypted, 0, BUFFER_SIZE); | ||||||
|  |     }while(end != 1); | ||||||
|  | 
 | ||||||
|  | 	/* Close files */ | ||||||
|  |     fclose(f); | ||||||
|  |     fclose(fDst); | ||||||
|  |     return 0; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | /*
 | ||||||
|  |  This function fill the polybius square | ||||||
|  |  */ | ||||||
|  | static void fillSquare(int pos, int *posPolybius, char *p, char polybius[POLYBIUS_SIZE][POLYBIUS_SIZE]){ | ||||||
|  |     for (int i = 0; i < POLYBIUS_SIZE; i++){ | ||||||
|  |         polybius[pos][i] = p[*(posPolybius)]; | ||||||
|  |         *posPolybius = *posPolybius + 1; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | static int findKeyInSquare(const char *polybius, char c){ | ||||||
|  |     // We exclude the 'J' character
 | ||||||
|  |     for (int i = 0; i < ALPHABET_SIZE - 1; i++) | ||||||
|  |         if (c == polybius[i]) | ||||||
|  |             return 1; | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | /*
 | ||||||
|  |  This function generate the polybius square | ||||||
|  |  */ | ||||||
|  | void generateSquarePolybius(char polybius[POLYBIUS_SIZE][POLYBIUS_SIZE], const char *key){ | ||||||
|  |     char a[ALPHABET_SIZE - 1] = {0}; // The size is 25, we exclude the J character
 | ||||||
|  | 
 | ||||||
|  |     int pos = 0; | ||||||
|  |     for (int i = 0; i < strlen(key); i++){ | ||||||
|  |         char k; | ||||||
|  |         if (key[i] >= 'a' && key[i] <= 'z') | ||||||
|  |             k = key[i] - 32; // 32 = 26 + special characters
 | ||||||
|  |         else k = key[i]; | ||||||
|  |         int res = findKeyInSquare(a, k); | ||||||
|  |         if (res == 0) | ||||||
|  |             a[pos++] = k; | ||||||
|  |     } | ||||||
|  |     int n = 0; | ||||||
|  |     int t = pos; | ||||||
|  |     for (int i = pos; i < ALPHABET_SIZE + pos; i++){ | ||||||
|  |         char c = 'A' + n; | ||||||
|  |         if (c == 'J'){ | ||||||
|  |             // We check if I is in the array, if yes, we do not add it
 | ||||||
|  |         } | ||||||
|  |         /*if (c == 'I'){
 | ||||||
|  |             // We check if J is in the array, is yes, we do not add it
 | ||||||
|  |             int res = findKeyInSquare(a, 'J'); | ||||||
|  |             // J not in the array, we add it
 | ||||||
|  |             if (res == 0){ | ||||||
|  |                 a[t++] = 'A'; | ||||||
|  |             } | ||||||
|  |         }*/ | ||||||
|  |         if (c != 'J'){ | ||||||
|  |             int res = findKeyInSquare(a, c); | ||||||
|  | 
 | ||||||
|  |             if (res == 0) | ||||||
|  |                 a[t++] = c; | ||||||
|  |         } | ||||||
|  |         n++; | ||||||
|  |     } | ||||||
|  |     pos = 0; | ||||||
|  |     fillSquare(0, &pos, a, polybius);      | ||||||
|  |     fillSquare(1, &pos, a, polybius);      | ||||||
|  |     fillSquare(2, &pos, a, polybius);      | ||||||
|  |     fillSquare(3, &pos, a, polybius);      | ||||||
|  |     fillSquare(4, &pos, a, polybius);      | ||||||
|  | } | ||||||
							
								
								
									
										15
									
								
								src/polybius.h
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										15
									
								
								src/polybius.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | |||||||
|  | #ifndef H_POLYBIUS | ||||||
|  | #define H_POLYBIUS | ||||||
|  | 
 | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include "functions.h" | ||||||
|  | 
 | ||||||
|  | #define POLYBIUS_SIZE 5 | ||||||
|  | #define ALPHABET_SIZE 26 | ||||||
|  | 
 | ||||||
|  | int cryptPolybius(const char *, const char *, const char *); | ||||||
|  | int decryptPolybius(const char *, const char *, const char *); | ||||||
|  | void generateSquarePolybius(char polybius[5][5], const char *); | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user