SM4加密算法例程(新增CTR模式)

说明

SM4和AES只是加密算法不同,使用起来几乎没有区别,AES相关的例程可以参考:

基于mbedtls的AES加密(C/C++)

基于OpenSSL的AES加密(C/C++)

本文主要介绍SM4加密算法,并提供库里没有的CTR模式模式


加密模式介绍

ECB模式(Electronic Codebook):

特点:

  • 独立性: 每个明文块都独立地使用相同的密钥进行加密,因此加密过程是相互独立的。
  • 并行性: 由于每个块之间没有依赖关系,ECB模式具有较好的并行性,可以同时加密多个块。

加密过程:

  1. 将明文划分为固定大小的块(例如128位)。

  2. 对每个块独立使用AES加密算法,使用相同的密钥。

  3. 输出得到相应的密文块。

CBC模式(Cipher Block Chaining):

特点:

  • 链接性: 每个明文块在加密之前都与前一个密文块进行异或运算,建立起块之间的链接,增加了安全性。
  • 初始块: 使用初始化向量(IV)引导第一个块的加密,避免了相同的明文块生成相同的密文块。

加密过程:

  1. 使用初始化向量(IV)与第一个明文块进行异或运算。

  2. 对异或的结果使用AES加密算法,得到第一个密文块。

  3. 将第一个密文块作为下一个明文块的IV,继续进行异或和加密。

  4. 重复这个过程直到加密完所有的块。

CTR模式(Counter):

特点:

  • 并行性: 由于每个块都被视为一个计数器的值,不需要保持块之间的状态,因此CTR模式具有良好的并行性。
  • 计数器: 每个块都使用一个唯一的计数器值,避免了相同的明文块生成相同的密文块。

加密过程:

  1. 生成一个初始计数器值(Counter)和初始化向量(IV)。
  2. 将计数器值与IV组合作为输入,使用AES加密算法生成伪随机流。
  3. 将伪随机流与明文块进行异或运算,得到密文块。
  4. 更新计数器值,继续生成伪随机流,重复以上步骤直到加密完所有的块。



AES和SM4的区别

设计和标准制定

  • AES: 由美国国家标准技术研究所(NIST)于2001年制定,是国际上广泛认可的加密标准。
  • SM4: 由中国国家密码管理局在2006年制定,主要在中国国内使用。

密钥长度

  • AES: 支持128位、192位和256位的密钥长度,分别称为AES-128、AES-192和AES-256。
  • SM4: 使用固定的128位密钥。

分组长度

  • AES: 使用128位的分组长度。
  • SM4: 同样使用128位的分组长度。

轮数

  • AES: 轮数取决于密钥长度,分别为10轮(AES-128)、12轮(AES-192)和14轮(AES-256)。
  • SM4: 固定为32轮。

S盒(Substitution Box)

  • AES: 使用固定的S盒,是一个预定义的字节替换表。
  • SM4: 使用非线性的S盒,通过运算生成。

应用领域

  • AES: 作为国际上广泛应用的加密算法,适用于各种领域的安全通信和数据保护。
  • SM4: 主要在中国国内使用,用于信息安全领域。

国际认可

  • AES: 经过全球范围内的广泛评估,得到广泛认可。
  • SM4: 目前主要在中国国内应用,国际认可度相对较低。

通过对比这两种算法的设计、应用和性能特征,可以更好地理解它们在不同背景下的使用场景和优势。在选择使用哪种算法时,应考虑特定的安全需求和国际标准。

代码

输出

ECB ENCYRPT(hex):  9a991f25e3303e12173f04f698ed5f4d
ECB DECYRPT(str):  1234567890abcdef
CBC ENCYRPT(hex):  d2d68ed9fe06cb40c9a150aa5917f15fa80538810c8117273f53ac7a0735b8f5
CBC DECYRPT(str):  1234567890abcdef123456789abcdef0
CRT ENCYRPT(hex):  abab2c11d606092a2e0f6594fb893a2b7aa45f0c5b207da83e4bb3eb754c1f00
CRT DECYRPT(str):  1234567890abcdef123456789abcdef0

源代码

