On Tue, 2007-11-27 at 12:07 +0100, Lidia Fernández wrote: > But....whe i type the command 'openssl enc -a -aes128 -in file.txt -out > file.enc -pass pass:1234567' > i don't specify the iv....and in the sample code there is: > > unsigned char iv[] = {1,2,3,4,5,6,7,8}; > > > EVP_EncryptInit_ex(&ctx, EVP_bf_cbc(), NULL, key, iv); > > > I have to do the same that the command do. > How can i do this??? I've attached simply AES, one block, encryption example. After compiling with: $ gcc -Wall -pedantic -o aes_enc -lcrypto aes_enc.c you may run: $ ./aes_enc > enc.bin then you will be able to decrypt enc.bin file with command: $ openssl aes-256-cbc -in enc.bin -K 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -iv 000102030405060708090A0B0C0D0E0F -d
When you use -pass from openssl command line key and iv are created with function EVP_BytesToKey() (which is not very portable). This function create required key of required length (depending of encryption algorithm, for example 8 bytes for DES, 24 bytes for 3DES) and IV of required length (for example 8 bytes for DES and 16 bytes for AES). If you really want to use this command you need to use EVP_BytesToKey() in your application to create key and iv and next use this values in EVP_* routines. You may check what key/iv is created with command: $ openssl enc -pass pass:1234 -P -e -aes128 salt=EF7D13C559AD9627 key=015A121AD247476F2C4D8BA860A1B1F5 iv =2A68BE602670D12C69B95CF5072BFA79 Best regards, -- Marek Marcola <[EMAIL PROTECTED]>
#include <stdio.h> #include <string.h> #include <openssl/aes.h> int main(int argc, char *argv[]) { unsigned char key16[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; unsigned char key24[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23}; unsigned char key32[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; unsigned char iv[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; unsigned char inbuf[1024]="marek\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a"; unsigned char outbuf[1024]; AES_KEY aeskey; memset(outbuf, 0, sizeof(outbuf)); AES_set_encrypt_key(key32, 32*8, &aeskey); AES_cbc_encrypt(inbuf, outbuf, 16, &aeskey, iv, AES_ENCRYPT); fwrite(outbuf, 1, 16, stdout); return(0); }