首页 > 编程语言 >SM4算法学习

SM4算法学习

时间:2023-12-13 20:44:57浏览次数:32  
标签:xi sbox ki SM4 学习 32bit 算法 密钥 output

简介

SM4算法是我国商用密码标准,其前身是SMS4算法。SM4算法是一个分组加密算法,分组长度和密钥长度均128bit。SM4算法使用32轮的非线性迭代结构。SM4在最后一轮非线性迭代之后加上了一个反序变换,因此SM4中只要解密密钥是加密密钥的逆序,它的解密算法与加密算法就可以保持一致。

SM4算法过程

加解密

输入的明文为 128bit 的数据,将其按位拆分成 4 个 32bit 的数据 x0,x1,x2,x3
当 i=0 时为第一次轮变换,一直进行到 i=31 结束
xi 暂时不做处理,将 xi+1,xi+2,xi+3 和轮密钥 rki 异或得到一个 32bit 的数据,作为盒变换的输入
即 sbox_input=xi+1⊕xi+2⊕xi+3⊕rki,⊕ 符号代表异或运算
将 sbox_input 拆分成 4 个 8bit 数据,分别进行盒变换,之后再将 4 个 8bit 输出合并成一个 32bit 的 sbox_output
将刚才获得的 sbox_output 分别循环左移 2,10,18,24 位,得到 4 个 32bit 的结果,记移位结果为 y2,y10,y18,y24
将移位的结果 y2,y10,y18,y24 与盒变换输出 sbox_output 和 xi 异或,得到 xi+4
即 xi+4=sbox_output⊕y2⊕y10⊕y18⊕y24⊕xi
至此完成了一轮的加解密运算
在实际加解密过程中,上述运算要执行 32 轮,同时使用 32 个不同的 rki,rki 由密钥拓展生成
最后将生成的最后 4 个 32bit 数据 x35,x34,x33,x32 合并成一个 128bit 的数据 output,作为最后的输出结果

密钥拓展

密钥拓展的过程和加解密大同小异
输入的原始密钥 key 为 128bit 的数据,将其按位拆分成 4 个 32bit 的数据 K0,K1,K2,K3
将初始密钥 K0,K1,K2,K3 分别异或固定参数 FK0,FK1,FK2,FK3 得到用于循环的密钥 k0,k1,k2,k3
即 k0=K0⊕FK0,k1=K1⊕FK1,k2=K2⊕FK2,k3=K3⊕FK3
进入轮密钥 rki 的生成
当 i=0 时为第一次轮变换,一直进行到 i=31 结束
ki 暂时不做处理,将 ki+1,ki+2,ki+3 和固定参数 CKi 异或得到一个 32bit 的数据,作为盒变换的输入
即 sbox_input=ki+1⊕ki+2⊕ki+3⊕cki
将 sbox_input 拆分成 4 个 8bit 数据,分别进行盒变换,之后再将 4 个 8bit 输出合并成一个 32bit 的 sbox_output
将刚才获得的 sbox_output 分别循环左移 13,23 位,得到 2 个 32bit 的结果,记移位结果为 y13,y23
将移位的结果 y13,y23 与盒变换输出 sbox_output 和 ki 异或,得到 ki+4
即 rki=ki+4=sbox_output⊕y13⊕y23⊕ki
至此完成了一轮的加解密运算
在实际加解密过程中,上述运算要执行 32 轮,同时使用 32 个不同的 CKi,CKi 为固定参数
执行完 32 轮后,便可获得 32 个用于加解密的 rki

标签:xi,sbox,ki,SM4,学习,32bit,算法,密钥,output
From: https://www.cnblogs.com/20211404yht/p/17899883.html

相关文章

  • 基于AlexNet深度学习网络的智能垃圾分类系统matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述       基于AlexNet深度学习网络的智能垃圾分类系统是一种利用深度学习技术,对垃圾图像进行分类的系统。下面将详细介绍这种系统的原理和数学公式。 3.1、基于AlexNet深度学习网络的......
  • Rong晔大佬教程学习(3):取译码
    在讲解指令译码之前,我们首先需要了解指令,如下图所示,ARM、MIPS、RISCV-v指令集同属于RISC指令集(精简指令集),特别注意的是,相同的一条指令在不同的ISA中译码得到的结果是不同的,这也很好理解,比如“nihao”在拼音中可以翻译为“你好”,就是打招呼的意思,但在英文中这甚至不是一个单词......
  • openGauss学习笔记-156 openGauss 数据库运维-备份与恢复-导出数据-使用gs_dump和gs_d
    openGauss学习笔记-156openGauss数据库运维-备份与恢复-导出数据-使用gs_dump和gs_dumpall命令导出数据-导出单个数据库-导出数据库156.1导出数据库openGauss支持使用gs_dump工具导出某个数据库级的内容,包含数据库的数据和所有对象定义。可根据需要自定义导出如下信息:导出......
  • openGauss学习笔记-157 openGauss 数据库运维-备份与恢复-导出数据-使用gs_dump和gs_d
    openGauss学习笔记-157openGauss数据库运维-备份与恢复-导出数据-使用gs_dump和gs_dumpall命令导出数据-导出单个数据库-导出模式157.1导出模式openGauss目前支持使用gs_dump工具导出模式级的内容,包含模式的数据和定义。用户可通过灵活的自定义方式导出模式内容,不仅支持选定一......
  • 算法战斗第二天C++1
    A.TeamOnedaythreebestfriendsPetya,VasyaandTonyadecidedtoformateamandtakepartinprogrammingcontests.Participantsareusuallyofferedseveralproblemsduringprogrammingcontests.Longbeforethestartthefriendsdecidedthattheywi......
  • 代码随想录算法训练营第一天| LeetCode704 二分查找、27移除元素
     Leetcode704:二分查找今日学习的文章链接:代码随想录(programmercarl.com) 题目链接:704.二分查找-力扣(LeetCode)●  自己看到题目的第一想法这题我会,但是还没明白卡尔说的循环不变量是什么意思。我的固定思路就是,target比中间值大,左指针右移到mid+1;target比中间值......
  • Jmeter性能测试学习笔记
    转自https://www.cnblogs.com/yoyoma0355/p/14658807.htmljmeter定时器:https://blog.csdn.net/u013258415/article/details/78321288 性能测试的概念和公式:https://www.cnblogs.com/April-Chou-HelloWorld/p/8780384.html 压力测试:https://blog.csdn.net/weixin_52295158/a......
  • 百度 推荐 投的cpp开发 不知道怎么给的推荐算法的岗位
    判断(){}是否合法?多线程通信方式手段?成员函数模板 类模板智能指针底层原理为什么引入linux文本定位到最后一行vi进入之后:$定位到最后一行  一、使用cat、tail、head组合1、查看最后100行的数据 catfilename|tail-n1002、查看100到300行的数据 cat......
  • Solidity基本语法学习5
    文档:https://solidity-by-example.org/视频教程:https://www.youtube.com/watch?v=xv9OmztShIw&list=PLO5VPQH6OWdVQwpQfw9rZ67O6Pjfo6q-p说明本文内容payable,SendingEther(transfer,send,call),Fallback,Call,DelegateCall,functionselector,CallingOtherC......
  • 算法学习Day1,二分查找,移除元素
    Day1二分查找,移除元素ByHQWQF2023/12/13笔记704.二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。解法:使用二分查找来在一个有序的数组中找到指定元素的下标。根据数据边界......