1 #include <stdio.h>
2 #include <openssl/evp.h>
3 #include <openssl/rand.h>
4
5 void hexdump(unsigned char *data, int len)
6 {
7 int i = 0;
8 for ( i = 0; i < len; i++)
9 {
10 printf("%02x", data[i]);
11 }
12 printf("\n");
13
14 }
15
16 void select_random_key(char *key, int b)
17 {
18 RAND_bytes(key, b);
19 }
20
21 void select_random_iv(char *iv, int b)
22 {
23 RAND_bytes(iv, b);
24 }
25
26 char *dec_from_file(unsigned char *file_path, unsigned char *key, unsigned char *iv)
27 {
28 EVP_CIPHER_CTX *ctx = NULL;
29 unsigned char final [EVP_MAX_BLOCK_LENGTH];
30 char *ret = NULL, *data = NULL;
31 int i, tmp, ol;
32 ol = 0;
33 FILE *fp = NULL;
34
35 ctx = EVP_CIPHER_CTX_new();
36 EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);
37 fp = fopen(file_path, "rb");
38 fseek(fp, 0, SEEK_END);
39 unsigned long len = ftell(fp);
40 fseek(fp, 0, SEEK_SET);
41 data = (char *)malloc(len + 1);
42 fread(data, sizeof(char), len, fp);
43 ret = (char *)malloc(len + EVP_CIPHER_CTX_block_size(ctx) - 1);
44 hexdump(data, len);
45 EVP_DecryptUpdate(ctx, ret, &ol, data, len);
46 EVP_DecryptFinal(ctx, final, &i);
47
48 printf("ol= %d \n", ol);
49 EVP_CIPHER_CTX_cleanup(ctx);
50 return ret;
51 }
52
53 char *dec(char *data, int inl, unsigned char *key, unsigned char *iv)
54 {
55 EVP_CIPHER_CTX *ctx = NULL;
56 unsigned char final [EVP_MAX_BLOCK_LENGTH];
57 ctx = EVP_CIPHER_CTX_new();
58 EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);
59
60 char *ret = NULL;
61 int i, tmp, ol;
62 ol = 0;
63 ret = (char *)malloc(inl + EVP_CIPHER_CTX_block_size(ctx) - 1);
64
65 EVP_DecryptUpdate(ctx, ret, &ol, data, inl);
66
67 EVP_DecryptFinal(ctx, final, &i);
68
69 EVP_CIPHER_CTX_cleanup(ctx);
70 return ret;
71 }
72
73 char *enc(char *in, int inl, int *out_len, unsigned char *key, unsigned char *iv)
74 {
75 EVP_CIPHER_CTX *ctx = NULL;
76 ctx = EVP_CIPHER_CTX_new();
77 EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);
78
79 char *ret = NULL;
80 int i, tmp, ol;
81 ol = 0;
82 ret = (char *)malloc(inl + EVP_CIPHER_CTX_block_size(ctx));
83 #define ONETIME 96
84 for ( i = 0; i < inl / ONETIME; i++)
85 {
86 EVP_EncryptUpdate(ctx, &ret[ol], &tmp, &in[ol], ONETIME);
87 ol += tmp;
88 }
89
90 if (inl % ONETIME) {
91 EVP_EncryptUpdate(ctx, &ret[ol], &tmp, &in[ol], inl % ONETIME);
92 ol += tmp;
93 }
94
95 EVP_EncryptFinal_ex(ctx, &ret[ol], &tmp);
96 ol = ol+tmp;
97
98 FILE *fp = fopen("./enc.out", "w");
99 fwrite(ret, ol, 1, fp);
100 fclose(fp);
101 *out_len = ol;
102 EVP_CIPHER_CTX_cleanup(ctx);
103 return ret;
104 }
105
106 void main(void)
107 {
108 unsigned char key [EVP_MAX_KEY_LENGTH];
109 unsigned char iv [EVP_MAX_IV_LENGTH];
110 select_random_key(key, EVP_MAX_KEY_LENGTH);
111 select_random_iv(iv, EVP_MAX_IV_LENGTH);
112 char *enc_data = NULL, *dec_data = NULL;
113 int enc_len = 0;
114 unsigned char *in = "Change ssleay_rand_bytes (crypto/rand/md_rand.c) to avoid a SSLeay/OpenSSL PRNG weakness pointed out by Markku-Juhani O. Saarinen <markku-juhani.saarinen@nokia.com>: PRNG state recovery was possible based on the output of one PRNG request appropriately sized to gain knowledge onfollowed by enough consecutive 1-byte PRNG requests to traverse all ofChange ssleay_rand_bytes (crypto/rand/md_rand.c) to avoid a SSLeay/OpenSSL PRNG weakness pointed out by Markku-Juhani O. Saarinen <markku-juhani.saarinen@nokia.com>: PRNG state recovery was possible based on the output of one PRNG request appropriately sized to gain knowledge onfollowed by enough consecutive 1-byte PRNG requests to traverse all of";
115
116 //hexdump(key, EVP_MAX_KEY_LENGTH);
117 //hexdump(iv, EVP_MAX_IV_LENGTH);
118
119 // unsigned char *key = "\x54\x0a\xda\xdb\x2b\x8f\xed\x6d\xad\xc7\xb3\x64\xd8\x4f\xa8\x0a\xbf\x0f\x24\xa8\xa8\x5e\x86\x86\x1c\x04\x57\xd5\xee\xcf\xe5\xac\xc9\xaf\x7d\x52\x3c\x6b\xb4\xc4\xee\xd4\x39\xe6\x7d\xdb\x97\x6b\x1c\xea\x19\x25\x29\x88\x38\xf3\x82\xf9\xee\x2a\xb6\x5a\x54\x50";
120 // unsigned char *iv = "\x82\x17\xde\xa5\xac\x85\x21\xc2\xca\xf3\x34\x05\x30\x7d\x89\xec";
121
122 enc_data = enc(in, 698, &enc_len, key ,iv);
123 hexdump(enc_data, enc_len);
124 printf("enc_len:%d\n", enc_len);
125 dec_data = dec(enc_data, enc_len, key ,iv);
126 printf("dec:%s\n", dec_data);
127 dec_data = dec_from_file("./enc.out", key ,iv);
128 printf("dec:%s\n", dec_data);
129 }