【密码学——基础理论与应用】李子臣编著 第四章 SM4分组密码算法 课后习题

server/2025/3/18 12:40:48/

免责声明

这里都是自己搓或者手写的。
里面不少题目感觉有问题或者我的理解有偏颇,请大佬批评指正!
不带思考抄作业的请自动退出,我的并非全对,仅仅提供思维!

SM4的python实现

基于AI生成的SM4加密算法-CSDN博客

题目

逐题解析

4.1

B  这个不用解析吧,,,

4.2

B4 也不用解释吧,,,

4.3

答案:SM4的加密轮函数,加密变换:

将SM4的加密轮函数,分成加密函数G和数据交换E;

轮函数

 

这说明加密函数G是对合的。

因为,E变换为

显然,E是对合运算。综上,轮函数是对合的。

SM4的加密过程为:

SM4的解密过程为:

比较 SM4 和 SM4^{-1} 可知,运算相同,只有密钥的使用顺序不同。所以SM4是对合的。

4.4

答案:SM4的加密过程的数据变化:

(其中最后一步变换为反序)

密文(Y0,Y1,Y2,Y3)解密过程数据的变化:

(其中最后一步变换为反序)

所以SM4是可逆的。

4.5

python"># 设置一个128位的密钥
keystr = "Love you perfect"
key = 0x0123456789abcdeffedcba9876543210  # 32*4
# S盒
s = [[214, 144, 233, 254, 204, 225, 61, 183, 22, 182, 20, 194, 40, 251, 44, 5],[43, 103, 154, 118, 42, 190, 4, 195, 170, 68, 19, 38, 73, 134, 6, 153],[156, 66, 80, 244, 145, 239, 152, 122, 51, 84, 11, 67, 237, 207, 172, 98],[228, 179, 28, 169, 201, 8, 232, 149, 128, 223, 148, 250, 117, 143, 63, 166],[71, 7, 167, 252, 243, 115, 23, 186, 131, 89, 60, 25, 230, 133, 79, 168],[104, 107, 129, 178, 113, 100, 218, 139, 248, 235, 15, 75, 112, 86, 157, 53],[30, 36, 14, 94, 99, 88, 209, 162, 37, 34, 124, 59, 1, 33, 120, 135],[212, 0, 70, 87, 159, 211, 39, 82, 76, 54, 2, 231, 160, 196, 200, 158],[234, 191, 138, 210, 64, 199, 56, 181, 163, 247, 242, 206, 249, 97, 21, 161],[224, 174, 93, 164, 155, 52, 26, 85, 173, 147, 50, 48, 245, 140, 177, 227],[29, 246, 226, 46, 130, 102, 202, 96, 192, 41, 35, 171, 13, 83, 78, 111],[213, 219, 55, 69, 222, 253, 142, 47, 3, 255, 106, 114, 109, 108, 91, 81],[141, 27, 175, 146, 187, 221, 188, 127, 17, 217, 92, 65, 31, 16, 90, 216],[10, 193, 49, 136, 165, 205, 123, 189, 45, 116, 208, 18, 184, 229, 180, 176],[137, 105, 151, 74, 12, 150, 119, 126, 101, 185, 241, 9, 197, 110, 198, 132],[24, 240, 125, 236, 58, 220, 77, 32, 121, 238, 95, 62, 215, 203, 57, 72]]def string_to_128bit_hex_number(input_string):# 将字符串中的每个字符转换为 ASCII 码值,再转换为两位的十六进制数hex_string = ''.join(f"{ord(char):02x}" for char in input_string)# 将十六进制字符串转换为整数hex_number = int(hex_string, 16)print("密钥key的十六进制表示: "+hex_string)return hex_numberdef Sbox(input_int):# 将输入的十六进制数转换为整数row = input_int // 16col = input_int % 16output_int = s[row][col]return output_intdef T(a, b, c, d, shifts):"""通用的T函数,用于T1和T2"""temp = a ^ b ^ c ^ dparts = [(temp >> (24 - 8 * i)) & 0xFF for i in range(4)]res = [Sbox(part) for part in parts]# print(parts,res) # 非常重要的检验中间过程的语句,S的机算可能是错的B = (res[0] << 24) | (res[1] << 16) | (res[2] << 8) | res[3]result = Bfor shift in shifts:result ^= ((B << shift) | (B >> (32 - shift))) & 0xFFFFFFFF # 确保结果是32位return resultdef T2(K1, K2, K3, CK):"""T2函数"""return T(K1, K2, K3, CK, [13, 23])def jiamimiyao():# 如果需要将整数转换为二进制字符串binary_key = bin(key)[2:].zfill(128)  # 确保长度为128位print(f"key 的二进制表示: {binary_key}")# 定义掩码(32位掩码)mask = (1 << 32) - 1MK0 = (key >> 96) & mask  # 前32位MK1 = (key >> 64) & mask  # 第33到64位MK2 = (key >> 32) & mask  # 第65到96位MK3 = key & mask          # 第97到128位return MK0, MK1, MK2, MK3def lunmiyao(MK0, MK1, MK2, MK3):FK0 = 0xa3b1bac6FK1 = 0x56aa3350FK2 = 0x677d9197FK3 = 0xb27022dcck = [[0 for _ in range(32)] for _ in range(4)]CK = [0]*32for i in range(32):  # 遍历每一列for j in range(4):  # 遍历每一行ck[j][i] = (4*i+j)*7 % 256  # 注意这里填充的是 ck[j][i]# 将 CK[i] 转换为整数CK[i] = (ck[0][i] << 24) | (ck[1][i] << 16) | (ck[2][i] << 8) | ck[3][i]K = [0] * 36# 计算异或结果K[0] = MK0 ^ FK0K[1] = MK1 ^ FK1K[2] = MK2 ^ FK2K[3] = MK3 ^ FK3for i in range(32):K[i+4] = K[i] ^ T2(K[i+1], K[i+2], K[i+3], CK[i])print(f"rk[{i}] = {hex(K[i+4])}")return Kif __name__ == "__main__":string_to_128bit_hex_number(keystr)MK0, MK1, MK2, MK3 = jiamimiyao()K = lunmiyao(MK0, MK1, MK2, MK3)

4.6

python">input_num = 0xAE260F63def T(input_num, shifts):"""通用的T函数,用于T1和T2"""B = input_numresult = Bfor shift in shifts:result ^= ((B << shift) | (B >> (32 - shift))) & 0xFFFFFFFF # 确保结果是32位return resultdef T1(K):"""T1函数"""return T(K, [2, 10, 18, 24])if __name__ == "__main__":result = T1(input_num)print("线性变换的输出是: "+hex(result))

http://www.ppmy.cn/server/175957.html

相关文章

【云原生技术】容器技术的发展史

一、Jail 时代 容器不是一个新概念或者新技术&#xff0c;很早就有了&#xff0c;只是近几年遇到了云计算&#xff0c;整个技术 被彻底引爆了。 1.1 1979年 贝尔实验室发明 chroot chroot系统调用是在 1979 年开发第 7 版 Unix 期间引入的。贝尔实验室在 Unix V7 的 开发过程…

【STM32】USART串口协议串口外设-学习笔记

串口协议 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统。比如STM32芯片内部集成了很多功能模块&#xff0c;像定时器计数、PWM输出、AD采集等等。这些都是芯片内部的电路&#xff0c;这些电路的配置寄存器&#xff0c;数据寄存…

C++ 类和对象----构造函数

一、构造函数 概念&#xff1a; 在平时初始化&#xff0c;都要调用Init公有方法来初始化&#xff0c;调用比较频繁&#xff0c;因此&#xff0c;构造函数就是在对象创建时&#xff0c;就将信息设置进去。 没有构造函数前&#xff1a; #include<iostream> using namesp…

【蓝桥杯速成】| 5.动态规划

学习资料 代码随想录 动态规划五部曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 简单题 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#…

网络层协议

目录 一、网段划分的发展过程 &#xff08;1&#xff09;固定长度的网络号 &#xff08;2&#xff09;子网掩码---网络号长度不再固定 二、公有IP和私有IP &#xff08;1&#xff09;私有IP &#xff08;2&#xff09;NAT技术 三、IP协议报头 分片操作 四、查看一下li…

Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(一)

WDDM 3.0 之前的翻转队列模型 许多新式显示控制器支持对按顺序显示的多个帧排队的能力。 从 WDDM 2.1 开始&#xff0c;OS 支持将在下一个 VSync 中显示的多个未完成的翻转覆盖请求。 显示微型端口驱动程序 (KMD) 通过 DXGK_DRIVERCAPS 中的 MaxQueuedMultiPlaneOverlayFlipVS…

算法016——最小覆盖子串

力扣——最小覆盖子串&#xff08;点击跳转&#xff09; 分析题目 我们先随便从一个位置开始&#xff0c;让 right 右移&#xff0c;直到找到符合题目的位置停下 之后&#xff0c;让 left 右移&#xff0c;此时会出现两种情况 仍然符合要求&#xff0c;right 不需要动不符合…

MiddleVR for Unity插件

MiddleVR for Unity插件 “Unity为一款3D应用程序开发工具&#xff0c;使您能够专注于创造令人惊叹的3D应用。”MiddleVR是一个完美的Unity插件&#xff0c;可在几分钟内为你的Unity应用程序带来身临其境的性能&#xff01; MiddleVR For Unity增加了以下功能&#xff1a; • …