openssl-EVP对称加密算法源码对应openssl-1.1.1-pre8

#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;
}

你可能感兴趣的:(openssl-EVP对称加密算法源码对应openssl-1.1.1-pre8)