Advertisement
kknndd_

Untitled

Mar 9th, 2021
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.90 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdbool.h>
  4. #include <stdlib.h>
  5.  
  6. #include "bmp.h"
  7.  
  8. #define ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  9.  
  10. void index_of_vigenere(const char arr[strlen(ALPHA)][strlen(ALPHA)], char key_char, char text_char, int *x, int *y){
  11.    
  12.     for (int i = 0; i < strlen(ALPHA); i++){
  13.        
  14.         // printf("%c %c \n", arr[i][0], text_char);
  15.        
  16.         if( arr[0][i] == text_char ){
  17.             *x = i;
  18.             break;
  19.         }
  20.  
  21.     }
  22.  
  23.     for (int i = 0; i < strlen(ALPHA); i++){
  24.        
  25.  
  26.         if( arr[i][0] == key_char ){
  27.             *y = i;
  28.             break;
  29.         }
  30.  
  31.     }
  32.    
  33.     // printf("\n");
  34.  
  35. }
  36.  
  37. char vigenere_char_dec(const char arr[strlen(ALPHA)][strlen(ALPHA)], char key_char, char text_char){
  38.  
  39.     int x = 0;
  40.  
  41.     for (int i = 0; i < strlen(ALPHA); i++){
  42.        
  43.         if(arr[0][i] == key_char){
  44.             x = i;
  45.             break;
  46.         }
  47.  
  48.     }
  49.  
  50.     for(int i = 0; i < strlen(ALPHA); i++){
  51.  
  52.  
  53.         if( arr[i][x] == text_char){
  54.             // printf("stlpec: %d   riadok: %d   znak: %c   text: %c  key: %c   dec:%c\n",x,i, arr[i][x], text_char, key_char, arr[i][0]);
  55.             return arr[i][0];
  56.         }
  57.  
  58.     }
  59.  
  60.     return ' ';
  61.  
  62. }
  63.  
  64. char* reverse(const char* text){
  65.  
  66.     if(text == NULL){
  67.         return NULL;
  68.     }
  69.  
  70.     // MIREK
  71.     // KERIM
  72.  
  73.     char *result = calloc(strlen(text)+1, sizeof *text);
  74.     int size = strlen(text);
  75.  
  76.     for (int i = size-1; i >= 0; i--){
  77.  
  78.         if( text[i] >= 'a' && text[i] <= 'z' ){
  79.             result[size-1-i] = text[i] - 32;
  80.         } else {
  81.             result[size-1-i] = text[i];
  82.         }
  83.  
  84.     }
  85.  
  86.     result[strlen(text)] = '\0';
  87.  
  88.     return result;
  89.  
  90. }
  91.  
  92. char* vigenere_encrypt(const char* key, const char* text){
  93.  
  94.     if(key == NULL || text == NULL){
  95.         return NULL;
  96.     }
  97.  
  98.     char vigenere_arr[strlen(ALPHA)][strlen(ALPHA)];
  99.    
  100.     // vygenerovanie matrixu
  101.     for (int i = 0; i < strlen(ALPHA); i++){
  102.         for (int j = 0; j < strlen(ALPHA); j++){
  103.             vigenere_arr[i][j] = ALPHA[i+j >= strlen(ALPHA) ? i+j-strlen(ALPHA) : i+j];
  104.         }    
  105.     }
  106.  
  107.     // for (int i = 0; i < strlen(ALPHA); i++){
  108.     //     for (int j = 0; j < strlen(ALPHA); j++){
  109.     //         printf("%c ", matrix[i][j]);
  110.     //     }    
  111.     //     printf("\n");
  112.     // }
  113.  
  114.     // printf("\n%c\n", vigenere_arr[0][0]);
  115.  
  116.     // oprava kluca
  117.     char right_key[strlen(key)];
  118.    
  119.     int wrong_letters = 0;
  120.    
  121.     for (int i = 0; i < strlen(key); i++){
  122.         if((key[i] >= 'a' && key[i] <= 'z') || (key[i] >= 'A' && key[i] <= 'Z')){
  123.             if(key[i] >= 'a' && key[i] <= 'z'){
  124.                 right_key[i-wrong_letters] = key[i]-32;
  125.             } else {
  126.                 right_key[i-wrong_letters] = key[i];
  127.             }
  128.         } else {
  129.             return NULL;
  130.             wrong_letters++;
  131.         }
  132.     }
  133.  
  134.     right_key[strlen(key) - wrong_letters] = '\0';
  135.  
  136.     if(strlen(right_key) == 0){
  137.         // free(right_key);
  138.         return NULL;
  139.     }
  140.  
  141.     // printf("%s %ld\n", right_key, strlen(right_key));
  142.  
  143.     // prirava textu
  144.     char *encrypt_text = calloc(strlen(text) + 1, sizeof *text);
  145.  
  146.     for(int i = 0, key_pos = 0; i < strlen(text); key_pos++, i++){
  147.        
  148.         // //
  149.         if((text[i] >= 'a' && text[i] <= 'z') || (text[i] >= 'A' && text[i] <= 'Z')){
  150.             if(text[i] >= 'a' && text[i] <= 'z'){
  151.                 encrypt_text[i] = text[i]-32;
  152.             } else {
  153.                 encrypt_text[i] = text[i];
  154.             }
  155.  
  156.             int x, y;
  157.  
  158.             index_of_vigenere(vigenere_arr, right_key[key_pos], encrypt_text[i], &x, &y);
  159.  
  160.             // printf("%d %d %c ", x, y, encrypt_text[i]);
  161.  
  162.             encrypt_text[i] = vigenere_arr[x][y];
  163.  
  164.         } else {
  165.             encrypt_text[i] = text[i];
  166.             key_pos--;
  167.         }
  168.  
  169.         // printf("%d %s %c\n", key_pos, right_key, right_key[key_pos]);
  170.         // printf("%c", encrypt_text[i]);
  171.  
  172.         // automaticke riadenie key_pos
  173.         if(key_pos >= strlen(right_key)-1){
  174.             key_pos = -1;
  175.         }
  176.  
  177.     }
  178.  
  179.     encrypt_text[strlen(text)] = '\0';
  180.  
  181.     return encrypt_text;
  182.  
  183. }
  184.  
  185.  
  186. char* vigenere_decrypt(const char* key, const char* text){
  187.  
  188.     if(key == NULL || text == NULL){
  189.         return NULL;
  190.     }
  191.  
  192.     char vigenere_arr[strlen(ALPHA)][strlen(ALPHA)];
  193.    
  194.     // vygenerovanie matrixu
  195.     for (int i = 0; i < strlen(ALPHA); i++){
  196.         for (int j = 0; j < strlen(ALPHA); j++){
  197.             vigenere_arr[i][j] = ALPHA[i+j >= strlen(ALPHA) ? i+j-strlen(ALPHA) : i+j];
  198.         }    
  199.     }
  200.  
  201.     char right_key[strlen(key)];
  202.    
  203.     int wrong_letters = 0;
  204.    
  205.     for (int i = 0; i < strlen(key); i++){
  206.         if((key[i] >= 'a' && key[i] <= 'z') || (key[i] >= 'A' && key[i] <= 'Z')){
  207.             if(key[i] >= 'a' && key[i] <= 'z'){
  208.                 right_key[i-wrong_letters] = key[i]-32;
  209.             } else {
  210.                 right_key[i-wrong_letters] = key[i];
  211.             }
  212.         } else {
  213.             return NULL;
  214.             wrong_letters++;
  215.         }
  216.     }
  217.  
  218.     right_key[strlen(key) - wrong_letters] = '\0';
  219.  
  220.     if(strlen(right_key) == 0){
  221.         // free(right_key);
  222.         return NULL;
  223.     }
  224.  
  225.     printf("\nKLUC > %s\n", right_key);
  226.  
  227.     char *encrypt_text = calloc(strlen(text) + 1, sizeof *text);
  228.  
  229.     printf("[------]\n");
  230.     for(int i = 0, key_pos = 0; i < strlen(text); key_pos++, i++){
  231.      
  232.         encrypt_text[i] = vigenere_char_dec(vigenere_arr, right_key[key_pos], text[i]);
  233.  
  234.         // printf("%c", vigenere_char_dec(vigenere_arr, right_key[key_pos], text[i]));
  235.  
  236.         if(text[i] == ' '){
  237.             key_pos--;
  238.         }
  239.  
  240.         // automaticke riadenie key_pos
  241.         if(key_pos >= strlen(right_key)-1){
  242.             key_pos = -1;
  243.         }
  244.  
  245.     }
  246.  
  247.     return encrypt_text;    
  248.  
  249. }
  250.  
  251. unsigned char* bit_encrypt(const char* text){
  252.  
  253.     unsigned char *dec = calloc(strlen(text)+1, sizeof *text);
  254.  
  255.     for(int i = 0; i < strlen(text); i++){
  256.         int znak = text[i];
  257.         //
  258.         printf("%d\n", (int)text[i] );
  259.         //
  260.         int bin[] = {0,0,0,0,0,0,0,0};
  261.         //128 64 32 16 8 4 2 1
  262.         for(int j = 0; j < 8; j++){
  263.             if(znak >= 128){
  264.                 znak -= 128;
  265.                 bin[0] = 1;
  266.             } else if(znak >= 64){
  267.                 znak -= 64;
  268.                 bin[1] = 1;
  269.             } else if(znak >= 32){
  270.                 znak -= 32;
  271.                 bin[2] = 1;
  272.             } else if(znak >= 16){
  273.                 znak -= 16;
  274.                 bin[3] = 1;
  275.             } else if(znak >= 8){
  276.                 znak -= 8;
  277.                 bin[4] = 1;
  278.             } else if(znak >= 4){
  279.                 znak -= 4;
  280.                 bin[5] = 1;
  281.             } else if(znak >= 2){
  282.                 znak -= 2;
  283.                 bin[6] = 1;
  284.             } else if(znak >= 1){
  285.                 znak -= 1;
  286.                 bin[7] = 1;
  287.             }
  288.         }
  289.        
  290.         int fbin[2][4];
  291.             fbin[0][0] = bin[1];
  292.             fbin[0][1] = bin[0];
  293.             fbin[0][2] = bin[3];
  294.             fbin[0][3] = bin[2];
  295.            
  296.             fbin[1][0] = bin[4] ^ fbin[0][0];
  297.             fbin[1][1] = bin[5] ^ fbin[0][1];
  298.             fbin[1][2] = bin[6] ^ fbin[0][2];
  299.             fbin[1][3] = bin[7] ^ fbin[0][3];
  300.  
  301.         int temp = 0;
  302.  
  303.         if(fbin[0][0] == 1){
  304.             temp+=128;
  305.         }
  306.         if(fbin[0][1] == 1){
  307.             temp+=64;
  308.         }
  309.         if(fbin[0][2] == 1){
  310.             temp+=32;
  311.         }
  312.         if(fbin[0][3] == 1){
  313.             temp+=16;
  314.         }
  315.         if(fbin[1][0] == 1){
  316.             temp+=8;
  317.         }
  318.         if(fbin[1][1] == 1){
  319.             temp+=4;
  320.         }
  321.         if(fbin[1][2] == 1){
  322.             temp+=2;
  323.         }
  324.         if(fbin[1][3] == 1){
  325.             temp+=1;
  326.         }
  327.  
  328.         dec[i] = (char)temp;
  329.        
  330.     }
  331.  
  332.     return dec;
  333.  
  334. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement