#include
#include "des.h"
#include "ossl_typ.h"
#include "evp.h"
#include "evp_locl.h"
/*openssl安装版本有冲突,所以都移到了本地目录,.so也是,采用的openssl版本openssl-1.1.1-pre8
编译:gcc evp-test.c -o test -L./ -lssl -lcrypto
*/
void show_hex(unsigned char * s, int len)
{
int i;
for(i=0; i
//以16进制输出,每一个字符占2位。
printf("%02x ",s[i]);
if(19 == i % 20)
printf("\n");
}
printf("\n\n");
}
int main()
{
int ret,which=1;
EVP_CIPHER_CTX *ctx;
const EVP_CIPHER *cipher;
unsigned char key[24],iv[8],in[100],out[108],de[100];
int i,len,inl,outl,total=0;
for(i=0;i<24;i++)
{
memset(&key[i],i,1);
}
for(i=0;i<8;i++)
{
memset(&iv[i],i,1);
}
for(i=0;i<100;i++)
{
memset(&in[i],i+1,1);
}
ctx = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
printf("please select :\n");
printf("1: EVP_des_cbc\n");
printf("2: EVP_aes_128_cbc\n");
scanf("%d",&which);
if(which==1)
cipher=EVP_des_cbc();
else
cipher=EVP_aes_128_cbc();
printf("原文:\n");
show_hex(in, 100);
ret=EVP_EncryptInit_ex(ctx,cipher,NULL,key,iv);
if(ret!=1)
{
printf("EVP_EncryptInit_ex err1!\n");
return -1;
}
printf("inl=50");
inl=50;
len=0;
EVP_EncryptUpdate(ctx,out+len,&outl,in,inl);
len+=outl;
EVP_EncryptUpdate(ctx,out+len,&outl,in+50,inl);
len+=outl;
EVP_EncryptFinal_ex(ctx,out+len,&outl);
len+=outl;
printf("加密结果长度: %d\n",len);
printf("加密结果:\n");
show_hex(out, len);
EVP_CIPHER_CTX_cleanup(ctx);
EVP_CIPHER_CTX_init(ctx);
ret=EVP_DecryptInit_ex(ctx,cipher,NULL,key,iv);
if(ret!=1)
{
printf("EVP_DecryptInit_ex err1!\n");
return -1;
}
total=0;
EVP_DecryptUpdate(ctx,de+total,&outl,out,44);
total+=outl;
EVP_DecryptUpdate(ctx,de+total,&outl,out+44,len-44);
total+=outl;
ret=EVP_DecryptFinal_ex(ctx,de+total,&outl);
total+=outl;
printf("解密结果长度: %d\n",total);
printf("解密结果:\n");
show_hex(de, total);
if(ret!=1)
{
EVP_CIPHER_CTX_cleanup(ctx);
printf("EVP_DecryptFinal_ex err\n");
return -1;
}
if((total!=100) || (memcmp(de,in,100)))
{
printf("err!\n");
return -1;
}
EVP_CIPHER_CTX_cleanup(ctx);
printf("test ok!\n");
return 0;
}