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

[复制链接]
发表于 2025-10-13 06:20:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
免责声明

这里都是自己搓大概手写的。
内里不少标题感觉有标题大概我的明白有偏颇,请大佬品评指正!
不带思索抄作业的请自动退出,我的并非全对,仅仅提供头脑!
SM4的python实现

基于AI天生的SM4加密算法-CSDN博客
标题



逐题分析

4.1

B  这个不消分析吧,,,
4.2

B4 也不消表明吧,,,
4.3

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



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



 
这分析加密函数G是对合的。
由于,E变更为


显然,E是对合运算。综上,轮函数是对合的。
SM4的加密过程为:

SM4的解密过程为:

比力 
 和 
 可知,运算雷同,只有密钥的利用次序差别。以是SM4是对合的。
4.4

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


(此中末了一步变更为反序)
密文(Y0,Y1,Y2,Y3)解密过程数据的变革:


(此中末了一步变更为反序)


以是SM4是可逆的。
4.5

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

  1. input_num = 0xAE260F63
  2. def T(input_num, shifts):
  3.     """通用的T函数,用于T1和T2"""
  4.     B = input_num
  5.     result = B
  6.     for shift in shifts:
  7.         result ^= ((B << shift) | (B >> (32 - shift))) & 0xFFFFFFFF # 确保结果是32位
  8.     return result
  9. def T1(K):
  10.     """T1函数"""
  11.     return T(K, [2, 10, 18, 24])
  12. if __name__ == "__main__":
  13.     result = T1(input_num)
  14.     print("线性变换的输出是: "+hex(result))
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表