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

news2024/11/19 20:17:53

/*
 * 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.coloradmin.cn/o/1099058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

18.项目开发之前端项目搭建测试

项目开发之前端项目搭建测试 解压文件&#xff0c;将前端项目目录&#xff0c;拖拽到HBuilder中 前端项目QuantTrade_vue地址&#xff1a;传送门 后端项目QuantTrade地址&#xff1a; https://pan.baidu.com/s/1GF45B0QepApH8JbRIOLY7w?pwd1016 开启idea的项目&#xff0c;先…

连连国际:助力跨境卖家在TikTok Shop全球平台轻松收款

数字化时代的崛起已经改变了人们的生活方式&#xff0c;也彻底颠覆了传统商业模式。社交媒体平台&#xff0c;如TikTok&#xff0c;已经不仅仅是人们分享生活的地方&#xff0c;也成为了商业增长的重要渠道之一。 TikTok Shop&#xff0c;作为TikTok社交媒体巨头的电子商务延伸…

换低挡装置(Kickdown, ACM/ICPC NEERC 2006, UVa1588)rust解法

给出两个长度分别为n1&#xff0c;n2&#xff08;n1&#xff0c;n2≤100&#xff09;且每列高度只为1或2的长条。需要将它们放入一个高度为3的容器&#xff08;如图3-8所示&#xff09;&#xff0c;问能够容纳它们的最短容器长度。 样例 2112112112 2212112 1012121212 2121…

使用 Github Actions 工作流自动部署 Github Pages

GitHub-Actions actions顾名思义就是一堆动作&#xff0c;是一个持续集成服务&#xff0c;持续集成包含了拉代码、运行测试、编译代码、登录远程服务器&#xff0c;发布到第三方服务等等的操作&#xff0c;GitHub将这些操作称为actions。 概念&#xff1a;Workflows, Events,…

fastDFS实现文件上传与下载

前言 我们在做项目的时候经常会遇到文件的上传与下载。你们是怎么做的呢&#xff1f;现在有一个技术可以非常简单的实现这个功能——fastDFS 简介 FastDFS是一个分布式文件系统&#xff0c;使用FastDFS可以非常容易搭建一套高性能的文件服务器集群提供文件上传、下载服务。 …

RocketMq(六)消息传输方式

在前面的基础上&#xff0c; 一、消息传输方式:在RocketMQ中&#xff0c;可以通过设置消费组的方式实现消息的广播和点对点传输。 1、默认方式:多个消费者轮询消费&#xff0c;若只有一个消费者则全部消费。通过下面的举例可以看到这其实就是点对点模式。 &#xff08;1&…

Rockchip 3588 开关HDMI

需求 上层Android要控制hdmi&#xff0c;dp等等(带有节点的功能)的开关&#xff0c;配置&#xff0c;获取状态。 方案 我们可以从Settings的源码中找到方法&#xff1a; 从HdmiSettings.java的源码中可以看到如下注释&#xff1a; 相关节点定义&#xff1a; 控制函数如下&…

云服务器ip使用细节(公网、私有)

场景&#xff1a; 当我们对tcp服务器进行监听的时候&#xff0c;可能需要用到ip地址&#xff0c;比如使用httplib::Service::listen(ip, port)&#xff0c;而当我们访问tcp服务器时也需要ip地址 但这两个ip是不同的&#xff01; 每个云服务器通常都会有一个公网IP地址和一个私有…

Redis删除过期key策略

文章目录 前言Redis中key的的过期时间在创建 key 时使用 EXPIRE 命令设置过期时间(秒级)使用 EXPIREAT 命令设置一个精确的过期时间(unix 时间戳)使用 PEXPIRE 命令设置过期时间(毫秒级)使用 PEXPIREAT 命令设置毫秒级精确过期时间在 Redis 配置文件中设置所有 key 的默认过期时…

C语言--好题

目录 题目一&#xff1a;二维数组传参 题目二&#xff1a; malloc开辟二维数组 题目三&#xff1a; 位段 题目四&#xff1a; 联合体 题目五&#xff1a;位段 题目六&#xff1a;找单身狗2 题目一&#xff1a;二维数组传参 下面代码中print_arr函数参数设计哪个是正确的…

某985证书站挖掘记录

0x1.前言 ​ 本文章仅用于信息安全防御技术分享&#xff0c;因用于其他用途而产生不良后果&#xff0c;作者不承担任何法律责任&#xff0c;请严格遵循中华人民共和国相关法律法规&#xff0c;禁止做一切违法犯罪行为。文中涉及漏洞均以提交至教育漏洞平台&#xff0c;现已修复…

​ModbusTCP转Profibus-DP从站网关把modbus的数据传到300plc上的应用方法​​

远创智控YC-DPS-TCP&#xff0c;让Profibus和ModbusTcp总线之间的通讯协议转换更简单。 远创智控YC-DPS-TCP 是一种将Profibus和ModbusTcp总线连接的通讯协议转换设备。这个设备非常符合ModbusTcp协议的设备&#xff0c;比如各种仪表、传感器、交换机等&#xff0c;它们可以通过…

odoo笔记

后台运行项目 nohup python odoo-bin -c ./debian/odoo.conf & 查看当前odoo进程 &#xff08;更新项目模型类时&#xff0c;1.先重启项目&#xff0c;2.再去网页更新模块&#xff09; ps -fA | grep odoo kill 进程id 删库 /web/database/manager 查找文件夹 find …

linux centos7 环境下 no such file or directory

目录 1.问题描述2.主要原因2.1修改后代码2.2修改前代码 总结参考 1.问题描述 预览excel文件时无法找到对应的html文件 2.主要原因 异常原因&#xff1a;代码获取的是系统的tmp文件&#xff0c;但是linux环境环境中心tmp目录是没有权限的&#xff0c;所以不能获取系统的根目录…

Python如何获取动态加载的数据呢 ?

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 例子1&#xff1a;爬取dy电影中的电影详情数据 url:https://movie.douban.com/ 1.什么是动态加载的数据&#xff1a; 我们通过requests模块进行数据爬取无法每次都是可见…

vue使用高德地图轨迹活动效果demo(整理)

在html页面引入您自己的key <script language"javascript" src"https://webapi.amap.com/maps?v1.4.15&key6b26c2c58770d13a4ecf2b96615dbaee"></script><template><div class"index"><div id"amapContain…

什么是粘包和半包问题

什么是粘包和半包问题 粘包 发送的是 ABC和DEF 接收到的是 ABCDEF 半包 发送的是 ABCD 接收到的是 AB 和 CD 为什么会有粘包问题? 因为 TCP 是面向连接的传输协议&#xff0c;它是以“流”的形式传输数据的&#xff0c;而“流”数据是没有明确的开始和结尾边界的&#xff0…

MIT6.5830 Lab1-Go tutorial实验记录(一

MIT6.5830 Lab1-Go tutorial实验记录&#xff08;一&#xff09; – WhiteNights Site 标签&#xff1a;Golang, 数据库 编写一个简单的http server。 前言 MIT数据库系统实验 在网上看到了这么个实验&#xff0c;刚好对golang和数据库比较感兴趣&#xff0c;于是开始跟着做实…

五大亮点探索互联网医院源码的创新应用方式

作为互联网医疗行业的专家&#xff0c;我将为您揭示互联网医院源码的五大创新亮点。随着数字化技术的迅猛发展&#xff0c;互联网医院源码成为了提升医疗服务质量和提供便捷就医体验的重要工具。现在&#xff0c;让我们一起深入探索这五大亮点&#xff0c;了解互联网医院源码在…

什么是人事RPA?人事RPA解决什么问题?人事RPA实施难点在哪里?

每家公司人力资源部门每天需要筛选适合自己公司岗位要求的人才并与之沟通邀约面试、每月全公司员工的考勤状态核对、业绩考核核对、入离职手续办理、新员工培训等等&#xff0c;每项业务流程都由人手操作&#xff0c;效率极低、流程繁琐、费时费力。HR部门每天面对的业务数据量…