C++使用openssl对AES-256-ECB PKCS7 加解密


/** AES-256-ECB PKCS7 加密 函数* input:经过PKCS7填充后的明文数据* outhex:加密后的命名数据16进制数,可以使用base64_encode转换为base64格式字符串密文* key:密钥* len:经过PKCS7填充后的明文数据长度*/
void AesEcb256Pkcs7Encrypt(u8 *input, u8 *outhex, u8 *key, int len)
{/* key:171ce897ad494cb289b023cd3c0ceab4 * input:{terminalNumber}* aesHexStr:6241579fb24b00f9d1d238ed191e700877b27ba4e7f6184253eb40c20f67390f* base64str:YkFXn7JLAPnR0jjtGR5wCHeye6Tn9hhCU+tAwg9nOQ8=** input:{"terminalNumber":"28b7f2eb-b549-3200-9950-2c6a83cd8af2"}* aesHexStr:3B2EFE3D4BF2E586F06D9AC26B2F35CE67B2B228C5DE89980DE8CE3570EBBEE62EB54526A24542885D8902E860D54D056C6545D183B0A0134A48449C3D9F7B19* base64str:Oy7+PUvy5YbwbZrCay81zmeysijF3omYDejONXDrvuYutUUmokVCiF2JAuhg1U0FbGVF0YOwoBNKSEScPZ97GQ==*/TRACE("input:%s, key:%s, %d\n", (char*)input, (char*)key, len);AES_KEY aesKey;AES_set_encrypt_key(key, 256, &aesKey);for (size_t i = 0; i < len; i += AES_BLOCK_SIZE){AES_encrypt(input + i, outhex + i, &aesKey);TRACE("i:%d\n\n", i);}/* 将加密后的数据转换成十六进制字符串 */std::string aesHexStr;for (size_t i = 0; i < len; ++i){char hex[3];sprintf(hex, "%02X", outhex[i]);aesHexStr += hex;}/* 将hex转为base64 */char base64str[2*len] = {0};base64_encode(outhex, base64str, len);TRACE("buf[%s], len:%d, hexAes[%s], len:%d\n", base64str, strlen(base64str), aesHexStr.data(), aesHexStr.length());
}

/** AES-256-ECB PKCS7 解密 函数*/
void AesEcb256Pkcs7Decrypt(unsigned char* input, unsigned char* output, unsigned char* key, int len)
{AES_KEY aesKey;AES_set_decrypt_key(key, 256, &aesKey);for (size_t i = 0; i < len; i += AES_BLOCK_SIZE){AES_decrypt(input + i, output + i, &aesKey);TRACE("i:%d\n\n", i);}/* 将加密后的数据转换成十六进制字符串 */std::string aesHexStr;for (size_t i = 0; i < len; ++i){char hex[3];sprintf(hex, "%02X", output[i]);aesHexStr += hex;TRACE("output[%d]:%s [%d]\n", i, hex, output[i]);}
}

