安全技术——基于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

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景