基于openssl实现AES ECB加解密

AES加密,全称高级加密标准(Advanced Encryption Standard),是一种广泛使用的对称加密算法,用于保护电子数据的安全。以下是AES加密的基本原理和特点:

基本概念

  1. 对称加密:AES是一种对称加密算法,意味着加密和解密使用相同的密钥。

  2. 块加密:AES是一个块加密算法,它将数据分成固定大小的块(AES中为128位),然后对每个块进行加密。

  3. 密钥长度:AES支持三种密钥长度,分别是128位、192位和256位,分别对应AES-128、AES-192和AES-256。

AES支持的模式

        AES支持以下加密模式:

        ECB模式(The Electronic Codebook Mode)

        CBC模式(The Cipher Block Chaining Mode)

        CTR模式(The Counter Mode)

        GCM模式(The Galois/Counter Mode)

        CFB模式(The Cipher Feedback Mode)

        OFB模式(The Output Feedback Mode)

 块加密与数据填充

        明文数据的填充是块加密模式最重要的特点之一。

        为什么需要填充呢?这有个很重要的原因是因为,加密库(或者说加密算法)本身,是无法            预料用户输入的明文长度究竟是多少的!

        对于AES来说,ta只知道自己是按照16字节进行分组加密的,这里的分组加密说的更严                  谨 点,应该是,对明文按照16个字节进行分组进行加密(这里我们暂时不讨论每种模式下的          区别)。

        如果输入的明文长度不是16字节整数倍,这个时候就需要强行将明文进行填充对齐,使其              能 够满足分组规则。

        比较常见的几种填充法则如下:

        NoPadding:顾名思义,就是不填充。缺点就是只能加密长为BlockSize倍数的信息,一般不          会使用。

        ZerosPadding:全部填充0x00,无论缺多少全部填充0x00,已经是BlockSize的倍数仍要填            充,一般工程上不使用这种方式。

        PKCS#5:缺几个字节就填几个字节,每个字节的值为缺的字节数;在AES加密当中严格来            说不能使用PKCS#5的,因为AES的块大小是16bytes而PKCS#5只能用于8bytes。

        PKCS#7:缺几个字节就填几个字节,每个字节的值为缺的字节数;当长度不对齐时,将数            据填充到满足分组的长度;当长度刚好对齐时,在原始数据末尾新增一个填充块;OpenSSL          在AES加密中默认使用PKCS#7。

         ISO 10126:最后一个字节的值是需要填充的字节数(需要填充的字节数包括了最后一字               节),其他全部填随机数。

          ANSI X9.23:跟ISO 10126很像,只不过ANSI X9.23其他字节填的都是0而不是随机数。

OPenssl代码

        

#include <QCoreApplication>
#include <openssl/aes.h>
#include <qdebug.h>
#include <openssl/hmac.h>
#include <openssl/sha.h>
#include <iostream>
#include <iomanip>int openssl_aes_ecb_enrypt(std::string key,unsigned char* in, size_t len, unsigned char* out)
{int i;int blockNum;int aesInLen;unsigned char aesIn[1024];unsigned char* pAesIn;memset(aesIn,0,1024);pAesIn=aesIn;AES_KEY aes;// 设置加密密钥if (AES_set_encrypt_key((unsigned char*)key.data(), 128, &aes) < 0)return -1;// 判断原始数据长度是否AES_BLOCK_SIZE的整数倍if ((len % AES_BLOCK_SIZE) != 0){blockNum = len / AES_BLOCK_SIZE + 1;aesInLen = blockNum * AES_BLOCK_SIZE;memcpy(aesIn, in, len);}else{blockNum = len / AES_BLOCK_SIZE;aesInLen = len;memcpy(aesIn, in, len);}// 由于ECB每次只处理AES_BLOCK_SIZE大小的数据,所以通过循环完成所有数据的加密for (i = 0; i < blockNum; i++){AES_ecb_encrypt(pAesIn, out, &aes, AES_ENCRYPT);pAesIn +=AES_BLOCK_SIZE;out += AES_BLOCK_SIZE;}// 返回填充后加密数据的长度return aesInLen;
}// AES ECB 模式解密
// 参数:
// - in: 待解密的数据
// - len: 待解密数据的长度
// - out: 存放解密结果的缓冲区
// 返回值:
// - 成功返回0,失败返回-1
int openssl_aes_ecb_decrypt(std::string key,unsigned char* in, size_t len, unsigned char* out)
{unsigned int i;AES_KEY aes;// 设置解密密钥if (AES_set_decrypt_key((unsigned char*)key.data(), 128, &aes) < 0){return -1;}// 循环解密每个数据块for (i = 0; i < len / AES_BLOCK_SIZE; i++){AES_ecb_encrypt(in, out, &aes, AES_DECRYPT);in += AES_BLOCK_SIZE;out += AES_BLOCK_SIZE;}// 返回成功return 0;
}
int main(int,char**)
{std::string testKey="0123456789abcdef";QString str="3932343341323032342d30352d30395431353a35393a343231313631392e393531303045333935392e38313138394e545546644f434e4c53303830353331343037334e303030302d30302d30305430303a30303a3030461455c5e8686920b99e824d56eacd33c9dd5f4b0f065afacf15d61c2a9ae728943030302e3030333030302e3030d0";//int arraySize = str.size() / 2;if(str.size() % 2 == 1)arraySize += 1;uchar* resultArray= new uchar[arraySize];bool ok;for(int i = 0; i < arraySize; i++){QString hexStr = str.mid(i * 2, 2);int value = hexStr.toInt(&ok, 16);if(ok){resultArray[i] = value;}}qDebug()<<resultArray[132];//  unsigned char* aesEnInText= (unsigned char*)"Hellow world nuctech 123456789654321";unsigned char aesEnOutText[1024];int aesEnInLen=openssl_aes_ecb_enrypt(testKey,resultArray,arraySize, (unsigned char*) aesEnOutText);std::cout<<"aesEnOutText:"<<std::endl;for (int i = 0; i < aesEnInLen; i++){//printf("%x",aesEnOutText[i]);std::cout<<std::setw(2)<<std::setfill('0')<<std::hex<<static_cast<unsigned int>(aesEnOutText[i]);}std::cout<<std::endl;unsigned char aesDeOutText[1024];openssl_aes_ecb_decrypt(testKey,aesEnOutText,aesEnInLen, (unsigned char*) aesDeOutText);std::cout<<"aesDeOutText:"<<std::endl;for (int i = 0; i < aesEnInLen; i++){std::cout<<std::hex<<static_cast<unsigned int>(aesDeOutText[i]);}
}

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

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

