使用openssl完成aes-cbc模式的数据加解密,输入和输出都是字符串的形式
代码
#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模式的数据加解密,输入和输出都是字符串的形式相关推荐
- 使用openssl完成aes-ecb模式的数据加解密,输入和输出都是字符串类型
代码 #include <cstring> #include <memory>#include <openssl/aes.h> #include <opens ...
- 使用openssl,实现输入和输出都是字符串的类型,注意:输入最好是16的倍数
头文件crypto_util.h #pragma once#include <string>namespace hsm{namespace mgmt{void get_md5_digest ...
- AES CBC模式下的CBC bit flipping Attack
<?xml version="1.0" encoding="utf-8"?> AES CBC模式下的CBC bit flipping Attack ...
- python aes加密 cbc_【转载】python AES CBC模式加密
今天需要用到AES CBC模式加密,搜索了很久,终于加密成功,记录一下今天的理解. 首先要安装pycrypto库,不知道为什么在windows安装失败,在linux可以正常安装 这里有几点要注意,ke ...
- STM32F1做RSA,AES数据加解密,MD5信息摘要处理
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_31878855/article/ ...
- golang实现AES ECB模式的加密和解密
最近有一个需求需要在golang中实现AES ECB模式的加密和解密, 看了一下官方文档和相关资料发现golang 官方包并没有完善的实现,于是自己尝试写了一个,本文中的AES算法是基于ECB模式, ...
- 基于RSA和AES混合加密实现的加解密小工具
基于RSA和AES混合加密实现的加解密小工具 闲来无事,用python的tkinter开发了一个基于RSA和AES混合加密的小小工具.总结一下使用到的知识点. 首先是核心的加解密部分. 采用混合加密的 ...
- Postman-APP登入模拟请求-数据加解密
Postman-APP登入模拟请求-数据加解密 简单说明一下 对于Postman的使用,一般情况下只要发发确定的请求与参数就可以的了.这个大家都会的 ,灰常的简单. 然而,在使用的时候,尤其是接口测试 ...
- 使用拦截器进行数据加解密
文章目录 使用拦截器进行数据加解密 1. 加解密工具 3. 加解密字段注解 3.1 加密注解 3.2 解密注解 4. 封装加解密工具 5. 拦截器 6. 不同框架配置说明 6.1 springboot ...
最新文章
- 官宣!全球首富马斯克:创办这所“新大学”!
- 纵深防御仍对付得了当今的网络威胁吗?
- AlertDialog 点击空白处、返回按钮 行为
- 广数系统u盘支持什么格式_支持转换50+种三维软件格式还能减面还是免费的,什么工具这么强大?...
- 怎么证明权重不相同的加权无向图的最小生成树是唯一的 (图论)
- 学会转变你的思维方式,一切都会变得不一样
- SAP Commerce里Extension, Addon和Accelerator这三个名词的联系和区别
- 父类与子类之间的关系
- Mysql 中Sql控制流语句_DCL语句/控制流语句
- 百度景鲲:9月15日发布小度真无线智能耳机
- xp系统windows 组件向导无iis安装选项解决办法
- pycharm error:no module named caffe
- react,react-router,redux+react-redux 构建一个React Demo
- jsp代码编写简单的BBS论坛项目的总结
- 用正则去掉代码前面附带的数字序号
- 80C51单片机的四组IO口
- 麟龙指标通达信指标公式源码_通达信麟龙指标套二主图+副图指标 贴图
- labview如何调用网络摄像头 labview 雄迈模组 需要通过labview调用在同一IP下的网络摄像头,采集图像,处理图像...
- Bootstrap布局之移动开发基础加容器
- ROS之socket通信---TCP/UDP
热门文章
- Office Web Apps 2013 修改Excel在线查看文件大小限制
- c#进阶(1)—— Task Parallel Library 并行执行与串行执行
- 【转】什么是CORS
- 一步步编写操作系统 69 汇编语言和c语言共同协作 70
- JAVA实现telnet代理,对输入命令拦截
- PWN-PRACTICE-CTFSHOW-4
- ocp证书怎么考_没有基础怎么考初级会计证书?
- 【BZOJ - 1305】dance跳舞(拆点网络流,建图,最大流,残留网络上跑最大流)
- 【POJ - 1947】Rebuilding Roads (树形dp,背包问题,树形背包dp)
- 算法讲解 -- 二分图之 匈牙利算法