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

相关文章

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

Spring中配置ContextLoaderListener方式

《Spring中配置ContextLoaderListener方式》:本文主要介绍Spring中配置ContextLoaderListener方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录Spring中配置ContextLoaderLishttp://www.chinasem.cntene

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下: