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 ;

    }

相关推荐
xnglan26 分钟前
使用爬虫获取游戏的iframe地址
开发语言·爬虫·python·学习
某个默默无闻奋斗的人29 分钟前
【矩阵专题】Leetcode54.螺旋矩阵(Hot100)
java·算法·leetcode
zhysunny30 分钟前
04.建造者模式的终极手册:从快餐定制到航天飞船的组装哲学
java·开发语言·建造者模式
郝学胜-神的一滴1 小时前
建造者模式:构建复杂对象的优雅方式
开发语言·c++·程序人生·建造者模式
AAIshangyanxiu1 小时前
最新基于R语言结构方程模型分析与实践技术应用
开发语言·r语言·结构方程模型·生态统计学
青藤云安全1 小时前
青藤天睿RASP再次发威!捕获E签宝RCE 0day漏洞
网络安全
JXL18601 小时前
Leetcode-.42接雨水
算法·leetcode·职场和发展
Fly-ping2 小时前
【前端】JavaScript 的事件循环 (Event Loop)
开发语言·前端·javascript
范纹杉想快点毕业3 小时前
基于C语言的Zynq SOC FPGA嵌入式裸机设计和开发教程
c语言·开发语言·数据库·嵌入式硬件·qt·fpga开发·嵌入式实时数据库
啊我不会诶3 小时前
CF每日5题(1500-1600)
c++·学习·算法