from pysm4 import encrypt_ecb, decrypt_ecb, encrypt_cbc, decrypt_cbc
import base64sm4_key = "1234567890123456";
sm4_iv = "1234567890abcdef";
sm4_in = "1234567890abcdef123456789abcdef0";def SM4_CTR(data, key, iv, byteorder = "little"):'''入参和返回值均为bytes类型'''i = 0ret = []groups_num = len(data) // 16# bytes 转 intif byteorder == "little":iv_int = int.from_bytes(iv[0:4], byteorder)else:iv_int = int.from_bytes(iv[12:16], byteorder)for i in range(groups_num):temp_bs64 = encrypt_ecb(iv, key)temp_bytes = base64.b64decode(temp_bs64)for j in range(16):ret.append(data[i*16+j] ^ temp_bytes[j])iv_int += 1if byteorder == "little":iv = iv_int.to_bytes(4, byteorder) + iv[4:]else:iv = iv[:12] + iv_int.to_bytes(4, byteorder)if (len(data) % 16):temp_bs64 = encrypt_ecb(iv, key)temp_bytes = base64.b64decode(temp_bs64)for j in range(len(data) % 16):ret.append(data[i*16+j] ^ temp_bytes[j])return retdef ecb_test():ret = encrypt_ecb(sm4_in.encode(), sm4_key.encode())print("ECB ENCYRPT(hex): ", base64.b64decode(ret).hex()[:32])ret = decrypt_ecb(ret, sm4_key.encode())print("ECB DECYRPT(str): ", ret[:16])def ccb_test():ret = encrypt_cbc(sm4_in.encode(), sm4_key.encode(), sm4_iv.encode())print("CBC ENCYRPT(hex): ", base64.b64decode(ret).hex()[:64])ret = decrypt_cbc(ret, sm4_key.encode(), sm4_iv.encode())print("CBC DECYRPT(str): ", ret[:32])def ctr_test():ret = SM4_CTR(sm4_in.encode(), sm4_key.encode(), sm4_iv.encode(), "big")print("CRT ENCYRPT(hex): ", bytes(ret).hex())ret = SM4_CTR(bytes(ret), sm4_key.encode(), sm4_iv.encode(), "big")print("CRT DECYRPT(str): ", bytes(ret).decode())if __name__ == '__main__':ecb_test()ccb_test()ctr_test()

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

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

相关文章

【ChatGPT+】创新与教育的交汇点:中国训练工程师的崛起

人工智能总价值超15.7万亿美元 根据国际数据公司(IDC)的预测,到2030年,全球人工智能市场总价值将超过15.7万亿美元,这表明人工智能技术将在未来几十年内得到广泛应用并取得长足发展。 人工智能的快速发展将对各个领域…

Numpy和Pandas知识点总结

1.python常见的开源库介绍 1.1numpy 一个运行速度非常快的数学库,主要用于数组计算 1.2pandas 一个强大的“分析结构化数据”的工具集,底层依赖numpy 用于数据挖掘和数据分析,同时也提供数据清洗功能 pandas主要有两种数据结构&#xf…

selenium4.0中常见操作方式50条

前阵子升级了py3.9,一些常年陪伴的库也都做了升级,不少命令也更新了,适度更新一下记忆。 1. 打开浏览器:driver webdriver.Chrome() 2. 访问网址:driver.get("Example Domain") 3. 获取当前网址&#xff…

【华为OD机试真题 JavaScript】小朋友来自多少小区|解题思路、代码解析

文章目录 题目描述输入输出示例1输入输出说明解题思路实现代码题目描述 幼儿园组织活动,老师布置了一个任务:每个小朋友去了解与自己同一个小区的小朋友还有几个。我们将这些数量汇总到数组garden中。 请根据这些小朋友给出的信息,计算班级小朋友至少来自几个小区? 输入 …

linux 设备模型之设备驱动

