当前位置: 首页 > news >正文

AES_ECB算法C++与Java相互加解密Demo

一、AES算法

AES是一种对称加密算法,算法秘钥长度可为128位(16字节)、192位(24字节)、256位(32字节)。加密模式分为ECB、CBC、CTR等,其中ECB模式最简单够用。现给出ECB模式下C++和Java的实现,并且可以相互加解密验证。

二、AES_ECB实现DEMO

2.1 C++版本

#include <string>
#include <vector>
#include <openssl/evp.h>EVP_CIPHER *getAlgPoint(const int keyLen){EVP_CIPHER *pAlg = nullptr;if (keyLen <= 16) {pAlg = (EVP_CIPHER *)EVP_aes_128_ecb();}else if (keyLen >16 && keyLen <= 24) {pAlg = (EVP_CIPHER *)EVP_aes_192_ecb();}else{pAlg = (EVP_CIPHER *)EVP_aes_256_ecb();}return pAlg;
}std::vector<uint8_t> ecbEncrypt(const std::string &key, const std::string &str){if (key.empty() || str.empty()) {return {};}int encLen = 0;int outlen = 0;EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();std::vector<uint8_t > encData(((str.size()/16)+1) * 16);//加密后的长度是16的整数倍,明文刚好16整数倍则密文是明文长度+16字节EVP_CipherInit_ex(ctx, getAlgPoint(key.size()), nullptr, (uint8_t*)key.data(), nullptr, 1);EVP_CipherUpdate(ctx, encData.data(), &outlen, (const uint8_t *)str.c_str(), (int)str.size());encLen = outlen;EVP_CipherFinal_ex(ctx, encData.data() + outlen, &outlen);encLen += outlen;EVP_CIPHER_CTX_free(ctx);encData.resize(encLen);return encData;
}std::string ecbDecrypt(const std::string &key, const std::vector<uint8_t> &str){if (key.empty() || str.empty()) {return "";}int decLen = 0;int outlen = 0;EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();std::vector<uint8_t > decData(str.size());EVP_CipherInit_ex(ctx, getAlgPoint(key.size()), nullptr, (uint8_t*)key.data(), nullptr, 0);EVP_CipherUpdate(ctx, decData.data(), &outlen, str.data(), (int)str.size());decLen = outlen;EVP_CipherFinal(ctx, decData.data() + outlen, &outlen);decLen += outlen;EVP_CIPHER_CTX_free(ctx);decData.resize(decLen);return std::string((char*)decData.data(), decData.size());
}int main(void){std::string tKey32 = "12345678901234567890123456789012";std::string tSrcMsg = "Hello World!";auto byteEnc = ecbEncrypt(tKey32, tSrcMsg);auto b64Enc = B64::encode(byteEnc.data(), byteEnc.size());//转base64打印加密后的内容, b64转换函数自己实现std::cout<<"b64Enc:" << b64Enc <<std::endl;auto strDec = ecbDecrypt(tKey32, byteEnc);std::cout<<"decMsg:"<< strDec<<std::endl;return 0;}
  • demo运行结果
b64Enc:wC/nIjhaktigwT5VfVYXKA==
decMsg:Hello World!

2.2 Java版本

  • AESUtil.java
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;public class AESUtil {private static final String ALGORITHM = "AES";private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";public static String encrypt(String plainText, String key) throws Exception{SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), ALGORITHM);Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] eBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(eBytes);}public static String decrypt(String encryptedText, String key) throws Exception{SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), ALGORITHM);Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] dBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));return new String(dBytes, StandardCharsets.UTF_8);}
}
  • Main.java
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;public class Main {public static void main(String[] args) throws Exception {String strkey = "12345678901234567890123456789012";String str = "Hello World!";String eStr = AESUtil.encrypt(str, strkey);System.out.println("aes256 eStr:" + eStr);String dStr = AESUtil.decrypt(eStr, strkey);System.out.println("aes256 dStr:" + dStr);}
}
  • demo运行结果
aes256 eStr:wC/nIjhaktigwT5VfVYXKA==
aes256 dStr:Hello World!

C++与Java的运行结果一致,如果测试128、192位秘钥,只用修改main函数中的秘钥长度,其他部分不用改动。

相关文章:

AES_ECB算法C++与Java相互加解密Demo

一、AES算法 AES是一种对称加密算法&#xff0c;算法秘钥长度可为128位(16字节)、192位(24字节)、256位(32字节)。加密模式分为ECB、CBC、CTR等&#xff0c;其中ECB模式最简单够用。现给出ECB模式下C和Java的实现&#xff0c;并且可以相互加解密验证。 二、AES_ECB实现DEMO …...

H7-TOOL自制Flash读写保护算法系列,为兆易创新GD32E23X制作使能和解除算法,支持在线烧录和脱机烧录使用(2024-10-29)

说明&#xff1a; 很多IC厂家仅发布了内部Flash算法文件&#xff0c;并没有提供读写保护算法文件&#xff0c;也就是选项字节算法文件&#xff0c;需要我们制作。 实际上当前已经发布的TOOL版本&#xff0c;已经自制很多了。但是依然有些厂家还没自制&#xff0c;所以陆续开始…...

FFmpeg 深度教程音视频处理的终极工具

1. 引言 什么是 FFmpeg&#xff1f; FFmpeg 是一个开源的跨平台多媒体处理工具&#xff0c;广泛应用于音视频的录制、转换、流式传输以及编辑等多个领域。它由 FFmpeg 项目团队开发和维护&#xff0c;支持几乎所有主流的音视频格式和编解码器。FFmpeg 包含了一系列强大的命令…...

Java程序设计:spring boot(13)——全局异常与事务控制

1 Spring Boot 事务支持 在使⽤ Jdbc 作为数据库访问技术时&#xff0c;Spring Boot框架定义了基于jdbc的PlatformTransaction Manager 接⼝的实现 DataSourceTransactionManager&#xff0c;并在 Spring Boot 应⽤ 启动时⾃动进⾏配置。如果使⽤ jpa 的话 Spring Boot 同样提供…...

金和OA-C6 ApproveRemindSetExec.aspx XXE漏洞复现(CNVD-2024-40568)

0x01 产品描述&#xff1a; 金和C6协同管理平台是以"精确管理思想"为灵魂&#xff0c;围绕“企业协同四层次理论”模型&#xff0c;并紧紧抓住现代企业管理的六个核心要素&#xff1a;文化 Culture、 沟通Communication 、 协作Collaboration 、创新 Creation、 控制…...

Redis集群及Redis存储原理

Redis存储原理 Redis将内存划分为16384个区域(类似hash槽) 将数据的key使用CRC16算法计算出一个值,取余16384 得到的结果是0~16383 将这个key保存在计算结果对应的槽位 再次查询这个key时,直接到这个槽位查找,效率很高 实际上这就是"散列表" 提高查询的效率 R…...

基于Springboot的图书个性化推荐系统【源码】+【论文】

图书个性化推荐系统是一个基于Java语言和Springboot框架开发的Web应用系统&#xff0c;主要为管理员和学生提供个性化图书推荐、图书预约和管理功能。系统通过管理员和学生的不同权限设置&#xff0c;实现了图书分类管理、预约管理、退换图书管理、留言板管理等全面的功能&…...

科普 | 子母钟系统是什么?网络时钟同步的重要性?

科普 | 子母钟系统是什么&#xff1f;网络时钟同步的重要性&#xff1f; 科普 | 子母钟系统是什么&#xff1f;网络时钟同步的重要性&#xff1f; 在信息时代的今天&#xff0c;准确统一的时钟系统已广泛的应用在车站、医院、学校、机场等公共服务场所。 因此完善的时钟系统对…...

批量删除redis数据【亲测可用】

文章目录 引言I redis客户端基础操作key的命名规则批量查询keyII 批量删除key使用连接工具进行分组shell脚本示例其他方法III 知识扩展:控制短信验证码获取频率引言 批量删除redis数据的应用: 例如缓存数据使用了新的key存储,需要删除废弃的key。RedisTemplate的key序列化采…...

Vuestic 数据表格 使用demo

<template><br><div class"grid sm:grid-cols-3 gap-6 mb-6"><VaButton click"()>{for(const it in this.selectedItems){console.log(this.selectedItems);}}">参数设置</VaButton><VaButton>参数刷新</VaButt…...

考勤无忧,Zoho People助HR高效

云考勤系统提升数据准确性、无缝对接业务、节省成本、提高员工效率、保障安全。ZohoPeople作为云HRMS&#xff0c;集成考勤管理等功能&#xff0c;支持试用&#xff0c;助力企业高效管理。 一、使用云考勤管理系统&#xff0c;有哪些好处&#xff1f; 1、数据准确性得到保障 …...

已知一个法向量和一个点,求该平面的ModelCoefficients,并使用ProjectInliers将点云投影到该平面

#include <pcl/point_cloud.h> #include <pcl/point_types.h> #include <pcl/filters/project_inliers.h> #include <pcl/model_coefficients.h>// 假设法向量和一个点已知 float A 1.0; // 法向量的 x 分量 float B 0.0; // 法向量的 y 分量 floa…...

92.【C语言】数据结构之单向链表的查找,中间插入和删除,销毁

目录 1.链表的查找函数 2.链表的修改函数 3.链表的中间插入函数 1.在pos之前插入:SLTInsertBefore函数 1.借助头指针pphead 示意图 代码示例(写入SList.c) 头文件添加SLTInsertbefore的声明 main.c的部分代码改为 1.测试中间插入 2.测试头部插入 3.测试pos为NULL的…...

WPF+MVVM案例实战(七)- 系统初始化界面字体描边效果实现

文章目录 1、案例效果展示2、项目准备3、功能实现1、资源获取2、界面代码3、后台代码4 源代码获取1、案例效果展示 2、项目准备 打开项目 Wpf_Examples,新建系统初始化界面 WelcomeWindow.xmal,如下所示: 3、功能实现 1、资源获取 案例中使用的CSDN文字为路径文字,从字体…...

基于 C# 的 AI 算法测试方法

基于 C# 的 AI 算法测试方法 在当今人工智能蓬勃发展的时代&#xff0c;AI 算法的质量和可靠性至关重要。对于使用 C# 开发的 AI 算法&#xff0c;我们需要一套有效的测试方法来确保其性能、准确性和稳定性。本文将详细探讨基于 C# 的 AI 算法测试方法&#xff0c;帮助开发者更…...

Find My画框|苹果Find My技术与画框结合,智能防丢,全球定位

画框通常用于保护和固定艺术品&#xff0c;尤其是绘画作品。它是一种可以展示艺术品的框架&#xff0c;用于保护艺术品免受损坏或污染。艺术品被放置在画框内&#xff0c;可以避免受到空气、尘土和其他外部因素的损害。同时&#xff0c;画框还可以增强艺术品的展示效果&#xf…...

布谷语音源码服务器搭建环境及配置流程

布谷语音源码部署环境安装要求&#xff08;只有在相同的环境下才更容易避免一些不必要的麻烦&#xff09;&#xff1a;●安装Center OS 7.9&#xff0c;我们自己的服务器使用的是7.9建议相同系统&#xff0c;非强制●安装宝塔环境&#xff08;强烈推荐使用&#xff09;●安装软…...

算法|牛客网华为机试21-30C++

牛客网华为机试 上篇&#xff1a;算法|牛客网华为机试10-20C 文章目录 HJ21 简单密码HJ22 汽水瓶HJ23 删除字符串中出现次数最少的字符HJ24 合唱队HJ25 数据分类处理HJ26 字符串排序HJ27 查找兄弟单词HJ28 素数伴侣HJ29 字符串加解密HJ30 字符串合并处理 HJ21 简单密码 题目描…...

Tomcat servlet response关于中文乱码的经验

前言 最近修改老项目项目&#xff0c;使用zuul网关返回的中文内容乱码了&#xff0c;如果使用GBK或者GB2312编码确正常显示&#xff0c;稍微实验了一下&#xff0c;发现里面很多细节&#xff0c;毕竟Springboot对我们做了很多事情&#xff0c;而且当我们使用不同的模式会出现很…...

WebGIS开发丨从入门到进阶,全系列课程分享

WebGIS开发所需的技能 1.前端技能&#xff1a;Html、CSS、 Javascript、WebAPLs、Vue 2.二维技能&#xff1a;WebGIS基础理论及开发、MapGIS二次开发Openlayers、Leaflet、Mapbox 、Echarts、公共开发平台开发等 3.三维技能&#xff1a;Blender、Three.js、Cesium等 Web开发…...

长期使用taotoken token plan套餐的成本节约感受

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用 Taotoken Token Plan 套餐的成本节约感受 对于需要稳定调用大模型 API 的个人开发者或团队而言&#xff0c;成本控制是一…...

计算机视觉十年演进:从手工特征到工业落地实战

1. 计算机视觉的十年跃迁&#xff1a;从手工特征到端到端理解2012年&#xff0c;AlexNet在ImageNet大赛上以15.3%的错误率碾压第二名10.8个百分点&#xff0c;整个计算机视觉领域像被按下了快进键。那会儿我在实验室调试SIFT特征匹配&#xff0c;光是调一个尺度参数就要跑三小时…...

SpringBoot项目启动报错Could not resolve placeholder?别慌,这10种排查思路总有一种能帮你搞定

SpringBoot配置占位符解析失败的10种深度排查策略 当你正沉浸在SpringBoot项目的开发中&#xff0c;突然控制台抛出那行刺眼的红色错误——"Could not resolve placeholder xxx in value ${xxx}"&#xff0c;这种场景对于Java开发者来说再熟悉不过。这个看似简单的报…...

深度学习正则化(三)—— 提前终止 + 参数共享 + 稀疏表示(三十)

1. 定位导航 正则化 5 篇中,本篇承前启后: 第 28:参数范数惩罚(L1/L2)— 加在损失函数上 第 29:数据增强、噪声、半监督 — 操作数据 第 30(本篇):提前终止、参数共享、稀疏表示 — 隐式正则化 第 31:Bagging + Dropout 第 32:对抗训练 + 切面分类 本篇的三个方法表…...

基于图特征选择与XGBoost的电动公交预测性维护模型构建

1. 项目概述&#xff1a;从数据洪流到精准预警的挑战在电动公交的日常运营中&#xff0c;车辆控制器局域网&#xff08;CAN&#xff09;总线每秒都在产生海量的传感器数据&#xff0c;从电池电压、电机温度到刹车片厚度&#xff0c;这些数据流如同车辆的“生命体征”。预测性维…...

Burp AI Agent:AI驱动的Web安全测试自动化实践

1. 项目概述&#xff1a;当Burp Suite遇上AI&#xff0c;安全测试的范式革新 如果你是一名Web安全测试人员或渗透测试工程师&#xff0c;那么Burp Suite这个工具对你来说&#xff0c;就像外科医生的手术刀一样熟悉。我们用它拦截流量、重放请求、扫描漏洞&#xff0c;日复一日。…...

别再死记硬背了!用这5个真实数据处理场景,彻底搞懂Python列表、字典和集合

别再死记硬背了&#xff01;用这5个真实数据处理场景&#xff0c;彻底搞懂Python列表、字典和集合 当你第一次学习Python时&#xff0c;列表、字典和集合可能只是教科书上的几个定义。但真正掌握它们的关键&#xff0c;在于理解如何将这些数据结构转化为解决实际问题的工具。本…...

2026年图片换背景免费工具完全指南:一键抠图软件推荐

现在是5月&#xff0c;我想很多人都在为各种证件照、商品图、头像等需要换背景的图片犯愁。前两天有朋友问我"哪个软件可以给图片换背景"&#xff0c;我才意识到很多人还在用古老的PS或者繁琐的在线工具。今天就来给大家分享一下2026年最好用的图片换背景工具&#x…...

观察Taotoken Token Plan套餐在长期项目中的成本控制效果

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察Taotoken Token Plan套餐在长期项目中的成本控制效果 对于需要长期、稳定调用大模型API的项目而言&#xff0c;成本的可预测性…...

白起、项羽、黄巢杀降时的第三选择

白起、项羽、黄巢&#xff0c;他们都曾站在“杀降”这个决策悬崖上。与其说这是他们个人的暴虐&#xff0c;不如说他们当时都陷入了一个由战争逻辑、资源短缺和恐惧心理共同构筑的绝境。在那个系统里&#xff0c;他们几乎无法做出别的选择。&#x1f3b2; 那场被逼到墙角的困兽…...