基于GD32F470的mbedtls 3DES算法测试
3DES加密算法介绍
3DES数据加密算法是一种可逆的对称加密算法,也称三重数据加密算法。3DES块加密算法的设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的密码算法,目前3DES作为DES的过渡算法已经逐渐被更安全的AES代替。
DES的秘钥长度是8字节,而3DES的秘钥长度是24字节。3DES 是为了增加DES 的强度,将DES 重复计算3次所得到的一种密码算法。但3DES 并不是进行三次DES 加密(加密->加密->加密),而是加密->解密->加密的过程。这样做的目的是为了3DES 能够兼容普通的DES。
对于3DES算法秘钥来说,24个字节被分为三组,每组8个字节,分别用于三次DES计算的秘钥,所以当DES 中所有的密钥都是相同时,3DES 也就等同于普通的DES了。这就让3DES 具备了向下的兼容性。
加密模式
ECB模式(Electronic CodeBook mode):电子密码本模式
ECB (电子密码本)模式是最简单的块密码加密模式,加密前根据数据块大小分成若干块,之后将每块使用相同的密钥单独通过块加密器加密。这种加密模式的优点就是简单,不需要初始化向量(IV),每个数据块独立进行加/解密,利于并行计算,加/解密效率很高。但这种模式中,所有数据都采用相同密钥进行加/解密,也没有经过任何逻辑运算,相同明文得到相同的密文,所以可能导致“选择明文攻击”的发生。
CBC模式(Cipher Block Chaining mode):密码分组链模式
CBC (密码分组链接)模式是先将明文切分成若干小块,然后每个小块与初始块或者上一段的密文段进行逻辑异或运算后,再用密钥进行加密。第一个明文块与一个叫初始化向量的数据块进行逻辑异或运算。这样就有效的解决了ECB模式所暴露出来的问题,即使两个明文块相同,加密后得到的密文块也不相同。但是缺点也相当明显,如加密过程复杂,效率低等。
CFB模式(Cipher FeedBack mode):密码反馈模式
与ECB和CBC模式只能够加密块数据不同,CFB模式能够将密文转化成为流密文。这种加密模式中,由于加密流程和解密流程中被块加密器加密的数据是前块的密文,因此即使本块明文数据的长度不是数据块大小的整数倍也是不需要填充的,这保证了数据长度在加密前后是相同的。
OFB模式(Output FeedBack mode):输出反馈模式
不再直接加密明文块,其加密过程是先使用块加密器生成密钥流,然后再将密钥流和明文流进行逻辑异或运算得到密文流。
CTR模式(CounTeR mode):计时器模式
是一种通过将逐次累加的计算器进行加密来生成密钥流的流密码。每一个分组对应一个逐次累加的计数器,并通过计数器进行加密来生成密钥流。也就是说,最终的密文分组是通过将计数器加密得到的比特序列,与明文分组进行XOR而得到的。
图文详解可参考: 传送门
填充方式
由于块密码只能对确定长度的数据块进行处理,明文会被以64bit为一组划分为若干组进行加密,每一组使用DES算法由明文获得密文。可是待加密的明文并不能保证总是可以正好分成若干个64bit的组,最后一组正好满64bit的可能性往往是比较低的,那么为了加密方便,应该怎么办呢,Padding就是用来解决这个问题的。
3DES主要的填充方式有如下几种:
zeropadding
所有需要填充的地方都以0填充。
pkcs7padding
填充的内容是需要填充的字节数。如果最后一个数据块长度为len,每个块的长度为k,len恰好等于k时,则需要在后面再添加一个完整的padding块。例如是以每8byte为一块,最后一块有8byte,则需要填充8byte的0x08。
pkcs5padding
PKCS5 和 PKCS7 的唯一区别是PKCS5只能用来填充64bit(8bytes)的数据块,除此之外可以混用。
示例代码
mbedtls包含了3DES加解密模块,使用起来也十分方便,在高级语言中(java等),一般3DES加密后会以base64的形式输出,恰好mbedtls也集成了base64编解码模块,废话不多说,直接上代码:
#include <stdio.h>
#include "mbedtls/aes.h"
#include "mbedtls/des.h"
#include "mbedtls/ctr_drbg.h"
#include "mbedtls/entropy.h"int main(int argc, char *argv[])
{unsigned char input[2048] = {"0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399"};unsigned char output[2048] = {0};unsigned char key[] = {"123456781234567812345678"};UINT64 start_time = 0;UINT64 des3_encrypt_time = 0;UINT64 base64_encode_time = 0;UINT64 base64_decode_time = 0;UINT64 des3_decrypt_time = 0;mbedtls_des3_context ctx;int data_len = strlen(input); // 数据长度printf("data_len = %d\r\n", data_len);int len = (data_len / 8 + (data_len % 8 ? 1: 0)) * 8; // 长度补为8的整数倍printf("padding len = %d\r\n", len);printf("原始数据:\r\n%s\r\n", input);start_time = LOS_CurrNanosec(); // 开始计时mbedtls_des3_init(&ctx);mbedtls_des3_set3key_enc(&ctx, key);// 使能 pkcs5padding 填充方式
#if 1if(data_len == len) {len += 8;}for(int i = data_len; i < len; i++) {input[i] = len - data_len;}
#endiffor(int i=0; i<len; i+=8) {mbedtls_des3_crypt_ecb(&ctx, &input[i], &output[i]);}des3_encrypt_time = LOS_CurrNanosec(); // 原始数据加密完成size_t base64_len;unsigned char *encode_buf = NULL;mbedtls_base64_encode( NULL, 0, &base64_len, output, len);encode_buf = (unsigned char *)calloc(1, base64_len);mbedtls_base64_encode(encode_buf, base64_len, &base64_len, output, len);base64_encode_time = LOS_CurrNanosec(); // base64编码完成printf("加密后HEX: \r\n");for(int i=0; i<len; i++) {printf("%02x",output[i]);}printf("\r\n");printf("加密后base64:\r\n%s\r\n",encode_buf);printf("\r\n\r\n====================================\r\n");printf("3DES加密耗时:\t\t%lldns\r\n", des3_encrypt_time - start_time);printf("base64编码耗时:\t\t%lldns\r\n", base64_encode_time - des3_encrypt_time);printf("加密总耗时:\t\t%lldns\r\n", base64_encode_time - start_time);printf("====================================\r\n\r\n");// --------------------------- 开始解密start_time = LOS_CurrNanosec(); // 开始计时size_t result_len;memset(output, 0, sizeof(output)); // 清空output buffer,用于接收base64解码结果mbedtls_base64_decode( output, sizeof(output), &result_len, encode_buf, base64_len);base64_decode_time = LOS_CurrNanosec(); // 解码完成if(result_len%8 != 0) {printf("base64解码数据不符合3DES加密数据格式! result_len = %d\r\n", result_len);goto DES_Exit;}printf("base64解码后HEX: \r\n");for(int i=0; i<result_len; i++) {printf("%02x",output[i]);}printf("\r\n");mbedtls_des3_set3key_dec(&ctx, key);memset(input, 0, sizeof(input)); // 清空输入buffer,用于接收3DES解密结果for(int i=0; i<result_len; i+=8) {mbedtls_des3_crypt_ecb(&ctx, &output[i], &input[i]);}unsigned char padding_size = input[result_len-1];if(padding_size <= 0 || padding_size > 8){printf("解析失败, padding错误! padding_size = %d\r\n", padding_size);goto DES_Exit;}data_len = result_len - padding_size;input[data_len] = '\0'; // 添加结束符des3_decrypt_time = LOS_CurrNanosec(); // 3DES解密完成printf("解密后原始数据为:\r\n%s\r\n",input);printf("\r\n\r\n====================================\r\n");printf("base64解码耗时:\t\t%lldns\r\n", base64_decode_time - start_time);printf("3DES解密耗时:\t\t%lldns\r\n", des3_decrypt_time - base64_decode_time);printf("解密总耗时:\t\t%lldns\r\n", des3_decrypt_time - start_time);printf("====================================\r\n\r\n");DES_Exit:mbedtls_des3_free(&ctx);
}
程序运行
如下为GD32F470单片机上的运行结果,可供参考:
相关文章:

基于GD32F470的mbedtls 3DES算法测试
3DES加密算法介绍 3DES数据加密算法是一种可逆的对称加密算法,也称三重数据加密算法。3DES块加密算法的设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的密码算法,目前3DES作为DES…...

为什么一些人很瞧不起 Java?
前言 瞧不起Java的大概是因为: Java 被认为是一门“老”语言,过时了。事实上,Java 由于其稳定性和安全性,一直是企业级应用开发的首选语言。而且,Java 语言还在不断更新和发展,例如 Java 8 引入了很多新特…...

DropMAE: Masked Autoencoders with Spatial-Attention Dropout for Tracking Tasks
摘要 在本文中,我们研究了掩码自动编码器(MAE)预训练的视频基于匹配的下游任务,包括视觉目标跟踪(VOT)和视频对象分割(VOS)。MAE的一个简单扩展是在视频中随机掩码帧块并重建帧像…...

【shell 基础(11)循环之for】带列表:空格子串、换行子串、展开、命令替换、seq;不带列表:接受参数、类C
文章目录一. 带列表的for循环1. 语法2. 例子2.1. 循环字串2.2. 展开或命令替换:数字循环2.3 命令替换(输出换行)作为list二. 其他for循环1. 不带列表的循环2. 类C的for循环一. 带列表的for循环 1. 语法 for var in list do commanddone注意…...