设备模型跟踪所有对系统已知的驱动. 这个跟踪的主要原因是使驱动核心能匹配驱动和新 设备. 一旦驱动在系统中是已知的对象, 但是, 许多其他的事情变得有可能. 设备驱动可 输出和任何特定设备无关的信息和配置变量, 例如: 驱动由下列结构定义: struct device_driver { char *na…

BigDecimal的性能问题

BigDecimal 是 Java 中用于精确计算的数字类,它可以处理任意精度的小数运算。由于其精确性和灵活性,BigDecimal 在某些场景下可能会带来性能问题。 BigDecimal的性能问题 BigDecimal的性能问题主要源于以下几点: 内存占用:BigDec…

ElementPlus设置中文

介绍 在Vue3项目将ElementPlus切换为中文 示例 第一步:引入中文文件 import zhCn from element-plus/dist/locale/zh-cn.mjs第二步:设置中文 app.use(ElementPlus,{locale: zhCn, })完整代码 // main.ts import { createApp } from vue import Ele…

mysql+关掉密码过期

mysql关掉密码过期 要在MySQL中关闭密码过期功能,可以按照以下步骤进行操作: 登录到MySQL服务器。 使用管理员账户(如root)连接到数据库。 mysql -uroot -ppassword 运行以下命令来查看当前的密码过期设置: SHOW…

Verdi常用参数说明

Verdi是一个用于数字信号处理的仿真和调试工具。在Verdi中,可以使用各种参数来配置仿真和调试行为。以下是一些常用的Verdi参数及其说明: 参数作用-f文件列表-ssf指定fsdb的路径-l设置仿真日志的输出级别,如"none"、“errors”、“…

金蝶EAS pdfviewlocal.jsp接口存在任意文件读取漏洞 附POC软件

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 金蝶EAS简介 微信公众号搜索:南风漏洞复现文库 该…

2023十大最具商业影响力量子公司 | 光子盒年度系列

量子技术以其广泛的应用范围和对多个领域的深远影响,是当之无愧的“通用底座”技术,其潜在的产业变革力正在展现,尽管当前量子技术与人工智能或虚拟现实等技术领域相比,量子对大多数人来说还有些“看不透”。 2023年,量…

【Mars3d】new mars3d.layer.GeoJsonLayer({不规则polygon加载label不在正中间的解决方案

问题: 1.new mars3d.layer.GeoJsonLayer({type: "polygon",在styleOptions里配置label的时候,发现这个 不规则polygon加载的时候,会出现label不在中心位置。 graphicLayer new mars3d.layer.GeoJsonLayer({ name: "全国省界…

JVM的FastThrow优化机制

前言: 前一阵子,在公司排查线上问题发现:出问题的方法报空指针异常,但是没有异常堆栈信息和Message。我一开始以为是代码中做了处理,但是经过翻阅代码发现不是。最后一番查找资料,这种现象是JVM的一种优化机…

实验四:静态路由配置

实验四:静态路由配置 1. 静态路由 ( 一般配置 ) 【实验名称】静态路由配置 【实验目的】掌握静态路由的配置方法,理解路由表的作用和原理 【实验设备】路由器( 2 台)、计算机( 2 台)、交叉线&#xf…

Open3D 点云下采样抽稀(7)

Open3D 点云下采样抽稀(7) 一、算法介绍二、算法实现1.代码 一、算法介绍 点云抽稀在计算机图形学和计算机视觉中有着广泛的应用,其作用包括但不限于以下几点: 数据压缩: 点云抽稀可以有效地减少点云数据量&#xff0…

鸿蒙开发解决hvigor ERROR: Failed :entry:default@ProcessLibs...

文章目录 项目场景:问题描述原因分析:建议的解决方案总结HarmonyOSArkTS项目场景: 项目无法在真机上运行。报错 hvigor ERROR: Failed :entry:default@ProcessLibs… hvigor ERROR: 2 file found in ‘lib/arm64-v8a/libagccrypto.so’. This may cause unexpected errors …

问答领域的基本了解

问答领域是人工智能领域中的一个重要研究方向,旨在让计算机能够理解人类提出的问题,并以自然语言形式回答这些问题。问答系统可以应用于各种场景,包括搜索引擎、虚拟助手、智能客服等。 一.目标 目标: 问答系统的主要目标是使计…

为何大厂急招鸿蒙开发工程师?别有洞天

正确看待鸿蒙不再兼容安卓版本,而大厂急招鸿蒙工程师这一举动已经是预料之中的。我们一步步来看鸿蒙是怎么发展过程的。为什么互联网大厂急招鸿蒙开发岗位? 鸿蒙的发展历程 华为历经4年,从2019年开始的鸿蒙问世2.0版本到2023年末4.0宣布“不…

r语言拟合曲线

r语言拟合曲线 #圆滑曲线 library(ggalt) library(ggplot2) df <- read.csv("lqs-1.csv",headerT) p2<-ggplot(datadf,aes(xx,yy))geom_point(size1) geom_smooth(span0.1)p2结果

CTFshow web入门web128-php特性31

开启环境: 一个新的姿势&#xff0c;当php扩展目录下有php_gettext.dll时&#xff1a; _()是一个函数。 _()gettext() 是gettext()的拓展函数&#xff0c;开启text扩展get_defined_vars — 返回由所有已定义变量所组成的数组。 call_user_func — 把第一个参数作为回调函数调…