1#include <stdio.h> 2#include <string.h> 3 4#include <openssl/evp.h> 5 6int print_hex(unsigned char *buf, int len) 7{ 8 int i; 9 int n; 10 11 for (i = 0, n = 0; i < len; i++) { 12 if (n > 7) { 13 printf("\n"); 14 n = 0; 15 } 16 printf("0x%02x, ", buf[i]); 17 n++; 18 } 19 printf("\n"); 20 21 return (0); 22} 23 24 25int main(int argc, char *argv[]) 26{ 27 char *pass = "password"; 28 char *salt = "1234"; 29 int ic = 1000; 30 unsigned char key_material[256]; 31 32 unsigned char *key; 33 unsigned char *iv; 34 35 unsigned char inbuf[256]; 36 unsigned char outbuf[256]; 37 int outlen; 38 int n; 39 40 EVP_CIPHER_CTX ctx; 41 42 PKCS5_PBKDF2_HMAC_SHA1(pass, strlen(pass), salt, strlen(salt), ic, 128, key_material); 43 printf("PKCS5_PBKDF2_HMAC_SHA1(\"%s\", \"%s\", %d)=\n", pass, salt, ic); 44 print_hex(key_material, 32); 45 46 key = key_material; 47 //iv = key_material + 8; 48 //iv = key_material + 24; 49 //iv = key_material + 16; 50 //iv = key_material + 24; 51 iv = key_material + 32; 52 53 EVP_CIPHER_CTX_init(&ctx); 54 //EVP_EncryptInit_ex(&ctx, EVP_des_cbc(), NULL, key, iv); 55 //EVP_EncryptInit_ex(&ctx, EVP_des_ede3_cbc(), NULL, key, iv); 56 //EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv); 57 //EVP_EncryptInit_ex(&ctx, EVP_aes_192_cbc(), NULL, key, iv); 58 EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, key, iv); 59 60 printf("\ncipher parameters:\n"); 61 printf(" block size: %d\n", EVP_CIPHER_CTX_block_size(&ctx)); 62 printf(" key length: %d\n", EVP_CIPHER_CTX_key_length(&ctx)); 63 printf(" iv length: %d\n", EVP_CIPHER_CTX_iv_length(&ctx)); 64 65 while (1) { 66 if ((n = fread(inbuf, 1, 128, stdin)) <= 0) { 67 break; 68 } 69 if (!EVP_EncryptUpdate(&ctx, outbuf, &outlen, inbuf, n)) { 70 return (0); 71 } 72 print_hex(outbuf, outlen); 73 } 74 75 if (!EVP_EncryptFinal_ex(&ctx, outbuf, &outlen)) { 76 return (0); 77 } 78 print_hex(outbuf, outlen); 79 80 EVP_CIPHER_CTX_cleanup(&ctx); 81 82 return (0); 83} 84 85