Advertisement
Guest User

Cifrario ROT

a guest
Dec 11th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.59 KB | None | 0 0
  1. // Coded by Hashbang
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <stdint.h>
  6. #include <limits.h>
  7.  
  8. #define LEN 1000
  9.  
  10. void cifrare(unsigned char testo[], unsigned char chiave[], char file[]);
  11. void decifrare(char file[LEN], unsigned char chiave[]);
  12. unsigned char rotl(unsigned char valore, unsigned int inc);
  13. unsigned char rotr(unsigned char valore, unsigned int inc);
  14.  
  15. int main(){
  16.     int i, menu=0;
  17.     unsigned char testo[LEN];
  18.     unsigned char chiave[LEN];
  19.     unsigned char file[LEN];
  20.  
  21.     do{
  22.         system("clear");
  23.         printf("\t***********************");
  24.         printf("\n\t*                     *");
  25.         printf("\n\t*    Codifica ROT     *");
  26.         printf("\n\t*                     *");
  27.         printf("\n\t***********************");
  28.         printf("\n\nMenu:\n1) Cifrare testo\n2) Decifrare testo\n3) Esci\n");
  29.         printf("\nInserisci il numero corrispondente all'opzione: ");
  30.         scanf("%d",&menu);
  31.  
  32.         switch(menu){
  33.             case 1:
  34.             // Cifratura
  35.             getchar();
  36.             printf("\nInserisci messaggio: ");
  37.             fgets(testo,LEN,stdin);
  38.    
  39.             printf("\nInserisci password: ");
  40.             fgets(chiave,LEN,stdin);
  41.            
  42.             printf("\nInserisci nome file: ");
  43.             fgets(file,LEN,stdin);
  44.            
  45.             // Controllo nome file
  46.             for(i=strlen(file); i>0; --i){
  47.                 if(file[i-1] == 10 || file[i-1] == 13){
  48.                     file[i-1] = '\0';
  49.                 }
  50.             }
  51.        
  52.             cifrare(testo,chiave,file);
  53.        
  54.             break;
  55.        
  56.             case 2:
  57.             // Decifratura
  58.             getchar();
  59.             printf("\nInserisci nome file cifrato: ");
  60.             fgets(file,LEN,stdin);
  61.            
  62.             printf("\nInserisci password: ");
  63.             fgets(chiave,LEN,stdin);
  64.            
  65.             // Controllo nome file
  66.             for(i=strlen(file); i>0; --i){
  67.                 if(file[i-1] == 10 || file[i-1] == 13){
  68.                     file[i-1] = '\0';
  69.                 }
  70.             }
  71.            
  72.             decifrare(file,chiave);
  73.            
  74.             break;
  75.            
  76.             case 3:
  77.             // Uscita
  78.             printf("\n");
  79.             exit(0);
  80.         }
  81.    
  82.         printf("\nVuoi tornare al menu precedente? (Si = 1 || No = 0): ");
  83.         scanf("%d",&menu);
  84.    
  85.     }while(menu == 1);
  86.    
  87.     return 0;
  88. }
  89.  
  90.  
  91. void cifrare(unsigned char testo[], unsigned char chiave[], char file[]){
  92.     long long int i;
  93.     unsigned int lenTesto = strlen(testo);
  94.     unsigned int lenChiave = strlen(chiave);
  95.     unsigned char carattereTesto, carattereChiave;
  96.     unsigned char cifrato[LEN];
  97.    
  98.     // Cifratura
  99.     if(lenChiave % 2 == 0){
  100.         // se la lunghezza della chiave è pari
  101.         for(i=0; i<lenTesto; i++){
  102.             carattereTesto = testo[i];
  103.             carattereChiave = chiave[i%lenChiave];
  104.             cifrato[i] = rotr(carattereTesto,carattereChiave);
  105.         }
  106.     }else{
  107.         // se la lunghezza della chiave è dispari
  108.         for(i=0; i<lenTesto; i++){
  109.             carattereTesto = testo[i];
  110.             carattereChiave = chiave[i%lenChiave];
  111.             cifrato[i] = rotl(carattereTesto,carattereChiave);
  112.         }
  113.     }
  114.    
  115.     printf("\n\t***Scrittura su file***\n");
  116.    
  117.     FILE *scrittura = fopen(file,"w");
  118.     if(scrittura == NULL){
  119.         perror("\nError");
  120.         exit(1);
  121.     }
  122.    
  123.     for(i=0; i<lenTesto; i++){
  124.         fprintf(scrittura,"%x ",cifrato[i]);
  125.         //printf("%02x ",cifrato[i]);
  126.     }
  127.    
  128.     fclose(scrittura);
  129.    
  130.     // libero la memoria dalla passwd in chiaro
  131.     for(i=0; i<lenChiave; i++){
  132.         chiave[i] = 0;
  133.     }
  134.     // libero la memoria dal testo in chiaro
  135.     for(i=0; i<lenTesto; i++){
  136.         testo[i] = 0;
  137.     }
  138.    
  139.     return ;
  140. }
  141.  
  142. void decifrare(char file[LEN], unsigned char chiave[]){
  143.     long long int i=0, lenCifrato, lenChiave=strlen(chiave);
  144.     unsigned char carattereTesto, carattereChiave;
  145.     unsigned char cifrato[LEN];
  146.     unsigned char decifrato[LEN];
  147.    
  148.     FILE *lettura = fopen(file,"r");
  149.     if(lettura == NULL){
  150.         perror("\nError");
  151.         exit(1);
  152.     }
  153.    
  154.     while(!feof(lettura)){
  155.         fscanf(lettura,"%x ",&cifrato[i]);
  156.         //printf("%02x ", mist[i]);
  157.         i++;
  158.     }
  159.    
  160.     fclose(lettura);
  161.    
  162.     lenCifrato = i;
  163.  
  164.     // Decifratura
  165.     if(lenChiave % 2 == 0){
  166.         // se la lunghezza della chiave è pari
  167.         for(i=0; i<lenCifrato; i++){
  168.             carattereTesto = cifrato[i];
  169.             carattereChiave = chiave[i%lenChiave];
  170.             decifrato[i] = rotl(carattereTesto,carattereChiave);
  171.         }
  172.     }else{
  173.         // se la lunghezza della chiave è dispari
  174.         for(i=0; i<lenCifrato; i++){
  175.             carattereTesto = cifrato[i];
  176.             carattereChiave = chiave[i%lenChiave];
  177.             decifrato[i] = rotr(carattereTesto,carattereChiave);
  178.         }
  179.     }
  180.  
  181.     decifrato[lenCifrato] = '\0';
  182.    
  183.     printf("\n\nTesto decifrato:\n\n%s\n", decifrato);
  184.    
  185.     // libero la memoria dalla passwd in chiaro
  186.     for(i=0; i<lenChiave; i++){
  187.         chiave[i] = 0;
  188.     }
  189.     // libero la memoria dal testo in chiaro
  190.     for(i=0; i<lenCifrato; i++){
  191.         decifrato[i] = 0;
  192.     }
  193.    
  194.     return ;
  195. }
  196.  
  197. unsigned char rotl(unsigned char valore, unsigned int inc){
  198.     const unsigned int mask = CHAR_BIT*sizeof(valore) - 1;
  199.     inc &= mask;
  200.     return (valore << inc) | (valore >> (-inc & mask));
  201. }
  202.  
  203. unsigned char rotr(unsigned char valore, unsigned int inc){
  204.     const unsigned int mask = CHAR_BIT*sizeof(valore) - 1;
  205.     inc &= mask;
  206.     return (valore >> inc) | (valore << (-inc & mask));
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement