代码

#include <cstring>
#include <memory>#include <openssl/aes.h>
#include <openssl/md5.h>namespace hsm{namespace mgmt{void get_md5_digest(const std::string &data,uint8_t result[16]){MD5_CTX md5_ctx{};MD5_Init(&md5_ctx);MD5_Update(&md5_ctx,data.c_str(),data.length());MD5_Final(result,&md5_ctx);}
/*** @brief generate a valid aes key from input password** @note AES only support keys with length 128/192/256bits* @note this implementation use md5 as a method to fix the password*/std::unique_ptr<AES_KEY> get_aes_key(const std::string &password,int flag){auto aes_key = std::make_unique<AES_KEY>();uint8_t data[16]{};get_md5_digest(password,data);if (flag == AES_ENCRYPT){AES_set_encrypt_key(data,sizeof(data)*8,aes_key.get());} else if (flag == AES_DECRYPT){AES_set_decrypt_key(data,sizeof(data)*8,aes_key.get());}return aes_key;}std::string aes_cbc_encrypt_to_string(const std::string &data,const std::string &password){unsigned char buffer[AES_BLOCK_SIZE] = {0};auto aes_key = get_aes_key(password,AES_ENCRYPT);std::string result(data.length(),'0');auto input_offset = reinterpret_cast<const uint8_t *>(data.c_str());auto output_offset = reinterpret_cast<uint8_t *>(&result[0]);//encrypt blocksfor (size_t i = 0;i < 16;i++){buffer[i] += 1;}AES_cbc_encrypt(input_offset,output_offset,data.length(),aes_key.get(),buffer,AES_ENCRYPT);return result;}std::string aes_cbc_decrypt_from_string(const std::string &enc_data,const std::string &password){unsigned char buffer[AES_BLOCK_SIZE] = {0};auto aes_key = get_aes_key(password,AES_DECRYPT);std::string result(enc_data.length(),'0');auto input_offset = reinterpret_cast<const uint8_t *>(enc_data.c_str());auto output_offset = reinterpret_cast<uint8_t *>(&result[0]);for (size_t i = 0;i < 16;i++){buffer[i] += 1;}AES_cbc_encrypt(input_offset,output_offset,enc_data.length(),aes_key.get(),buffer,AES_DECRYPT);return result;}}//namespace mgmt
}//namespace hsm

注意事项

  • 在CBC中,每个明文块要先与前一个密文块进行异或后再加密,每个密文块都依赖于前面的所有明文块。
  • 那么问题又来了:第一个明文块怎么办?这个时候就要用到IV了。因此上面代码for循环是为了给第一块明文初始化,使其数据保持一致
  • 在CBC中,IV先与第一个明文块进行异或,得到第一个明文块,然后再进行后续的加密。详见下图:

参考链接

  • Openssl Aes加解密使用示例
  • AES加密(3):AES加密模式与填充
  • OpenSSL中AES加密的用法
  • OpenSSL参考文档
  • openssl使用指南

使用openssl完成aes-cbc模式的数据加解密,输入和输出都是字符串的形式相关推荐

  1. 使用openssl完成aes-ecb模式的数据加解密,输入和输出都是字符串类型

    代码 #include <cstring> #include <memory>#include <openssl/aes.h> #include <opens ...

  2. 使用openssl,实现输入和输出都是字符串的类型,注意:输入最好是16的倍数

    头文件crypto_util.h #pragma once#include <string>namespace hsm{namespace mgmt{void get_md5_digest ...

  3. AES CBC模式下的CBC bit flipping Attack

    <?xml version="1.0" encoding="utf-8"?> AES CBC模式下的CBC bit flipping Attack ...

  4. python aes加密 cbc_【转载】python AES CBC模式加密

    今天需要用到AES CBC模式加密,搜索了很久,终于加密成功,记录一下今天的理解. 首先要安装pycrypto库,不知道为什么在windows安装失败,在linux可以正常安装 这里有几点要注意,ke ...

  5. STM32F1做RSA,AES数据加解密,MD5信息摘要处理

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_31878855/article/ ...

  6. golang实现AES ECB模式的加密和解密

    最近有一个需求需要在golang中实现AES ECB模式的加密和解密,  看了一下官方文档和相关资料发现golang 官方包并没有完善的实现,于是自己尝试写了一个,本文中的AES算法是基于ECB模式, ...

  7. 基于RSA和AES混合加密实现的加解密小工具

    基于RSA和AES混合加密实现的加解密小工具 闲来无事,用python的tkinter开发了一个基于RSA和AES混合加密的小小工具.总结一下使用到的知识点. 首先是核心的加解密部分. 采用混合加密的 ...

  8. Postman-APP登入模拟请求-数据加解密

    Postman-APP登入模拟请求-数据加解密 简单说明一下 对于Postman的使用,一般情况下只要发发确定的请求与参数就可以的了.这个大家都会的 ,灰常的简单. 然而,在使用的时候,尤其是接口测试 ...

  9. 使用拦截器进行数据加解密

    文章目录 使用拦截器进行数据加解密 1. 加解密工具 3. 加解密字段注解 3.1 加密注解 3.2 解密注解 4. 封装加解密工具 5. 拦截器 6. 不同框架配置说明 6.1 springboot ...

最新文章

  1. 官宣!全球首富马斯克:创办这所“新大学”!
  2. 纵深防御仍对付得了当今的网络威胁吗?
  3. AlertDialog 点击空白处、返回按钮 行为
  4. 广数系统u盘支持什么格式_支持转换50+种三维软件格式还能减面还是免费的,什么工具这么强大?...
  5. 怎么证明权重不相同的加权无向图的最小生成树是唯一的 (图论)
  6. 学会转变你的思维方式,一切都会变得不一样
  7. SAP Commerce里Extension, Addon和Accelerator这三个名词的联系和区别
  8. 父类与子类之间的关系
  9. Mysql 中Sql控制流语句_DCL语句/控制流语句
  10. 百度景鲲:9月15日发布小度真无线智能耳机
  11. xp系统windows 组件向导无iis安装选项解决办法
  12. pycharm error:no module named caffe
  13. react,react-router,redux+react-redux 构建一个React Demo
  14. jsp代码编写简单的BBS论坛项目的总结
  15. 用正则去掉代码前面附带的数字序号
  16. 80C51单片机的四组IO口
  17. 麟龙指标通达信指标公式源码_通达信麟龙指标套二主图+副图指标 贴图
  18. labview如何调用网络摄像头 labview 雄迈模组 需要通过labview调用在同一IP下的网络摄像头,采集图像,处理图像...
  19. Bootstrap布局之移动开发基础加容器
  20. ROS之socket通信---TCP/UDP

热门文章

  1. Office Web Apps 2013 修改Excel在线查看文件大小限制
  2. c#进阶(1)—— Task Parallel Library 并行执行与串行执行
  3. 【转】什么是CORS
  4. 一步步编写操作系统 69 汇编语言和c语言共同协作 70
  5. JAVA实现telnet代理,对输入命令拦截
  6. PWN-PRACTICE-CTFSHOW-4
  7. ocp证书怎么考_没有基础怎么考初级会计证书?
  8. 【BZOJ - 1305】dance跳舞(拆点网络流,建图,最大流,残留网络上跑最大流)
  9. 【POJ - 1947】Rebuilding Roads (树形dp,背包问题,树形背包dp)
  10. 算法讲解 -- 二分图之 匈牙利算法