• 大小: 7KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-02
  • 语言: C/C++
  • 标签: encryp  

资源简介

实现加密算法: 【NULL算法】 函数:EVP_enc_null()该算法不作任何事情,也就是没有进行加密处理 【DES算法】 函数:EVP_des_cbc(void), EVP_des_ecb(void), EVP_des_cfb(void), EVP_des_ofb(void) 说明:分别是CBC方式、ECB方式、CFB方式以及OFB方式的DES算法 【使用两个密钥的3DES算法】 函数:EVP_des_ede_cbc(void), EVP_des_ede(), EVP_des_ede_ofb(void),EVP_des_ede_cfb(void) 说明:分别是CBC方式、ECB方式、CFB方式以及OFB方式的3DES算法,算法的第一个密钥和最后一个密钥相同,事实上就只需要两个密钥 【使用三个密钥的3DES算法】 函数:EVP_des_ede3_cbc(void), EVP_des_ede3(), EVP_des_ede3_ofb(void), EVP_des_ede3_cfb(void) 说明:分别是CBC方式、ECB方式、CFB方式以及OFB方式的3DES算法,算法的三个密钥都不相同 。 。 。 。 。 。 注: 这些加密算法函数调用时返回的都是对应EVP_CIPHER结构体指针 */

资源截图

代码片段和文件信息

#include 
#include 
#include 


typedef unsigned char uchar;

/*使用openssl提供的API实现*/
int aes_encrypt_api()
{
    uchar userkey[AES_BLOCK_SIZE];
    uchar *data = malloc(AES_BLOCK_SIZE*3);
    uchar *encrypt = malloc(AES_BLOCK_SIZE*6);
    uchar *plain = malloc(AES_BLOCK_SIZE*3);
    AES_KEY key;

    memset((void*)userkey ‘k‘ AES_BLOCK_SIZE);
    memset((void*)data ‘h‘ AES_BLOCK_SIZE*3);
    memset((void*)encrypt 0 AES_BLOCK_SIZE*6);
    memset((void*)plain 0 AES_BLOCK_SIZE*3);

    /*设置加密key及密钥长度*/
    AES_set_encrypt_key(userkey AES_BLOCK_SIZE*8 &key);


    int len = 0;
    /*循环加密,每次只能加密AES_BLOCK_SIZE长度的数据*/
    while(len < AES_BLOCK_SIZE*3) {
        AES_encrypt(data+len encrypt+len &key);    
        len += AES_BLOCK_SIZE;
    }
    /*设置解密key及密钥长度*/    
    AES_set_decrypt_key(userkey AES_BLOCK_SIZE*8 &key);

    len = 0;
    /*循环解密*/
    while(len < AES_BLOCK_SIZE*3) {
        AES_decrypt(encrypt+len plain+len &key);    
        len += AES_BLOCK_SIZE;
    }

    printf(“encrypt: “);
    int i = 0;
    for(i = 0; i < AES_BLOCK_SIZE*6; i++){
        printf(“%02x“ encrypt[i]);
        if((i+1) % 32 == 0){
            printf(“\n“);    
        }
    }
    printf(“\n“);   
    printf(“plain: %s\n“ plain);

    return 0;
}


/*使用EVP框架*/
int aes_encrypt_evp()
{
    char userkey[EVP_MAX_KEY_LENGTH];
    char iv[EVP_MAX_IV_LENGTH];
    uchar *data = malloc(AES_BLOCK_SIZE*3);
    uchar *encrypt = malloc(AES_BLOCK_SIZE*6);
    uchar *plain = malloc(AES_BLOCK_SIZE*6);
    EVP_CIPHER_CTX *ctx;
    int ret;
    int tlen = 0;
    int mlen = 0;
    int flen = 0;

    memset((void*)userkey ‘k‘ EVP_MAX_KEY_LENGTH);
    memset((void*)iv ‘i‘ EVP_MAX_IV_LENGTH);
    memset((void*)data ‘h‘ AES_BLOCK_SIZE*3);
    memset((void*)encrypt 0 AES_BLOCK_SIZE*6);
    memset((void*)plain 0 AES_BLOCK_SIZE*6);

    /*初始化ctx*/
    ctx = EVP_CIPHER_CTX_new();

    /*指定加密算法及key和iv(此处IV没有用)*/
                      
    ret = EVP_EncryptInit_ex(ctx EVP_aes_128_ecb() NULL userkey iv);
    if(ret != 1) {
        printf(“EVP_EncryptInit_ex failed\n“);
        exit(-1);
    }
    
    /*禁用padding功能*/
    EVP_CIPHER_CTX_set_padding(ctx 0);
    /*进行加密操作*/
    ret = EVP_EncryptUpdate(ctx encrypt &mlen data AES_BLOCK_SIZE*3);
    if(ret != 1) {
        printf(“EVP_EncryptUpdate failed\n“);
        exit(-1);
    }
    /*结束加密操作*/
    ret = EVP_EncryptFinal_ex(ctx encrypt+mlen &flen);
    if(ret != 1) {
        printf(“EVP_EncryptFinal_ex failed\n“);
        exit(-1);
    }

    tlen = mlen + flen;

    tlen = 0;
    mlen = 0;
    flen = 0;

    EVP_CIPHER_CTX_cleanup(ctx);
    EVP_CIPHER_CTX_init(ctx);
     
    ret = EVP_DecryptInit_ex(ctx EVP_aes_128_ecb() NULL userkey iv);
    if(ret != 1) {
        printf(“EVP_DecryptInit_ex failed\n“);
        exit(-1);
    }
    
    EVP_CIPHER_CTX_set_pa

评论

共有 条评论

相关资源