Advertisement
Guest User

Untitled

a guest
Oct 25th, 2016
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <openssl/aes.h>
  5.  
  6. #define CBC 0
  7. #define ECB 1
  8.  
  9. int mode;
  10. int type;
  11. unsigned char vector[AES_BLOCK_SIZE];
  12. int bytes_to_write = AES_BLOCK_SIZE;
  13. unsigned char in[AES_BLOCK_SIZE], out[AES_BLOCK_SIZE];
  14.  
  15. int main(int argc, char** argv) {
  16.  
  17.     //file_in file_out [-encrypt/-decrypt] key [-ecb/-cbc] [vector]
  18.  
  19.     FILE* file_in = fopen(argv[1],"rb");
  20.     if (file_in == NULL) {
  21.         printf("Otwieranie pliku wejsciowego nie powiodlo sie.\n");
  22.         return -1;
  23.     }
  24.  
  25.     FILE* file_out = fopen(argv[2],"wb");
  26.     if (file_out == NULL) {
  27.         printf("Otwieranie pliku wyjsciowego nie powiodlo sie.\n");
  28.         return -1;
  29.     }
  30.  
  31.     if ( strcmp(argv[3],"-encrypt") == 0) {
  32.         mode = AES_ENCRYPT;
  33.     } else if (strcmp(argv[3],"-decrypt") == 0) {
  34.         mode = AES_DECRYPT;
  35.     } else {
  36.         return -1;
  37.     }
  38.  
  39.  
  40.     if ( strcmp(argv[5],"-ecb") == 0) {
  41.         type = ECB;
  42.     } else if (strcmp(argv[5],"-cbc") == 0) {
  43.         type = CBC;
  44.         FILE * vector_file = fopen(argv[6], "rb");
  45.             if (vector_file == NULL) {
  46.                 return -1;
  47.             }
  48.             fread(vector, sizeof(vector), 1, vector_file);
  49.          fclose(vector_file);
  50.     } else {
  51.         return -1;
  52.     }
  53.  
  54.     // AES
  55.     AES_KEY key;
  56.     if (mode == AES_ENCRYPT){
  57.         AES_set_encrypt_key(argv[4],128,&key);
  58.     } else {
  59.         AES_set_decrypt_key(argv[4],128,&key);
  60.     }
  61.  
  62.  
  63.     int i;
  64.     int padding;
  65.     int withoutOne = 0;
  66.     unsigned char in[AES_BLOCK_SIZE], out[AES_BLOCK_SIZE];
  67.     while(1) {
  68.        
  69.         size_t read_bytes = fread(in, 1, AES_BLOCK_SIZE, file_in);
  70.  
  71.         if(read_bytes == 0){
  72.             break;
  73.         }
  74.  
  75.         if(withoutOne && mode == AES_DECRYPT){
  76.             fwrite(out, 1, AES_BLOCK_SIZE, file_out);
  77.         }
  78.  
  79.         withoutOne = 1;
  80.  
  81.         //PKCS7
  82.         if(read_bytes < AES_BLOCK_SIZE){
  83.             if(mode == AES_ENCRYPT){
  84.                 padding = AES_BLOCK_SIZE - read_bytes;
  85.                 printf("Padding-Encrypt: %d\n\n",padding);
  86.                 for(i=read_bytes;i<AES_BLOCK_SIZE; i++){
  87.                     in[i] = padding;       
  88.                 }
  89.             }
  90.         }else{
  91.             padding = 0;
  92.         }
  93.  
  94.         //szyfrowanie
  95.         if (type == CBC){
  96.             AES_cbc_encrypt(in, out, sizeof(in), &key, vector, mode);
  97.         }
  98.  
  99.         if (type == ECB){
  100.             AES_ecb_encrypt(in, out, &key, mode);
  101.         }
  102.  
  103.         if(mode == AES_ENCRYPT){
  104.             fwrite(out, 1, AES_BLOCK_SIZE, file_out);
  105.         }
  106.     }
  107.  
  108.     // jesli nie ma paddingu
  109.     if(mode == AES_ENCRYPT && padding == 0){
  110.         memset(in, AES_BLOCK_SIZE, AES_BLOCK_SIZE);
  111.        
  112.         if (type == CBC){
  113.             AES_cbc_encrypt(in, out, sizeof(in), &key, vector, mode);
  114.         }
  115.  
  116.         if (type == ECB){
  117.             AES_ecb_encrypt(in, out, &key, mode);
  118.         }
  119.         fwrite(out, 1, AES_BLOCK_SIZE, file_out);
  120.     }
  121.  
  122.     if(mode == AES_DECRYPT){
  123.         int omit = AES_BLOCK_SIZE - out[AES_BLOCK_SIZE -1];
  124.         fwrite(out, 1, omit, file_out);
  125.     }
  126.  
  127.     fclose(file_in);
  128.     fclose(file_out);
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement