基于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 的电子邮件系统(例…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...

李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...

Copilot for Xcode (iOS的 AI辅助编程)
Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot,它能根据上下文补全代码,快速生成常用…...