Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Coded by Hashbang
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdint.h>
- #include <limits.h>
- #define LEN 1000
- void cifrare(unsigned char testo[], unsigned char chiave[], char file[]);
- void decifrare(char file[LEN], unsigned char chiave[]);
- unsigned char rotl(unsigned char valore, unsigned int inc);
- unsigned char rotr(unsigned char valore, unsigned int inc);
- int main(){
- int i, menu=0;
- unsigned char testo[LEN];
- unsigned char chiave[LEN];
- unsigned char file[LEN];
- do{
- system("clear");
- printf("\t***********************");
- printf("\n\t* *");
- printf("\n\t* Codifica ROT *");
- printf("\n\t* *");
- printf("\n\t***********************");
- printf("\n\nMenu:\n1) Cifrare testo\n2) Decifrare testo\n3) Esci\n");
- printf("\nInserisci il numero corrispondente all'opzione: ");
- scanf("%d",&menu);
- switch(menu){
- case 1:
- // Cifratura
- getchar();
- printf("\nInserisci messaggio: ");
- fgets(testo,LEN,stdin);
- printf("\nInserisci password: ");
- fgets(chiave,LEN,stdin);
- printf("\nInserisci nome file: ");
- fgets(file,LEN,stdin);
- // Controllo nome file
- for(i=strlen(file); i>0; --i){
- if(file[i-1] == 10 || file[i-1] == 13){
- file[i-1] = '\0';
- }
- }
- cifrare(testo,chiave,file);
- break;
- case 2:
- // Decifratura
- getchar();
- printf("\nInserisci nome file cifrato: ");
- fgets(file,LEN,stdin);
- printf("\nInserisci password: ");
- fgets(chiave,LEN,stdin);
- // Controllo nome file
- for(i=strlen(file); i>0; --i){
- if(file[i-1] == 10 || file[i-1] == 13){
- file[i-1] = '\0';
- }
- }
- decifrare(file,chiave);
- break;
- case 3:
- // Uscita
- printf("\n");
- exit(0);
- }
- printf("\nVuoi tornare al menu precedente? (Si = 1 || No = 0): ");
- scanf("%d",&menu);
- }while(menu == 1);
- return 0;
- }
- void cifrare(unsigned char testo[], unsigned char chiave[], char file[]){
- long long int i;
- unsigned int lenTesto = strlen(testo);
- unsigned int lenChiave = strlen(chiave);
- unsigned char carattereTesto, carattereChiave;
- unsigned char cifrato[LEN];
- // Cifratura
- if(lenChiave % 2 == 0){
- // se la lunghezza della chiave è pari
- for(i=0; i<lenTesto; i++){
- carattereTesto = testo[i];
- carattereChiave = chiave[i%lenChiave];
- cifrato[i] = rotr(carattereTesto,carattereChiave);
- }
- }else{
- // se la lunghezza della chiave è dispari
- for(i=0; i<lenTesto; i++){
- carattereTesto = testo[i];
- carattereChiave = chiave[i%lenChiave];
- cifrato[i] = rotl(carattereTesto,carattereChiave);
- }
- }
- printf("\n\t***Scrittura su file***\n");
- FILE *scrittura = fopen(file,"w");
- if(scrittura == NULL){
- perror("\nError");
- exit(1);
- }
- for(i=0; i<lenTesto; i++){
- fprintf(scrittura,"%x ",cifrato[i]);
- //printf("%02x ",cifrato[i]);
- }
- fclose(scrittura);
- // libero la memoria dalla passwd in chiaro
- for(i=0; i<lenChiave; i++){
- chiave[i] = 0;
- }
- // libero la memoria dal testo in chiaro
- for(i=0; i<lenTesto; i++){
- testo[i] = 0;
- }
- return ;
- }
- void decifrare(char file[LEN], unsigned char chiave[]){
- long long int i=0, lenCifrato, lenChiave=strlen(chiave);
- unsigned char carattereTesto, carattereChiave;
- unsigned char cifrato[LEN];
- unsigned char decifrato[LEN];
- FILE *lettura = fopen(file,"r");
- if(lettura == NULL){
- perror("\nError");
- exit(1);
- }
- while(!feof(lettura)){
- fscanf(lettura,"%x ",&cifrato[i]);
- //printf("%02x ", mist[i]);
- i++;
- }
- fclose(lettura);
- lenCifrato = i;
- // Decifratura
- if(lenChiave % 2 == 0){
- // se la lunghezza della chiave è pari
- for(i=0; i<lenCifrato; i++){
- carattereTesto = cifrato[i];
- carattereChiave = chiave[i%lenChiave];
- decifrato[i] = rotl(carattereTesto,carattereChiave);
- }
- }else{
- // se la lunghezza della chiave è dispari
- for(i=0; i<lenCifrato; i++){
- carattereTesto = cifrato[i];
- carattereChiave = chiave[i%lenChiave];
- decifrato[i] = rotr(carattereTesto,carattereChiave);
- }
- }
- decifrato[lenCifrato] = '\0';
- printf("\n\nTesto decifrato:\n\n%s\n", decifrato);
- // libero la memoria dalla passwd in chiaro
- for(i=0; i<lenChiave; i++){
- chiave[i] = 0;
- }
- // libero la memoria dal testo in chiaro
- for(i=0; i<lenCifrato; i++){
- decifrato[i] = 0;
- }
- return ;
- }
- unsigned char rotl(unsigned char valore, unsigned int inc){
- const unsigned int mask = CHAR_BIT*sizeof(valore) - 1;
- inc &= mask;
- return (valore << inc) | (valore >> (-inc & mask));
- }
- unsigned char rotr(unsigned char valore, unsigned int inc){
- const unsigned int mask = CHAR_BIT*sizeof(valore) - 1;
- inc &= mask;
- return (valore >> inc) | (valore << (-inc & mask));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement