首页 > 编程语言 >(记得关注哦)国产商用密码:编程实现分组密码体制中的国密算法SM4。

(记得关注哦)国产商用密码:编程实现分组密码体制中的国密算法SM4。

时间:2024-07-01 16:57:25浏览次数:21  
标签:加密 SM4 解密 密码 算法 国密 密钥 安全性

一、研究 SM4 算法 (一)SM4 算法的分组长度、密钥长度、S 盒、轮函数 ①分组长度和密钥长度: 分组长度:SM4 算法的分组长度为 128 位(即 16 字节),这意味着它每次加密或解密的数据块 大小为 128 位。 密钥长度:SM4 算法的密钥长度为 128 位(即 16 字节),与分组长度相同。 ② S 盒: SM4 算法使用了一个固定的 256 字节的 S 盒(Substitution Box),用于将输入的每个字节替换 为另一个字节,增加了密码算法的非线性性。S 盒中的每个元素都是一个 8 位字节,取值范围为 0 到 255。S 盒的具体值是经过严密设计的,并且经过了代换-置换网络(Substitution Permutation Network)的多轮迭代。 ③轮函数: SM4 算法中的轮函数是核心部分,它在每轮加密过程中对数据进行变换和混淆。 轮函数包括了多次的非线性变换、线性变换和密钥混合操作,以增加算法的安全性。具体来说, 轮函数通过对输入数据进行 S 盒替换、线性变换、密钥加操作等步骤,来产生输出。 (二)分组长度、密钥长度、S 盒、轮函数在加密和解 密过程中的作用。 SM4 算法的各个组成部分发挥着不同的作用: ①分组长度:加密和解密过程中,数据被分成固定长度的数据块(128 位或 16 字节),称为分 组。这个分组长度决定了一次加密或解密操作处理的数据量。 密钥长度:密钥长度决定了密钥的复杂度和算法的安全性。在加密和解密过程中,密钥被用于生 成轮密钥和混合数据块,对数据进行加密和解密。 ② S 盒:在加密和解密过程中,S 盒用于进行字节替换操作。具体来说,每个输入字节都会在 S 盒中查找对应的替换值,以增加算法的非线性性。S 盒中的字节替换是 SM4 算法中的一个重要步 骤,有助于混淆输入数据,增加加密算法的安全性。 ③轮函数:轮函数是 SM4 算法中最核心的部分,它在加密和解密过程的每一轮中都会被调用。轮 函数通过一系列的变换和操作来对数据进行混淆和加密。 在加密过程中,轮函数通过对输入数据的非线性变换、线性变换和密钥混合等操作,生成输出数 据。在解密过程中,轮函数的作用类似,但是需要反向使用轮密钥和逆变换,以实现解密操作。 总的来说,SM4 算法的分组长度、密钥长度、S 盒和轮函数等组成部分在加密和解密过程中协 同工作,通过一系列的变换和操作来保证数据的安全性和机密性。分组长度决定了一次加密或解 密操作处理的数据量,密钥长度决定了密钥的复杂度和算法的安全性,S 盒用于进行字节替换 操作以增加非线性性,而轮函数则是实现加密和解密的核心部分,通过对数据进行混淆和加密 来保证数据的安全性。 二、实现 SM4 算法: (一)由于篇幅有限,源码由附件给出,在此仅展示实现 SM4 算法的加 密、解密及密钥扩展功能的核心代码及原理 ①加密算法实现 SM4 算法的加密过程,主要包括以下几个步骤: 明文分块:将输入的明文分成每个 8 字节(64 位)一块,存储在名为 cipher 的字符串数组中 的前四个元素中。密钥扩展:调用 KeyExtension 函数生成轮密钥,将生成的轮密钥存储在名为 rks 的字符串中。轮加密:循环执行 32 轮的加密操作。在每一轮中,进行一系列的 XOR 和 T 运 算,然后将结果存储在 cipher 数组中的相应位置。输出状态:在每一轮加密后,输出当前轮的 轮密钥和输出状态。返回密文:最后,将最后一轮的输出状态连接起来,形成最终的密文,并将 其作为函数的返回值。将 SM4 算法的加密过程分为明文分块、密钥扩展、轮加密和输出状态等步 骤,实现了对输入明文的加密操作。 ②解密算法的实现 主要包括以下几个步骤: 密文分块:将输入的密文分成每个 8 字节(64 位)一块,存储在名为 plain 的字符串数组中的 前四个元素中。密钥扩展:调用 KeyExtension 函数生成轮密钥,将生成的轮密钥存储在名为 rks 的字符串中。轮解密:循环执行 32 轮的解密操作。在每一轮中,进行一系列的 XOR 和 T 运 算,然后将结果存储在 plain 数组中的相应位置。输出状态:在每一轮解密后,输出当前轮的 轮密钥和输出状态。返回明文:最后,将最后一轮的输出状态连接起来,形成最终的明文,并将 其作为函数的返回值。将 SM4 算法的解密过程分为密文分块、密钥扩展、轮解密和输出状态等步 骤,实现了对输入密文的解密操作。 ③ 密钥扩展算法实现 密钥扩展过程,具体步骤如下:常量 FK 和 CK 的定义:定义了常量 FK 和 CK,分别用于密钥 扩展过程中的异或运算和 T 运算。初始轮密钥生成:将输入的主密钥 MK 分为每个 8 字节(64 位)一块,分别与 FK 进行异或运算,得到初始的四个轮密钥,并存储在名为 K 的字符串数组中 的前四个元素中。轮密钥扩展:循环执行 32 轮的密钥扩展操作。在每一轮中,进行一系列的 XOR 和 T2 运算,然后将结果存储在 K 数组中的相应位置,并将其连接起来形成完整的轮密钥序列。 返回轮密钥序列:将所有的轮密钥连接起来,形成完整的轮密钥序列,并将其作为函数的返回 值。实现了 SM4 算法中的密钥扩展过程,包括初始轮密钥的生成和 32 轮的轮密钥扩展操作,生 成的轮密钥序列用于加密和解密过程中的轮密钥异或运算。 三、功能测试和验证 (一)编写测试用例,测试用例应该覆盖各种情况,包括不同长度的明 文和密钥、不同的工作模式(如 ECB、CBC、CTR 等)、边界情况。 ①不同长度的明文和密钥 明文:0x012345 密钥:0x0123456789ABCDEFFEDCBA9876543210 明文:0x0123456789ABCDEFFEDCBA9876543210 密钥:0x012345 总结:在不足或超过 32 位时进行填充或截断 ②不同工作模式 ECB 模式: 明文:0x0123456789ABCDEFFEDCBA9876543210 密钥:0x0123456789ABCDEFFEDCBA9876543210 CBC 模式: 初始向量:0x0123456789ABCDEFFEDCBA9876543210 明文:0x0123456789ABCDEFFEDCBA9876543210 密钥:0x9876543210ABCDEFFEDCBA9876543210 CTR 模式: 明文:0x0123456789ABCDEFFEDCBA9876543210 密钥:0x0123456789ABCDEFFEDCBA9876543210 初始计数器:0x0000000000000000 综上,我设计的 SM4 算法可以应对不同的工作模式 ③边界情况 明文和密钥均为全 0: 明文:0x00000000000000000000000000000000 密钥:0x00000000000000000000000000000000 明文和密钥均为全 F: 明文:0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 密钥:0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 四、性能评估及优化 (一)SM4 算法进行性能评估 ①在代码添加可以检查时间及占用内存的算法,然后测试 测试结果如下: cpu 实时使用情况: 运行情况: (二)比较不同实现方式的性能,并探讨优化算法的方法,提高其效率 和性能 ①针对代码优化的方法: 减少字符串拼接操作:在 NLTransform、LTransform、L2Transform、T、T2 函数中,存在大 量的字符串拼接操作。这些操作可能会导致内存的频繁分配和释放,影响性能。可以考虑使用字 符数组或字符串缓冲区来减少拼接操作。 减少字符串与数值的转换:在 HexToDec、BinToHex、int_to_string 函数中,存在字符串 与数值之间的转换操作。这些操作可以直接在数值之间进行,避免额外的转换开销。 减少字符串遍历次数:在 HexToBin、XOR 函数中,存在对字符串的多次遍历操作。可以尝 试优化算法,减少遍历的次数,从而降低时间复杂度。 内存管理优化:在加密和解密过程中,通过 string 数组存储中间结果,可能会导致频繁 的内存分配和释放。可以考虑使用固定大小的缓冲区来优化内存管理。 ②经过优化的代码,主要包括减少字符串拼接操作、减少字符串与数值的转换以及避免重复计 算。成果展示: 总结:比较看出①加密快了 2ms② 解密快了 7ms 五、安全性分析 (一)对于我设计的代码 SM4 算法进行安全性分析,评估其抵抗各种攻 击(如差分攻击、线性攻击、穷举搜索攻击等)的能力 ①针对差分攻击的安全评估: 增加非线性变换的复杂性: 通过 NLTransform 函数实现了非线性变换,使用了预定义的 S 盒(Substitution Box),增加了混淆度和非线性性质。 增加轮数: 通过 T 函数和 T2 函数对明文进行了多轮的变换,每轮使用了不同的密钥轮 函数,增加了加密的复杂性和安全性。 密钥扩展的增强: KeyExtension 函数对密钥进行了扩展,使用了多轮的迭代运算,引入 了复杂的非线性变换,增强了密钥的复杂性和安全性。 ②针对线性攻击的安全性评估: 增加非线性变换:类似于对抗差分攻击的措施,通过 NLTransform 函数实现了 S 盒的非 线性变换,增加了算法的非线性特性。 增加轮数:与差分攻击相同,增加了多轮的变换,每轮的轮函数都引入了非线性变换和密 钥混淆,增加了算法的复杂性和安全性。 ③针对穷举搜索攻击的安全评估: 增加密钥长度:密钥的长度为 128 位(32 个十六进制字符),足够安全性和抗穷举搜索 攻击。 总结:我的代码通过增加非线性变换、增加轮数和保证足够的密钥长度,实现了一定程度上 的对抗差分攻击、线性攻击和穷举搜索攻击的能力 (二)调研 SM4 算法的安全特性和安全性分析方法, 并提出改进建议 ①安全特性和安全性分析方法的调研发现: SM4 算法是我国自主研制的分组密码算法,算法简单,易于在件和软件上实现,到目前为 止,SM4 算法还没有被攻破,目前仍然是安全 [3] 。SM4 加密算法以 128bit 的数据块为单位 与 128bit 的密钥实现异或、移位的线性变换和采用 S 盒的非线性变换,S 盒是一种非线 性结构,将明文块与轮密钥最大限度的混淆和扩散,增加明文与密文之间复杂程度,从而有效 地抵抗线性分析和差分分析。SM4 算法与 Feistel 网络和 SP 网络相比,以降低线性扩散 和差分扩散的速度提高非线性程度和降低芯片集成度。若考虑采用穷举攻击法攻击需要 2128 次运算,计算量很大,而 DES 算法只需 256 次运算,要想用穷举攻击法破解需要相当长的 时间,目前使用该破解方法是不可实现的。但 SM4 算法加密和解密使用同一密钥,收发双方 密钥交换时存在的安全隐患,这必将带来数据加密的安全问题。 基于这种考虑很多学者提出了使用混合的加密算法,Liu Hong [4] 提出用混合混沌系统和椭 圆密码曲线进行混合加密来处理图像问题,对图像加密安全性做全面分析,证明该混合加密方 案的可行性。马擎宇,张东 [5] 提出将 R ijndael 和椭圆曲线密码体制的混合加密算法应用到 遥感数据加密,使用 AES 对要传输的遥感数据进行加密,同时使用 ECC 加密 AES 密钥,这样 既能快速地对遥测数据进行加密,又能很好地解决密钥的管理和分配问题。伍娟 [6] 提出基于国 密 SM4 和 SM2 的混合加密算法实现,利用商用密码的对称加密算法和非对称加密算法的优 点,进行混合加密,通过实验验证了方案的正确性。但一个算法性能的评价标准不应该只是单一 的从算法的安全性和运行效率来来考虑,还应该结合实际的应用环境从多方面权衡。 ② 改进建议: 增加轮数是一种有效的提高密码算法安全性的方式。增加 SM4 算法的轮数可以增加算法的 复杂度,使得密码分析攻击的难度大大增加。通过引入更多的轮数,每轮的混淆和扩散操作都会 增加,从而增强算法的抗攻击能力,如差分攻击和线性攻击等。 改进密钥扩展算法可以使生成的轮密钥更加随机和安全。密钥扩展算法的质量直接影响到算 法的整体安全性,因此改进密钥扩展算法,增加密钥的随机性和扩散性,是提高算法安全性的 关键步骤之一。优化 S 盒置换算法是提高密码算法混淆性和扩散性的重要途径之一。通过增加 S 盒的非线性程度,可以有效提高算法的抗差分攻击和线性攻击的能力,增强算法的安全性。 增强随机性可以使密码算法更加不可预测,从而提高算法的安全性。在算法中引入更多的随 机性因素,如增加随机轮数、随机选择 S 盒等,可以增强算法的抗各种攻击的能力。密钥管理 的安全性直接关系到整个系统的安全性。加强密钥管理的安全性包括密钥的生成、存储、传输和 销毁等环节。有效的密钥管理措施可以防止密钥泄露和被破解,保护系统的安全性。通过增加轮 数、改进密钥扩展算法、优化 S 盒置换算法、增强随机性和加强密钥管理等措施,可以显著提高 SM4 算法的安全性,使其更加适用于各种安全要求较高的场景。 期末报告总结:   截至此时,本学期计算机密码学期末报告顺利完成,总用时 4 天 16 小时。从报告的开始到 结束,读了数十篇论文,看了上百篇博客,访问的网站内容涉及了各种密码学算法、安全漏洞和 攻击手法。有时候,某个概念理解起来比较困难,需要反复阅读和思考,某个算法或漏洞的理解 需要通过实际操作来加深,需要花费更多的时间去尝试和实,我在阅读大量的文献和博客花极 大的耐心和毅力,故余虽愚,卒获有所闻。   在研究过程中,深入了解了 TLS 协议的基本原理、常见攻击类型和防御措施。在我的报告 中,我详细介绍了 SM4 算法及其安全特性,并提出了改进建议,例如增加轮数、改进密钥扩展 算法、优化 S 盒置换算法、增强随机性和加强密钥管理等。这些改进措施可以有效提高 SM4 算 法的安全性,使其更适用于各种安全要求较高的场景。 此外,我还在第一部分(必选项)介绍了 BREACH 漏洞,对其原理和影响进行了分析,并 提出了相应的防御措施。了解了 BREACH 漏洞的攻击方式和影响范围,有助于我更好地加强对网 络安全的防护措施,保护个人和组织的信息安全。   在整个研究过程中,我不仅学到了专业知识,还提高了解决问题的能力和分析思维。通过深 入研究和探索,我对密码学和网络安全有了更深入的理解,特别是对于国密 SM4 的调研过程 中,我第一次认识到国产商用密码的伟大。一位前辈的博客下的一段话更我震撼不已——“没有 网络安全就没有国家安全,没有信息化就没有现代化。世界一流强国,必然是世界一流的网络强 国。信息网络基础设施及其核心技术是赢得未来的关键,网络安全买不来、等不来、要不来”。   由衷倾佩推广国密算法的前辈们的毅力,支持国密,研究国密,使用国密。在未来,我将继 续保持对密码学领域的热情和探索,不断提升自己的专业能力,为信息安全事业贡献自己的一 份力量,让我们接过前辈的旗帜,为建设网络强国添砖加瓦。共勉!同时,这次艰辛的期末报告 经历也将成为我人生道路上宝贵的财富,激励我在面对困难时永不放弃,勇往直前。

标签:加密,SM4,解密,密码,算法,国密,密钥,安全性
From: https://blog.csdn.net/qq_63117516/article/details/140103826

相关文章

  • 51单片机项目:进阶版密码锁(附代码详解)
    一、基本功能简介1.四位密码锁        默认密码为1201(小彩蛋*1),后续可自由修改密码。2.输入密码        按下不同按键,输入相应的数字(最多输入四位,输入少于四位使用0补全)按键与数字对应表按键数字S11S22S33S44S55S66S77S88S99S100......
  • Win10查看WiFi密码
    我们经常会忘记自己的WiFi密码,但又需要在其他设备上连接同一个WiFi网络。在这种情况下,我们需要知道如何在Windows10中查看已连接的WiFi密码。这篇文章将详细介绍如何在Win10中查看WiFi密码。方法一:使用命令提示符步骤1:以管理员权限运行命令提示符按下Win+X键,选择“命令提......
  • OpenWrt 无法通过 ssh 免密码方式访问 git 服务器的原因及解决方案
    问题原因openssh-keygen和openssh-client非OpenWrt默认安装的包ssh-keygen生成的私钥PRIVATEKEY不是600权限,而是644权限,权限太开放会导致SSH拒绝使用它解决方案安装相关包opkgupdateopkginstallopenssh-client openssh-keygen生成密钥对ssh-keygen......
  • JAVA【案例5-2】模拟默认密码自动生成
    【模拟默认密码自动生成】1、案例描述本案例要求编写一个程序,模拟默认密码的自动生成策略,手动输入用户名,根据用户名自动生成默认密码。在生成密码时,将用户名反转即为默认的密码。2、案例目的(1)学会分析“模拟默认密码的生成”案例的实现思路(2)根据思路完成“模拟默认密码的......
  • 密码、手机等隐私信息的保存方式
    将用户密码以密文形式存储进数据库是保护用户信息安全的重要措施。以下是一些常见的密码加密存储方案:哈希加密:使用哈希函数(如SHA-256,SHA-1,MD5等)将密码转换为固定长度的哈希值。SHA-256是目前较为安全的哈希算法,它生成的哈希值长度为64个字符,极大地提高了安全性。需要注......
  • ubuntu修改root密码以及开启root ssh远程连接
    root密码ubuntu默认的root用户是没有固定密码的,它的密码是随机产生并且动态改变的,即每次开机都有一个新的root密码,所以拿到一台新的Ubuntu系统服务器后,我们需要设置一个固定的root密码。修改root用户密码sudopasswd然后它会提示你输入安装操作系统时初始用户的密......
  • 在Linux中,如何重置 mysql root 密码?
    在Linux系统中重置MySQL的root密码通常有几种方法,以下是一些常见的步骤:1.使用mysqladmin命令首先,停止MySQL服务:sudosystemctlstopmysql以安全模式启动MySQL,允许root用户无密码登录:sudomysqld_safe--skip-grant-tables&连接到MySQL服务器:mysql-uroot选......
  • 密码登录
    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespaceWindowsFormsApplication1{publicpartialclassFor......
  • 草船借箭:通过ssh蜜罐来获取常用密码本
    很早之前就看过类似的方法:由于具有公网IP的云服务器几乎每一刻都会有人尝试登录,将TCP/22端口背后的SSH服务端替换为SSH蜜罐,记录所有登录尝试,就可以收集大量的用户名和密码。前两天在知乎看到一个实操:https://zhuanlan.zhihu.com/p/659197095效仿了一下,效果不错,于是记录一......
  • python pta 7-43 密码强度
    本题目要求根据输入密码字符串(字符串长度大于6),密码只能由大写字母、小写字母、数字及下划线四种类型组成,其密码强度为包含类型的数量,例如包含大小写则密码强度为2,四种类型全包含则为4.若包含其他类型的字符则输出IllegalPassword.输入样例1:在这里给出一组输入。例如:123456......