1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| matx = [[0x12, 0x1D, 0x10, 0x13, 0x1B], [0x8, 0x1F, 0x8, 0x17, 0x1E], [0x1D, 0x3, 0x1C, 0xA, 0x15], [0x12, 0x1D, 0x08, 0x10, 0x1C], [0x0B, 0x1E, 0x07, 0x14, 0x07],]
from z3 import *
rows = 5 cols = 5
arr = [[z3.BitVec(f'arr_{i}_{j}', 6) for j in range(cols)] for i in range(rows)] s = Solver()
for k in range(5): for m in range(5): v28 = 0 for i in range(5): v28 = ((arr[i][m]&0xff) * (matx[k][i]&0xff) + (v28&0xff)) & 0x1f if k == m: s.add(v28 == 1) if k != m: s.add(v28 == 0)
inv = [] if s.check() == sat: model = s.model() for i in range(rows): row = [model.evaluate(arr[i][j]).as_long() for j in range(cols)] inv.append(row) else: print("err")
print("v18的逆矩阵为:") print(inv)
for i in range(len(inv)): if i == 0: continue elif i == 4: inv[i][0], inv[i][1], inv[i][2], inv[i][3], inv[i][4] = inv[i][1], inv[i][2], inv[i][3], inv[i][4], inv[i][0] elif i == 3: inv[i][0], inv[i][1], inv[i][2], inv[i][3], inv[i][4] = inv[i][2], inv[i][3], inv[i][4], inv[i][0], inv[i][1] elif i == 2: inv[i][0], inv[i][1], inv[i][2], inv[i][3], inv[i][4] = inv[i][3], inv[i][4], inv[i][0], inv[i][1], inv[i][2] elif i == 1: inv[i][0], inv[i][1], inv[i][2], inv[i][3], inv[i][4] = inv[i][4], inv[i][0], inv[i][1], inv[i][2], inv[i][3]
print("调换位置后的逆矩阵:") print(inv)
xor_arr = [[0x1B, 0x00, 0x0A, 0x0D, 0x08], [0x18, 0x0F, 0x1C, 0x06, 0x07], [0x12, 0x05, 0x0C, 0x02, 0x04], [0x1D, 0x1F, 0x09, 0x13, 0x01], [0x1E, 0x11, 0x0B, 0x16, 0x19]]
for k in range(5): for m in range(5): inv[k][m] ^= xor_arr[k][m] print("异或后的矩阵:") print(inv)
index_arr = [0x00000010, 0x0000000E, 0x0000000D, 0x00000002, 0x0000000B, 0x00000011, 0x00000015, 0x0000001E, 0x00000007, 0x00000018, 0x00000012, 0x0000001C, 0x0000001A, 0x00000001, 0x0000000C, 0x00000006, 0x0000001F, 0x00000019, 0x00000000, 0x00000017, 0x00000014, 0x00000016, 0x00000008, 0x0000001B, 0x00000004, 0x00000003, 0x00000013, 0x00000005, 0x00000009, 0x0000000A, 0x0000001D, 0x0000000F]
for k in range(5): for m in range(5): inv[k][m] = index_arr.index(inv[k][m]) print("索引:") print(inv)
chr_arr = [0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A] for i in range(5): for j in range(5): print(chr(chr_arr[inv[i][j]]), end='') print('-', end='')
|