安全技术——基于SM4算法与AES算法的分组加密对比分析(Java和Python调用C语言库)

本文主要是介绍安全技术——基于SM4算法与AES算法的分组加密对比分析(Java和Python调用C语言库),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概要

对称密码算法顾名思义就是加密密钥和解密密钥一致或相同,作为现代密码算法三大类别之一,以运算速度闻名于世。对称密码算法根据单次加密的数据长度又分为分组加密和流加密算法。

国际上常见的对称加密算法有DES、3DES、AES、RC4、SNOW;国密对称密码算法指的是SM1、SM4、SM7、ZUC。SM1和SM7密码算法未公开。SM4和ZUC已公开,可以获得其开源代码。其中DES、3DES、AES、SM1、SM4、SM7属于分组算法,RC4、SNOW、ZUC属于分组加密。

对称加密算法加密过程与解密过程使用相同的或者容易互相推导得出的密钥,即加密和解密两方的密钥是“对称”的。分组加密是对称加密的典型代表,在多种应用场景中都会用到。本文重点分析保密性应用场景,并利用C语言和Java语言实现相关代码。

SM4算法流程

算法概述

SM4算法是我国发布的商用密码算法中的一种分组密码算法,于2006年公开发布。并于2012年3月发布为密码行业标准,2016年8月转为国家标准。

SM4密码算法是一个分组算法。该算法的分组长度为128bit,密钥长度为128bit,具体包括密钥扩展算法、加密算法和解密算法。密钥扩展算法与加密算法有一定的相似性,都采用32轮非线性迭代结构。数据加密算法和数据解密算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。由于密钥扩展算法、加密算法和解密算法有共性的模块,所以SM4密码算法与AES密码算法相比实现起来相对容易。

共性模块

共性模块主要是合成置换T,其中T是一个可逆变换,由非线性变换\tau和线性变换L复合而成,即T(x)=L(\tau(x))。

非线性变换\tau

\tau由4个并行的S盒构成。假设输入为A=(a0,a1,a2,a3),输出为B=(b0,b1,b2,b3),则(b0,b1,b2,b3)=\tau(A)=(SBox(a0),SBox(a1),SBox(a3),SBox(a3))。
其中SBox如下所示。

SBox的输入是一个字节,一个字节对应于两个字符的hex格式,比如字符a对应于ASCII是97,对应的hex是61,那么SBox(61)= 24

线性变换L

非线性变换\tau的输出是线性变换L的输入。 

  1. 加密算法中线性变换L:假设输入为B,输出为C,则C=L(B)=B XOR (B<<<2) XOR (B<<<10) XOR (B<<<18) XOR (B<<<24)。 
  2. 密钥扩展算法中线性变换L:假设输入为B,输出为C,则C=L(B)=B XOR (B<<<13) XOR (B<<<23)。

密钥及密钥参量

加密密钥长度为128bit,表示为MK=(MK0,MK1,MK2,MK3),其中MKi(i=0,1,2,3)为32bit字。轮密钥表示为(rk0,rk1,...,rk31),其中rki(i=0,1,...,31)为32bit字。轮密钥由加密密钥生成。密钥扩展算法能够基于加密密钥来产生轮密钥。

FK=(FK0,FK1,FK2,FK3)=(A3B1BAC6,56AA3350,677D9197,B27022DC)为系统参数,CK=(CK0,CK1,...,CK31)为固定参数,用于密钥扩展算法,其中FKi(i=0,1,2,3)和CKi(i=0,1,...,31)为32bit字。

固定参数CK=(CK0,CK1,...,CK31)=(00070E15,1C232A31,383F464D,545B6269,70777E85,8C939AA1,A8AFB6BD,C4CBD2D9,E0E7EEF5,FC030A11,181F262D,343B4249,50575E65,6C737A81,888F969D,A4ABB2B9,C0C7CED5,DCE3EAF1,F8FF060D,141B2229,30373E45,4C535A61,686F767D,848B9299,A0A7AEB5,BCC3CAD1,D8DFE6ED,F4FB0209,10171E25,2C333A41,484F565D,646B7279)。

如上图所示,轮密钥由加密密钥生成,轮密钥需要参与到不同轮的迭代加密算法中。迭代加密过程中使用相同的加密算法,采用不同的轮密钥。

密钥扩展算法

密钥扩展算法的主要目的是产生迭代数据加密的轮密钥。加密密钥首先与FK=(FK0,FK1,FK2,FK3)进行异或得到(K0,K1,K2,K3),然后将(K0,K1,K2,K3)作为输入放到合成置换T,产生K4作为rk0,然后将(K1,K2,K3,K4)作为输入放到合成置换T,产生K5作为rk1,然后将(K2,K3,K4,K5)作为输入放到合成置换T,产生K6作为rk2,以此类推,产生rk31。至此完成轮密钥的产生。另外轮密钥产生过程中会使用CK0,CK1,...,CK31。

数据加密算法

将(X0,X1,X2,X3)作为输入放到合成置换T,产生X4,然后将(X1,X2,X3,X4)作为输入放到合成置换T,产生X5,然后将(X2,X3,X4,X5)作为输入放到合成置换T,产生X6,以此类推,产生X32,X33,X34,X35。另外运算过程中会使用rk0,rk1,...,rk31。最终利用反序变换函数,得到加密之后的密文Y=(X35,X34,X33,X32)。

数据解密算法

解密算法与加密算法结构相同,不同的仅是轮密钥的使用顺序。 解密时,使用轮密钥顺序为rk31,rk30,...,rk0。

AES算法流程

代码实现

具体代码实现如下所示。代码库从代码库链接可以下载。

C语言代码实现

Java语言代码实现

Python语言代码实现

这篇关于安全技术——基于SM4算法与AES算法的分组加密对比分析(Java和Python调用C语言库)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/743871

相关文章

springboot rocketmq配置生产者和消息者的步骤

《springbootrocketmq配置生产者和消息者的步骤》本文介绍了如何在SpringBoot中集成RocketMQ,包括添加依赖、配置application.yml、创建生产者和消费者,并展... 目录1. 添加依赖2. 配置application.yml3. 创建生产者4. 创建消费者5. 使用在

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot