Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #include <openssl/conf.h>
- #include <openssl/evp.h>
- #include <openssl/err.h>
- #define LUNG_MAX 100
- void handleErrors(void);
- int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,
- unsigned char *iv, unsigned char *ciphertext);
- int decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,
- unsigned char *iv, unsigned char *plaintext);
- void string2hex(char* cuv, char* rezultat, int lungime)
- {
- for (int i = 0, j = 0; i < lungime; ++i, j += 4)
- {
- sprintf(rezultat + j,"\\x");
- sprintf(rezultat + j + 2, "%02x", cuv[i] & 0xff);
- }
- int dimensiune_hex=strlen(rezultat)-1;
- for(int i=0,j=dimensiune_hex+1; i<16-lungime; i++,j+=4)
- sprintf(rezultat+j,"\\x20");
- }
- void hex2string(char* cuv, char* rezultat, int lungime)
- {
- char intermediar[100]="";
- char parte[3]="";
- for(int i = 2,j=0;i<lungime;i+=4,j++)
- {
- strncpy(parte,cuv+i,2);
- strcat(intermediar,parte);
- }
- int len = strlen(intermediar);
- for (int i = 0, j = 0; j < len; ++i, j += 2)
- {
- int val[1];
- sscanf(intermediar + j, "%2x", val);
- rezultat[i] = val[0];
- rezultat[i + 1] = '\0';
- }
- }
- int main (void)
- {
- FILE *fisier = fopen("dict.txt", "r");
- char cuvant[LUNG_MAX];
- long contor = 0;
- int dimensiune=0;
- while(fgets(cuvant, sizeof cuvant, fisier) != NULL )
- {
- contor++;
- }
- do
- {
- rewind(fisier);
- srand((unsigned) time(NULL));
- int numar = rand()%contor+1;
- for(int i =0; i<numar;i++)
- {
- fgets(cuvant, sizeof cuvant, fisier);
- }
- dimensiune= strlen(cuvant)-1;
- }while(dimensiune>=16);
- printf("%s\n",cuvant);
- printf("%i\n",dimensiune);
- char hex[100]="";
- char cuvant_intors[100]="";
- string2hex(cuvant,hex,dimensiune);
- int dimensiune_hex=strlen(hex)-1;
- hex2string(hex,cuvant_intors,dimensiune_hex);
- printf("'%s' in hex is %s.\n", cuvant, hex);
- printf("'%s' in string is %s.\n", hex, cuvant_intors);
- unsigned char *key = (unsigned char *)hex;
- unsigned char *keyfals = (unsigned char *)"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f";
- unsigned char *iv = (unsigned char *)"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f";
- unsigned char *plaintext =
- (unsigned char *)"TOMA E INVIDIOS PE PROGRAMUL MEU";
- unsigned char ciphertext[128];
- unsigned char decryptedtext[128];
- int decryptedtext_len, ciphertext_len;
- printf("KEY: %s\n",key);
- ciphertext_len = encrypt (plaintext, strlen ((char *)plaintext), key, iv,
- ciphertext);
- printf("Ciphertext is:\n");
- BIO_dump_fp (stdout, (const char *)ciphertext, ciphertext_len);
- rewind(fisier);
- int semafor=0;
- contor=0;
- while(fgets(cuvant, sizeof cuvant, fisier) != NULL&&semafor==0 )
- {
- contor++;
- dimensiune= strlen(cuvant)-1;
- string2hex(cuvant,hex,dimensiune);
- dimensiune_hex=strlen(hex)-1;
- decryptedtext_len = decrypt(ciphertext, ciphertext_len, (unsigned char*)hex, iv,decryptedtext);
- printf("%i",decryptedtext_len);
- semafor=1;
- if(decryptedtext_len==-1||decryptedtext_len==47)
- {
- semafor=0;
- }
- else
- {
- printf("\n%s %i\n",cuvant, dimensiune);
- hex2string(hex,cuvant_intors,dimensiune_hex);
- printf("%s.\n",(unsigned char*)hex);
- }
- }
- decryptedtext[decryptedtext_len] = '\0';
- printf("Decrypted text is:\n");
- printf("%s\n", decryptedtext);
- fclose(fisier);
- return 0;
- }
- void handleErrors(void)
- {
- ERR_print_errors_fp(stderr);
- abort();
- }
- int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,
- unsigned char *iv, unsigned char *ciphertext)
- {
- EVP_CIPHER_CTX *ctx;
- int len;
- int ciphertext_len;
- /* Create and initialise the context */
- if(!(ctx = EVP_CIPHER_CTX_new()))
- handleErrors();
- if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))
- handleErrors();
- if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
- handleErrors();
- ciphertext_len = len;
- if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))
- handleErrors();
- ciphertext_len += len;
- EVP_CIPHER_CTX_free(ctx);
- return ciphertext_len;
- }
- int decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,
- unsigned char *iv, unsigned char *plaintext)
- {
- EVP_CIPHER_CTX *ctx;
- int trash=0;
- int len;
- int plaintext_len;
- /* Create and initialise the context */
- if(!(ctx = EVP_CIPHER_CTX_new()))
- handleErrors();
- int unu=EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
- if(1 != unu)
- trash++;
- int doi=EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len);
- if(1 != doi)
- trash++;
- plaintext_len = len;
- int trei=EVP_DecryptFinal_ex(ctx, plaintext + len, &len);
- if(1 != trei)
- trash++;
- plaintext_len += len;
- memset(plaintext + plaintext_len, 0, plaintext_len);
- EVP_CIPHER_CTX_free(ctx);
- if(trei==0)
- return -1;
- return plaintext_len;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement