Advertisement
Guest User

tesyt.c

a guest
Oct 15th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.14 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <openssl/conf.h>
  6. #include <openssl/evp.h>
  7. #include <openssl/err.h>
  8.  
  9. #define LUNG_MAX 100
  10.  
  11. void handleErrors(void);
  12. int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,
  13.             unsigned char *iv, unsigned char *ciphertext);
  14. int decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,
  15.             unsigned char *iv, unsigned char *plaintext);
  16.  
  17. void string2hex(char* cuv, char* rezultat, int lungime)
  18. {
  19.     for (int i = 0, j = 0; i < lungime; ++i, j += 4)
  20.     {
  21.         sprintf(rezultat + j,"\\x");
  22.         sprintf(rezultat + j + 2, "%02x", cuv[i] & 0xff);
  23.     }
  24.     int dimensiune_hex=strlen(rezultat)-1;
  25.     for(int i=0,j=dimensiune_hex+1;  i<16-lungime; i++,j+=4)
  26.         sprintf(rezultat+j,"\\x20");
  27. }
  28.  
  29. void hex2string(char* cuv, char* rezultat, int lungime)
  30. {
  31.     char intermediar[100]="";
  32.     char parte[3]="";
  33.     for(int i = 2,j=0;i<lungime;i+=4,j++)
  34.     {
  35.         strncpy(parte,cuv+i,2);
  36.         strcat(intermediar,parte);
  37.     }
  38.     int len = strlen(intermediar);
  39.         for (int i = 0, j = 0; j < len; ++i, j += 2)
  40.     {
  41.         int val[1];
  42.         sscanf(intermediar + j, "%2x", val);
  43.         rezultat[i] = val[0];
  44.         rezultat[i + 1] = '\0';
  45.     }
  46. }
  47.  
  48. int main (void)
  49. {
  50.     FILE *fisier = fopen("dict.txt", "r");
  51.         char cuvant[LUNG_MAX];
  52.         long contor = 0;
  53.     int dimensiune=0;
  54.         while(fgets(cuvant, sizeof cuvant, fisier) != NULL )
  55.     {
  56.         contor++;
  57.     }
  58.     do
  59.     {
  60.         rewind(fisier);
  61.         srand((unsigned) time(NULL));
  62.         int numar = rand()%contor+1;
  63.         for(int i =0; i<numar;i++)
  64.         {
  65.             fgets(cuvant, sizeof cuvant, fisier);
  66.         }
  67.         dimensiune= strlen(cuvant)-1;
  68.     }while(dimensiune>=16);
  69.     printf("%s\n",cuvant);
  70.         printf("%i\n",dimensiune);
  71.     char hex[100]="";
  72.     char cuvant_intors[100]="";
  73.     string2hex(cuvant,hex,dimensiune);
  74.     int dimensiune_hex=strlen(hex)-1;
  75.     hex2string(hex,cuvant_intors,dimensiune_hex);
  76.     printf("'%s' in hex is %s.\n", cuvant, hex);
  77.     printf("'%s' in string is %s.\n", hex, cuvant_intors);
  78.  
  79.  
  80.     unsigned char *key = (unsigned char *)hex;
  81. unsigned char *keyfals = (unsigned char *)"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f";
  82.     unsigned char *iv = (unsigned char *)"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f";
  83.    
  84.  
  85. unsigned char *plaintext =
  86.         (unsigned char *)"TOMA E INVIDIOS PE PROGRAMUL MEU";
  87.  
  88.     unsigned char ciphertext[128];
  89.  
  90.     unsigned char decryptedtext[128];
  91.  
  92.     int decryptedtext_len, ciphertext_len;
  93.  
  94.     printf("KEY: %s\n",key);
  95.  
  96.     ciphertext_len = encrypt (plaintext, strlen ((char *)plaintext), key, iv,
  97.                               ciphertext);
  98.  
  99.     printf("Ciphertext is:\n");
  100.     BIO_dump_fp (stdout, (const char *)ciphertext, ciphertext_len);
  101.     rewind(fisier);
  102.         int semafor=0;
  103.         contor=0;
  104.     while(fgets(cuvant, sizeof cuvant, fisier) != NULL&&semafor==0 )
  105.         {
  106.             contor++;
  107.             dimensiune= strlen(cuvant)-1;
  108.             string2hex(cuvant,hex,dimensiune);
  109.             dimensiune_hex=strlen(hex)-1;
  110.             decryptedtext_len = decrypt(ciphertext, ciphertext_len, (unsigned char*)hex, iv,decryptedtext);
  111.             printf("%i",decryptedtext_len);
  112.             semafor=1;
  113.             if(decryptedtext_len==-1||decryptedtext_len==47)
  114.             {
  115.                 semafor=0;
  116.             }
  117.             else
  118.             {
  119.                 printf("\n%s %i\n",cuvant, dimensiune);
  120.                 hex2string(hex,cuvant_intors,dimensiune_hex);
  121.                 printf("%s.\n",(unsigned char*)hex);
  122.             }
  123.         }
  124.     decryptedtext[decryptedtext_len] = '\0';
  125.  
  126.     printf("Decrypted text is:\n");
  127.     printf("%s\n", decryptedtext);
  128.  
  129.     fclose(fisier);
  130.     return 0;
  131. }
  132.  
  133. void handleErrors(void)
  134. {
  135.     ERR_print_errors_fp(stderr);
  136.     abort();
  137. }
  138.  
  139. int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,
  140.             unsigned char *iv, unsigned char *ciphertext)
  141. {
  142.     EVP_CIPHER_CTX *ctx;
  143.  
  144.     int len;
  145.  
  146.     int ciphertext_len;
  147.  
  148.     /* Create and initialise the context */
  149.     if(!(ctx = EVP_CIPHER_CTX_new()))
  150.         handleErrors();
  151.  
  152.     if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))
  153.         handleErrors();
  154.  
  155.     if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
  156.         handleErrors();
  157.     ciphertext_len = len;
  158.  
  159.     if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))
  160.         handleErrors();
  161.     ciphertext_len += len;
  162.  
  163.     EVP_CIPHER_CTX_free(ctx);
  164.  
  165.     return ciphertext_len;
  166. }
  167.  
  168.  
  169. int decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,
  170.             unsigned char *iv, unsigned char *plaintext)
  171. {
  172.     EVP_CIPHER_CTX *ctx;
  173.     int trash=0;
  174.     int len;
  175.  
  176.     int plaintext_len;
  177.  
  178.     /* Create and initialise the context */
  179.     if(!(ctx = EVP_CIPHER_CTX_new()))
  180.         handleErrors();
  181.     int unu=EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
  182.     if(1 != unu)
  183.        trash++;
  184.    int doi=EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len);
  185.     if(1 != doi)
  186.   trash++;
  187.     plaintext_len = len;
  188.      int trei=EVP_DecryptFinal_ex(ctx, plaintext + len, &len);
  189.     if(1 != trei)
  190.        trash++;
  191.     plaintext_len += len;
  192.     memset(plaintext + plaintext_len, 0, plaintext_len);
  193.     EVP_CIPHER_CTX_free(ctx);
  194. if(trei==0)
  195. return -1;
  196.     return plaintext_len;
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement