当前位置: 首页 > article >正文

openssl的aes128_ECB加密解密运算实例

aes128算法ECB接口

加密接口

注意事项:

  • EVP_EncryptInit_ex初始化算法EVP_aes_128_ecb(),和密钥,key至少16B
  • EVP_EncryptUpdate加密运算,tmplen输出已加密长度
  • EVP_EncryptFinal_ex结束运算,如果在此仍有加密运算,则加密长度tmplen需补充到密文长度中

int openssl_aes128_encrypt_ecb(unsigned char *key,unsigned char *iv, unsigned char *in_buf, int in_len, unsigned char *out_buf,int* out_len)
{
    EVP_CIPHER_CTX* ctx = NULL;
    ctx = EVP_CIPHER_CTX_new();
    int tmplen = 0;
    printf("%s %d\n", __func__, __LINE__);
    EVP_EncryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, NULL);
    
    if (!EVP_EncryptUpdate(ctx, out_buf, &tmplen, in_buf, in_len))
    {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }
    *out_len = tmplen;

    if (!EVP_EncryptFinal_ex(ctx, out_buf + *out_len, &tmplen))
    {
        EVP_CIPHER_CTX_free(ctx);
        return -2;
    }
 
    *out_len += tmplen;
    EVP_CIPHER_CTX_free(ctx);
    return 0 ;
}

解密接口

注意事项:

  • EVP_DecryptInit_ex初始化算法EVP_aes_128_ecb(),和密钥,key至少16B
  • EVP_DecryptUpdate解密运算,tmplen输出已解密长度
  • 如果剩余字节是16B,再次使用EVP_DecryptUpdate
  • 如果剩余字节不是16B整数倍,使用EVP_EncryptFinal_ex结束运算,输出加密长度tmplen补充到密文长度中


int openssl_aes128_decrypt_ecb(unsigned char *key,unsigned char *iv, unsigned char *in_buf, int in_len, unsigned char *out_buf,int* out_len)
{
    int ret = 0 ,tmplen = 0;
    EVP_CIPHER_CTX* ctx = NULL;
    ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_set_padding(ctx, 0);
    printf("%s %d\n", __func__, __LINE__);

    EVP_DecryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, NULL);

    if (!EVP_DecryptUpdate(ctx, out_buf, &tmplen, in_buf, in_len))
    {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }
    *out_len = tmplen;

    if (in_len > tmplen) {
        if (!EVP_DecryptUpdate(ctx, out_buf+tmplen, &tmplen, in_buf+tmplen, in_len-tmplen))
        {
        //        RSP_TRACE("%s EVP_DecryptUpdate error \n", __func__);
            EVP_CIPHER_CTX_free(ctx);
            return -1;
        }
        *out_len += tmplen;
    }

    if (in_len %16!=0){
        ret = EVP_DecryptFinal_ex(ctx, out_buf+tmplen, &tmplen);
        fprintf(stderr, "err:\n");
        if (ret != 0)
        {
        //        RSP_TRACE("%s EVP_DecryptFinal_ex error ret=%d\n", __func__, ret);
            EVP_CIPHER_CTX_free(ctx);
            return -2;
        }
        *out_len += tmplen;
    }

    EVP_CIPHER_CTX_free(ctx);
    return 0 ;
}




http://www.kler.cn/a/564609.html

相关文章:

  • 自动化反编译微信小程序工具-e0e1-wx
  • 基于大数据的去哪儿网景区可视化及协同过滤推荐系统
  • 解锁CSnakes:.NET与Python的融合魔法
  • 事务的隔离级别
  • 深度学习中的 shape以及 axis的含义以及使用
  • java23种设计模式-状态模式
  • vue框架后遗症∶被遗忘的dom操作
  • 蓝耘科技发布DeepSeek满血版:引领AI推理革新,开启智慧新时代
  • 网络通信库
  • 时序论文40 | 将不规则采样时间序列转换为图像,利用预训练视觉Transformer进行分类
  • IO 和 NIO 有什么区别?
  • Linux:Shell环境变量与命令行参数
  • 29.[前端开发-JavaScript基础]Day06-创建对象-对象补充-包装类型-数组Array
  • 神经网络 - 函数饱和性、软性门、泰勒级数
  • CSS 实现波浪效果
  • Python 的基础语法
  • 基于 ‌MySQL 数据库‌对三级视图(用户视图、DBA视图、内部视图)的详细解释
  • React + TypeScript 复杂布局开发实战
  • 【落羽的落羽 数据结构篇】链式结构的二叉树
  • 计算机视觉 |解锁视频理解三剑客——SlowFast