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

【ARM 安全系列介绍 3.7 -- SM4 对称加密算】


请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | GCC | CSH | Armv8/v9 系统异常分析】


文章目录

    • SM4 加密算法简介
      • SM4 工作模式
      • 算法步骤
      • 加密举例
      • 注意事项

在这里插入图片描述

Principle of SM4 encryption algorithm

SM4 加密算法简介

SM4是一种分组对称加密标准,由中国国家密码管理局所制定,属于国家商用密码算法系列之一。它在国内广泛用于金融、电子政务等领域的数据保护。SM4算法的核心特点包括:

  • 分组长度:128位。
  • 密钥长度:128位。
  • 轮数:32轮。
  • 加密与解密:使用相同的算法结构(轮函数和轮密钥生成算法相同),密钥调度算法产生的轮密钥顺序相反。

SM 系列主要分为 SM2、SM3、SM4。其中SM2为非对称加密算法SM3为哈希摘要算法SM4为对称加密算法。

SM4 工作模式

与其他对称加密算法一样,SM4可以在多种工作模式下运行,例如ECB(电子密码本模式)、CBC(密码块链接模式)、CFB(密码反馈模式)、OFB(输出反馈模式)和CTR(计数器模式)等。

算法步骤

  1. 密钥扩展:将128位密钥扩展为32个轮密钥。
  2. 初始变换:输入的128位明文经过初始置换。
  3. 轮函数:对数据块进行32轮加密或解密处理。
  4. 反初始变换:将最终的数据块进行一次反向置换,得到密文或明文。

加密举例

以下是一个SM4加密的简化示例,考虑到SM4算法的复杂性,这里不展示具体的算法实现代码,而是提供一个使用Python中的第三方库进行SM4加密解密的示例。
假设您已经安装了支持SM4的第三方库(如gmssl),则可以这样进行加密和解密:

from gmssl import sm4, func
# 密钥和明文(都需要是16字节的十六进制字符串)
key = b'0123456789abcdeffedcba9876543210'
plaintext = b'0123456789abcdeffedcba9876543210'# 创建SM4对象
crypt_sm4 = sm4.CryptSM4()# 设置密钥并加密
crypt_sm4.set_key(key, sm4.SM4_ENCRYPT)
ciphertext = crypt_sm4.crypt_ecb(plaintext)  # ECB模式加密
print("Ciphertext (ECB):", func.bytes_to_list(ciphertext))# 设置密钥并解密
crypt_sm4.set_key(key, sm4.SM4_DECRYPT)
decrypt_text = crypt_sm4.crypt_ecb(ciphertext)  # ECB模式解密
print("Decrypted Text (ECB):", func.bytes_to_list(decrypt_text))

注意事项

  • 在实际应用中,加密密钥应该是随机生成的,保证足够的安全性。
  • 为了提高安全性,除非特别需要,尽量避免使用ECB模式,因为它对于同一密钥和相同的明文块总是产生相同的密文块,可能会泄露一些模式信息。
  • 在使用对称加密算法时,密钥的保管和传输非常重要,需要通过安全的方式进行。

以上信息提供了SM4算法的概述和一个加密解密的基本例子,实际应用中可能需调整代码以满足特定的安全要求和性能考虑。

相关文章:

  • Java中的图形用户界面开发
  • 【MySQL进阶之路 | 高级篇】SQL执行过程
  • 用Vite基于Vue3+ts+DataV+ECharts开发数据可视化大屏,即能快速开发又能保证屏幕适配
  • PCB行业迈入数字化新时代,智能工厂引领未来制造
  • 供应链投毒预警 | utilitytool系列Py包开展XenoRAT远控木马投毒
  • Android-Android Studio-FAQ
  • YOLOv8目标跟踪model.track的封装
  • Java学习 - 网络IP地址与子网划分 讲解
  • 【C/C++】我自己提出的数组探针的概念,快来围观吧
  • shardingsphere调优日记
  • 【源码】人力资源管理系统hrm功能剖析及源码
  • git 快速将当前目录添加仓储
  • 性能工具之 JMeter 常用组件介绍(五)
  • K-means聚类算法详解与实战
  • Spring中的ContextPath总结
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 《剑指offer》分解让复杂问题更简单
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • gops —— Go 程序诊断分析工具
  • iOS | NSProxy
  • Java精华积累:初学者都应该搞懂的问题
  • JS实现简单的MVC模式开发小游戏
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Mithril.js 入门介绍
  • Puppeteer:浏览器控制器
  • React-redux的原理以及使用
  • Spring-boot 启动时碰到的错误
  • 第十八天-企业应用架构模式-基本模式
  • 多线程事务回滚
  • 关于for循环的简单归纳
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 突破自己的技术思维
  • 微信小程序设置上一页数据
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​LeetCode解法汇总518. 零钱兑换 II
  • !!java web学习笔记(一到五)
  • # 计算机视觉入门
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #define、const、typedef的差别
  • (9)目标检测_SSD的原理
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (k8s中)docker netty OOM问题记录
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (蓝桥杯每日一题)love
  • (四)库存超卖案例实战——优化redis分布式锁
  • (原創) 物件導向與老子思想 (OO)
  • (源码分析)springsecurity认证授权
  • .DFS.
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net core 管理用户机密
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上