David, Thank you. Below is my test program. Could you tell me where is wrong? (openssl-0.9.8g, under WidowsXP, VC6++)
void select_random_key(unsigned char *key, int b) { int i; RAND_bytes(key, b); for (i = 0; i < b - 1; i++) printf("%02X:", key[i]); printf("%02X\n", key[b - 1]); } void select_random_iv(unsigned char *iv, int b) { RAND_pseudo_bytes(iv, b); } unsigned char *EncryptTest(unsigned char *in, int inl, unsigned char *key, unsigned char *iv, int *outl) { EVP_CIPHER_CTX ctx; int ret; EVP_CIPHER_CTX_init(&ctx); ret = EVP_CIPHER_CTX_set_padding(&ctx, 0); //0 for no padding, 1 for padding if(!ret) abort(); ret = EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), 0, key, iv); if(!ret) abort(); cout<<"EVP_CIPHER_CTX_block_size: "<<EVP_CIPHER_CTX_block_size(&ctx)<<endl;; cout<<"EVP_CIPHER_CTX_key_length: "<<EVP_CIPHER_CTX_key_length(&ctx)<<endl; cout<<"EVP_CIPHER_CTX_iv_length: "<<EVP_CIPHER_CTX_iv_length(&ctx)<<endl; unsigned char *out=0; *outl=0; out = (unsigned char *)malloc(inl + EVP_CIPHER_CTX_block_size(&ctx)); ret = EVP_EncryptUpdate(&ctx, out, outl, in, inl); if(!ret) abort(); ret = EVP_EncryptFinal_ex(&ctx, out, outl); if(!ret) abort(); return out; } unsigned char *DecryptTest(unsigned char *in, int inl, unsigned char *key, unsigned char *iv, int * outl) { int ret; EVP_CIPHER_CTX ctx; EVP_CIPHER_CTX_init(&ctx); ret = EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), 0, key, iv); if(!ret) abort(); cout<<"EVP_CIPHER_CTX_block_size: "<<EVP_CIPHER_CTX_block_size(&ctx)<<endl;; cout<<"EVP_CIPHER_CTX_key_length: "<<EVP_CIPHER_CTX_key_length(&ctx)<<endl; cout<<"EVP_CIPHER_CTX_iv_length: "<<EVP_CIPHER_CTX_iv_length(&ctx)<<endl; unsigned char *out=0; *outl=0; out = (unsigned char *)malloc(inl + EVP_CIPHER_CTX_block_size(&ctx)); int len=0; ret = EVP_DecryptUpdate(&ctx, out, outl, in, inl ); // inl=16 if(!ret) abort(); len += *outl; ret = EVP_DecryptFinal_ex(&ctx, out, outl); if(!ret) abort(); // !!! abort here, ret=0 len += *outl; ret = EVP_CIPHER_CTX_cleanup(&ctx); if(!ret) abort(); *outl = len; return out; } main() { int i; unsigned char key[32]; unsigned char iv[16]; select_random_key(key, 32); select_random_iv(iv, 16); unsigned char in[]={ 0x9,0x28,0x97,0x17, 0x2,0x18,0x19,0x12, 0x6,0x48,0x39,0x19, 0x7,0x58,0x96,0x13}; unsigned char *out; int outl; out = EncryptTest(in, sizeof(in), key,iv, &outl); unsigned char *out2; int outl2; out2 = DecryptTest(out, outl, key,iv, &outl2); cout<<memcmp(out2,in,sizeof(in))<<endl; free(out); free(out2); } bian ___________________________________________________________ 天生购物狂,狂抢购物券,你还等什么! http://cn.mail.yahoo.com/promo/taobao20/index.php ______________________________________________________________________ OpenSSL Project http://www.openssl.org User Support Mailing List openssl-users@openssl.org Automated List Manager [EMAIL PROTECTED]