// PKCS7填充函数
int Pkcs7Padding(char *data, int len)
{int padding_len = AES_BLOCK_SIZE - (len % AES_BLOCK_SIZE);TRACE("data:%s, len:%d, padding_len:%d \n\n", data, len, padding_len);for (int i = 0; i < padding_len; i++){data[len + i] = (char)padding_len;}return len + padding_len;
}//去除PKCS7填充
int Pkcs7Unpadding(unsigned char *data, int length) 
{/* 取出最后一个字节数据 */int padding_size = data[length - 1];TRACE("padding_size:%d ,%d ,%d\n\n", padding_size, data[length - 1], length);if (padding_size > AES_BLOCK_SIZE || padding_size == 0) {TRACE("padding err\n\n");return -1; // 非法填充}int padding_index = length - padding_size;for (int i = 0; i < padding_size; i++){if (data[padding_index+i] != (unsigned char)padding_size){TRACE("padding err :%d ,%d\n\n", data[padding_index+i], padding_size);return -1; // 非法填充}}return padding_index;
}
int maintest()
{/* 256位密钥 */u8 *key = "171ce897ad494cb289b023cd3c0ceab4";char plaintext[256] = {0};/* 加密密文hex */unsigned char ciphertext[1024];unsigned char output[1024]; // 解密输出//sprintf(plaintext, "terminalNumber");//sprintf(plaintext, "{terminalNumber}");sprintf(plaintext, "{\"terminalNumber\":\"28b7f2eb-b549-3200-9950-2c6a83cd8af2\"}");/* PKCS7填充明文 */int allLen = Pkcs7Padding((char *)plaintext, strlen(plaintext));/* 加密 */AesEcb256Pkcs7Encrypt(plaintext, ciphertext, key, allLen);TRACE("plaintext:%s, len:%d key:%s \n\n", plaintext, allLen, key);/* 解密 */AesEcb256Pkcs7Decrypt(ciphertext, output, key, allLen);/* PKCS7解填充 */int plaintext_len = Pkcs7Unpadding(output, allLen); if (plaintext_len == -1){TRACE("AES Decrypt err\n");}else{TRACE("output:%s [%d]\n\n", output, plaintext_len);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/162329.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单易学,让你拥有个性化的二维码

在数字化时代&#xff0c;二维码已经成为了我们日常生活的一部分。然而&#xff0c;大多数二维码都是简单而乏味的&#xff0c;缺乏个性和吸引力。这篇文章将向你介绍如何使用乔拓云等免费在线海报制作工具来制作艺术二维码&#xff0c;让你轻松掌握二维码的美化技巧。 1. 选择…

随机专享记录第一话 -- RustDesk的自我搭建和使用

1.介绍 RustDesk是继TeamView、向日葵等远程桌面软件后的新起之秀,最主要的是开源的可自己搭建中继服务。相比于公共服务器,连接一次等待的时间要多久,用过TeamView的都知道,而且还是免费的,不像某些远程搞各种个人证书,各种登录设备限制! 先看看软件图,这是待连接界…

Django 访问静态文件的APP staticfiles

Django 框架默认带的 APP&#xff1a; django.contrib.staticfiles Django文档中也写明了&#xff1a;如何管理静态文件&#xff08;如图片、JavaScript、CSS&#xff09; |姜戈 文档 |姜戈 (djangoproject.com)https://docs.djangoproject.com/zh-hans/4.2/howto/static-file…

leetCode 214.最短回文串 + KMP

给定一个字符串 s&#xff0c;你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 1&#xff1a; 输入&#xff1a;s "aacecaaa" 输出&#xff1a;"aaacecaaa"示例 2&#xff1a; 输入&#xff1a;s &…

11.The Metric Tensor

Metric Tensor--度量张量 度量张量可以测量空间的长度和角度。 How do you get the length of a vector ? &#xff08;正交基的话&#xff09;可以使用三角形的勾股定理(毕达哥拉斯定理)。 上面用的是正交基e1、e2来计算的&#xff0c; 但是&#xff0c;若你想用 利用勾…

2023.10.18

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();private slot…

万界星空科技/生产制造执行MES系统/开源MES/免费MES

开源系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、免费MES、免费智能制造系统、免费排产系统、免费排班系统、免费质检系统、免费生产计划系统、免费数字化大屏。 万界星空开源MES制造执行系统的Java开源版本。开源mes…

贝叶斯学习

贝叶斯学习 文章目录 贝叶斯学习相关概率知识朴素贝叶斯多维正态密度贝叶斯 贝叶斯学习主要是依靠先验概率来推出后验概率&#xff0c;然后更具后验概率去验证。其主流分为朴素贝叶斯和高斯分布下的贝叶斯估计。 相关概率知识 **先验概率&#xff1a;**指根据以往经验和分析。…

hive排序

目录 order by (全局排序asc ,desc) sort by(reduce 内排序) Distribute by(分区排序) Cluster By&#xff08;当 distribute by 和 sorts by 字段相同时 &#xff0c;可以使用 &#xff09; order by (全局排序asc ,desc) INSERT OVERWRITE LOCAL DIRECTORY /home/test2 …

FastAdmin框架实现数据表的增删改查

目录 简介 增加数据 修改数据 控制器&#xff08;controller&#xff09;代码&#xff1a; 查询数据 控制器&#xff08;controller&#xff09;代码&#xff1a; 模型&#xff08;model&#xff09;代码&#xff1a; 删除数据 控制器&#xff08;controller&#xff0…

【jvm】虚拟机栈之局部变量表

目录 一、说明二、代码分析2.1 代码示例2.2 执行javap2.3 jclasslib插件查看 三、对slot的理解3.1 说明3.2 slot索引图3.3 实例方法的局部变量表3.4 long和double类型变量占2个slot 四、slot的重复利用4.1 说明4.2 变量c复用变量b的槽位 五、静态变量与局部变量对比 一、说明 1…

细说雪花算法

文章目录 背景一、介绍二、结构三、数据库分表1.垂直分表2.水平分表&#xff08;1&#xff09;主键自增&#xff08;2&#xff09;取模&#xff08;3&#xff09;雪花算法&#xff08;主角登场&#xff09; 总结 背景 需要选择合适的方案去应对数据规模的增长&#xff0c;以应…

零信任身份管理平台,构建下一代网络安全体系

随着数字化时代的到来&#xff0c;网络安全已成为企业和组织面临的一项重要挑战。传统的网络安全方法已经无法满足不断演变的威胁和技术环境。近期&#xff0c;中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;发布了《零信任发展研究报告&#xff08; 2023 年&a…

通过okhttp调用SSE流式接口,并将消息返回给客户端

通过一个完整的java示例来演示如何通过okhttp来调用远程的sse流式接口 背景&#xff1a;我们有一个智能AI的聊天界面&#xff0c;需要调用三方厂商的大模型chat接口&#xff0c;返回答案&#xff08;因为AI去理解并检索你的问题的时候这个是比较耗时的&#xff0c;这个时候客户…

超实用的Web兼容性测试经验总结,建议Mark

在日常工作中&#xff0c;我们经常碰到网页不兼容的问题。我们之所以要做兼容性测试&#xff0c;目的在于保证待测试项目在不同的操作系统平台上正常运行。 主要包括待测试项目能在同一操作系统平台的不同版本上正常运行&#xff1b;待测试项目能与相关的其他软件或系统的“和…

数据结构-----红黑树的删除操作

目录 前言 一、左旋和右旋 左旋&#xff08;Left Rotation&#xff09; 右旋&#xff08;Right Rotation&#xff09; 二、红黑树的查找 三、红黑树的删除 1.删除的是叶子节点 1.1删除节点颜色为红色 1.2删除节点颜色为黑色 1.2-1 要删除节点D为黑色&#xff0c;兄弟节…

创新与重塑,佛塑科技打造集团型 CRM 建设标杆

“十四五”时期是我国全面建成小康社会、实现第一个百年奋斗目标之后&#xff0c;乘势而上开启全面建设社会主义现代化国家新征程、向第二个百年奋斗目标进军的第一个五年。 在政府有序推进“十四五”规划的进程中&#xff0c;佛山佛塑科技集团股份有限公司&#xff08;证券简…

uni-app--》基于小程序开发的电商平台项目实战(七)完结篇

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

LeetCode【17】电话号码的字母组合

题目&#xff1a; 思路&#xff1a; 参考&#xff1a;https://blog.csdn.net/weixin_46429290/article/details/121888154 和上一个题《子集》的思路一样&#xff0c;先画出树结构&#xff0c;看树的深度&#xff08;遍历层级&#xff09;&#xff0c;树的宽度&#xff08;横向…

【监督学习】基于合取子句进化算法(CCEA)和析取范式进化算法(DNFEA)解决分类问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…