虚拟环境中创建Django项目 详细完整
一、自身安装python(我自身安装的python3.6.8) (1)官网: Python Releases for Windows | Python.org for windows> 这样下载慢的话,以下链接复制到迅雷下载: https://www.python.org/ftp/…...

BCSP-玄子JAVA开发之JAVA数据库编程CH-08_JDBC
BCSP-玄子JAVA开发之JAVA数据库编程CH-08_JDBC 8.1 JDBC 介绍 8.1.1 什么是 JDBC JDBC(Java Database Conectivity) Java数据库连接技术的简称,提供连接各种常用数据库的能力 8.1.2 JDBC 的工作原理 JDBC API 内容:供程序员…...

一位程序员将一款开源工具变成了价值75亿美元的帝国
他的成功,激励着年轻的程序员为什么翻译这些程序员大佬的成功故事?除了写代码,作为开发者,我们也需要时不时地仰望星空。我们每个人都怀有着远大的理想,希望用代码改变自己的生活、行业,甚至是这个世界。编…...

tmux | 终端操作软件,解决深度学习中终端相关问题
tmux 一次可运行多个终端会话。或者在后台运行终端会话。当需要一次访问多个 ssh 会话或只是为了一个便利的流程管理时,这很有帮助。例如,可以在下载最新的系统更新时运行 htop,编辑配置文件并在一个 tmux 会话中重新启动服务。 对于我来说t…...

信号 捕捉
signal 函数 作用:注册一个信号捕捉函数(注册而非创建) 原型: sighandler_t signal(int signum, sighandler_t handler);typedef void (*sighandler_t)(int);案例一: signal函数 捕捉 ctrlc 触发事件 #include<std…...

sqlserver中判断是否存在的方法
自定义变量 declare age int declare name varchar(20) set name‘张三’ --用set 方法给变量赋值 注: 此方法一次只能给一个变量赋值 select ageage from client where [name]name --查询客户张三的年龄赋值给age变量 注:此方法能一次多个变量赋值 …...