相关文章

Opengrok代码在线查看平台

OpenGrok 是一个基于 Web 的源代码搜索引擎和交叉引用工具&#xff0c;它可以用来浏览和搜索代码库。虽然 OpenGrok 提供了代码搜索、查看文件和历史等功能&#xff0c;但它本身不是一个完整的在线集成开发环境&#xff08;IDE&#xff09;。然而&#xff0c;OpenGrok 可以作为…

网络科技时代的崛起:十个网站链接深度解读

在当下这个信息化、网络化飞速发展的时代&#xff0c;网络科技已经渗透到我们生活的方方面面。从信息传递、教育培训&#xff0c;到企业管理、城市生活&#xff0c;网络科技以其独特的魅力和无限的可能性&#xff0c;正在引领我们进入一个全新的世界。今天&#xff0c;我们就通…

python怎么下载numpy

安装Python step1&#xff1a;官网下载安装包&#xff1b; https://www.python.org/ 我下载的是python-3.4.4.msi step2&#xff1a;python环境变量配置&#xff1b; 计算机-属性-高级系统设置-环境变量-系统变量 找到PATH&#xff0c;点击编辑&#xff0c;加英文分号;在…

【Text2SQL 论文】T5-SR:使用 T5 生成中间表示来得到 SQL

论文&#xff1a;T5-SR: A Unified Seq-to-Seq Decoding Strategy for Semantic Parsing ⭐⭐⭐ 北大 & 中科大&#xff0c;arXiv:2306.08368 文章目录 一、论文速读二、中间表示&#xff1a;SSQL三、Score Re-estimator四、总结 一、论文速读 本文设计了一个 NL 和 SQL 的…

【设计模式深度剖析】【3】【行为型】【职责链模式】| 以购物中心客户服务流程为例加深理解

&#x1f448;️上一篇:命令模式 设计模式-专栏&#x1f448;️ 文章目录 职责链模式定义英文原话直译如何理解呢&#xff1f; 职责链模式的角色1. Handler&#xff08;抽象处理者&#xff09;2. ConcreteHandler&#xff08;具体处理者&#xff09;3. Client&#xff08;客户…

PostgreSQL 17新特性之分区拆分与合并

PostgreSQL 17 增强了分区管理功能&#xff0c;支持分区的拆分以及合并&#xff0c;同时支持分区表的标识列以及排除约束功能。 本文给大家介绍一下新增的分区拆分&#xff08;ALTER TABLE … SPLIT PARTITION …&#xff09;和分区合并&#xff08;ALTER TABLE … MERGE PART…

【Vue】普通组件的注册使用-局部注册

文章目录 一、组件注册的两种方式二、使用步骤三、练习 一、组件注册的两种方式 局部注册&#xff1a;只能在注册的组件内使用 ① 创建 .vue 文件 (三个组成部分) 以.vue结尾的组件&#xff0c;一般也叫做 单文件组件&#xff0c;即一个组件就是组件里的全部内容 ② 在使用的组…

分享一款提取抖音小店商家电话的软件使用教程

