openssl 使用AES加和解密密大于一个block的数据

  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 }

 

posted @ 2021-05-25 23:15  癫色深浅入时无  阅读(269)  评论(0)    收藏  举报