基于Kettle跑批的案例说明
需求概述 通过动态配置表的方式完成在kettle里动态配置参数,并调用ktr,实现跑批的目的。 问题分析 定义一个ktr读取配置表的信息并将拷贝记录到结果定义一个ktr从结果里获取记录并设置变量定义业务ktr(即按照业务需要开发的…...

2023 最新版网络安全保姆级自学指南
前言 如今,组织的信息系统和数据面临着许多威胁。而人们了解网络安全的所有基本要素是应对这些威胁的第一步。 网络安全是确保信息完整性、机密性和可用性(ICA)的做法。它代表了应对硬盘故障、断电事故,以及来自黑客或竞争对手攻击等防御和恢复能力。而…...

Chapter9.3:线性系统稳定性分析及综合实例
该系列博客主要讲述Matlab软件在自动控制方面的应用,如无自动控制理论基础,请先学习自动控制系列博文,该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接:https://blog.csdn.net/qq_39032096/category_10287468…...

EXCEL 在复杂查询时摒弃vlookup() sumif() 等公式,而使用数据透视表的初步学习
1 为什么要用数据透视表 如果不用,就可能需要写很复杂的,查询公式 比如,vlookup各种sumif,sumifs 等等,如果还是多个表进行统计,那写起来更酸爽所以感觉 vlookup sumif,sumifs 更适合,简单情况下的查询&am…...

C 文件读写
C 文件读写 本章我们将介绍 C 程序员如何创建、打开、关闭文本文件或二进制文件。 一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存…...

Linux中实现程序开机自启——将程序配置为系统服务
一、需求说明 当我们在Linux系统上安装软件时,希望软件实现开机自启,或程序崩溃后自动重启,提升软件运行的稳定性;而linux系统中的systemd刚好可以满足我们的要求(可将软件注册为系统服务)。 二、systemd systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务…...

【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(13)
目录 写在前面: 题目:P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述: 输入格式: 输出格式: 输入样例: 输出样例: 解题思路: 代码: AC &am…...

【新2023Q2模拟题JAVA】华为OD机试 - 总最快检测效率 or 核酸检测效率
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:报数 题目 一百个人围成一圈…...

基于主成分分析的混音方法
一、简介: 基于主成分分析的混音方法是一种常见的音频混音技术,它利用主成分分析(PCA)对音频信号进行降维和重构,从而实现混音。 二、基本步骤如下: 采集和存储需要混音的音频信号。 对音频信号进行主成分…...

Code Two Exchange Crack
CodeTwo Exchange 迁移允许直接从早期版本的 Exchange(从 Exchange 2010 开始)安全、轻松地迁移到 Exchange 2019 和 2016。此服务器应用程序还允许您集中管理来自 Microsoft 365 (Office 365) 的邮箱迁移以及来自基于 IMAP 的电子邮件系统(例…...

jQuery.form.js 详细用法_维护老项目使用
概述 jquery-3.3.1.min.js : http://jquery.com/download jquery.form.min.js :http://malsup.com/jquery/form/#tab7 jquery form 是一个表单异步提交的插件,可以很容易提交表单,设置表单提交的参数,并在表单提交前…...

【Java】关于你不知道的Java大整数运算之BigInteger类超级好用!!!
目录 一、BigInteger类简单介绍 二、BigInteger构造方式 (1)构造方式 (2)输入方式 三、BigInteger常见的成员方法 (1)方法介绍 (2)方法使用演示 1.加减乘除余 2.比较 3.绝…...

运维是不是没有出路了?
瑞典马工的《是时候让运维集体下岗了》一出,就让运维人为之一颤,人人自危。文章开篇就提到:明人不说暗话,在云原生和DevOps成熟的今天,运维作为一个岗位和团队已经完成了历史任务,应该退出舞台了…...

【C++笔试强训】第七天
选择题 解析:内联函数(inline)一般用于代码较少,代码块里面没有递归且频繁调用的函数,是一种以空间换时间(不是指内存,而是指令变多编译出来的可执行程序会变大)的做法。内联函数在预…...

mysql binlog 一直追加写,磁盘满了怎么办?
文章目录 mysql binlog 清理策略1、设置binlog最大的文件数和文件大小2、定时清理过期binlog文件3、手动清理binlog文件4、禁用或启用binlogmysql binlog用于记录mysql数据库所有变更(数据库的DDL、DML操作)包括用户执行的语句,以及底层引擎所执行的操作的二进制日志,主要用…...

缓存穿透、缓存雪崩、缓存击穿解决方案
什么是缓存 缓存就是数据交换的缓冲区(称作Cache),是存贮数据的临时地方,一般读写性能较高。 添加 redis 缓存 给店铺类型查询业务添加缓存 需求:添加ShopTypeController中的queryTypeList方法,添加查询缓存 缓存更新…...

web + servlet + jdbc mysql 实现简单的表单管理界面
目录数据库创建数据库连接servlet创建,这里注意一下我的数据库我自己改了一下名字lhx网页html运行文件目录展示首先我们准备好开发使用的工具以及配置 idea2020 tomcat8.5 创建javaweb参考idea编译Tomcat详细步骤 IDEA通过JDBC连接数据库请参考jdbc连接数据库 需要登陆注册界面…...

Maven 国内镜像仓库
镜像仓库目标 当我们未定义任何远程仓库时,使用 Maven 更新依赖时,其会去默认远程仓库中拉取,默认远程仓库 是国外地址,所以在国内访问特别慢,想提升访问速度,需要将国外地址换成国内地址 更换仓库地址的…...

day21 ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
二叉搜索树的最小绝对差 二叉搜索树(Binary Search Tree,简称 BST)是一种特殊的二叉树,它的每个节点都满足以下条件: 左子树上所有节点的值均小于该节点的值;右子树上所有节点的值均大于该节点的值&#…...

大学计算机(软件类)专业推荐竞赛 / 证书 官网及赛事相关信息整理
大学计算机专业(软件)推荐竞赛 / 证书 官网及赛事相关信息 一、算法类(丰富简历): 1、ACM国际大学生程序设计竞赛: 官网:https://icpc.global/ 国内:http://icpc.pku.edu.cn/index.htm 报名方式:区域预赛一般每年9-1…...