抖音作为一款国内非常流行的短视频分享平台&#xff0c;吸引了大量用户和商家。许多商家在抖音上开设了小店&#xff0c;但是抖音并没有提供直接获取商家电话的功能。本文将分享一款提取抖音小店商家电话的软件&#xff0c;并附带使用教程和代码。 教程 步骤一&#xff1a;安…

Qt窗口与对话框

目录 Qt窗口 1.菜单栏 2.工具栏 3.状态栏 4.滑动窗口 QT对话框 1.基础对话框QDiaog 创建新的ui文件 模态对话框与非模态对话框 2.消息对话框 QMessageBox 3.QColorDialog 4.QFileDialog文件对话框 5.QFontDialog 6.QInputDialog Qt窗口 前言&#xff1a;之前以上…

自定义指令:Vue允许注册全局或组件级的自定义指令,以实现对常规DOM元素的复杂操作

简介 Vue自定义指令的概念 在Vue.js中,指令(Directives)是一些预定义的特殊属性,它们以v-为前缀,用于对DOM元素进行一些特殊的操作。而自定义指令则是用户自己定义的一种特殊功能,它可以像Vue内置的指令一样使用,以达到复用和模块化的目的。 自定义指令提供了一种机制,…

单双目视频转图片

视频转图片 视频转图片 输入文件夹路径&#xff0c;里面时mp4视频 输出的是每隔1秒提取到的视频帧 interval是每隔多少秒保存一张图片 import cv2 import osimg_count 1def save_frames(video_path, output_folder, interval):# 创建保存图片的文件夹if not os.path.exists(ou…

Linux驱动开发笔记(三)平台设备驱动

文章目录 前言一、Linux的设备模型1. 总线1.1 bus_type结构体1.2 注册/注销总线 2. 设备2.1 device结构体2.2 内核注册/注销设备 3. 驱动3.1 device_driver结构体3.2 注册/注销驱动 4. attribute属性文件4.1 attribute_group结构体4.2 设备属性文件4.3 驱动属性文件4.3. 总线属…

数组array 和 array的区别

问题 对于数组 array和&array有什么区别呢? 先说答案 array: 指向数组第一个数地址的指针 &array: 指向整个数组地址的指针 所以直接打印的话, 地址是一样的. 但是如果1的话, 那么array是增加sizeof(int)大小, &array是增加sizeof(int) * array.size() 测试 #i…

printf(“不喝酒就没得朋友可是只要偶一喝酒就喝倒一代朋友人生真的很矛盾“);

/*无线通讯语言模块测试PAST 2019 12 28 L298 CODE1871**/ #include <REG52.H> #include <intrins.H> #include "stdio.h" #define uint unsigned int #defi…

必应bing国内广告账户如何注册推广呢?

作为全球第二大搜索引擎&#xff0c;必应Bing以其庞大的用户基础和精准的定向能力&#xff0c;为企业提供了拓展市场的绝佳平台。对于许多企业来说&#xff0c;必应Bing广告账户的注册与推广流程可能显得复杂而繁琐。此时&#xff0c;您不妨考虑携手云衔科技&#xff0c;共同开…

一篇文章告诉你为什么要考TOGAF证书?

TOGAF&#xff08;The Open Group Architecture Framework&#xff09;是一种被广泛应用于企业架构领域的框架和方法论。TOGAF证书作为对TOGAF知识体系的认可架构师群体中受喜爱。本文将探讨为什么TOGAF证书如此受欢迎&#xff0c;并解释其在企业架构中的重要性。 TOGAF证书的…

程序员职业素养:AI新时代下的机遇与挑战

目录 一、引言二、程序员职业素养的五大要点1. 技术能力2. 沟通能力3. 团队合作4. 责任心5. 敬业精神 三、实际案例解析四、程序员职业素养在实际工作中的应用五、AI新时代的程序员的职业发展建议六、总结七、结语 一、引言 在当今这个科技飞速发展的时代&#xff0c;程序员这…

景区ar互动大屏游戏化体验提升营销力度

从20世纪60年代的初步构想&#xff0c;到如今全球范围内无数企业的竞相投入&#xff0c;AR增强现实技术已成为引领科技潮流的重要力量。而在这一浪潮中&#xff0c;中国的AR公司正以其独特的魅力和创新力&#xff0c;崭露头角。 中国的AR市场正在迎来前所未有的发展机遇。如今&…

AI时代的浪潮

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经从科幻概念变为现实&#xff0c;深刻地影响着我们的工作和生活。在这个AI时代&#xff0c;我们将通过十个具有代表性的网站链接&#xff0c;一同探索AI技术的广泛应用和未来发展。 一、AI与人力资源管理…

展锐8541E配置USB ACM

1、kernel config 参考如下修改 cd bsp source build/envsetup.sh lunch 34 kuconfig -> Device Drivers ---> USB support ---> USB Gadget Support ---> [*] Abstract Control Model (CDC ACM)--- kernel/kernel4.14/arch/arm/configs/sprd_sharkle_defc…