LOADING

加载过慢请开启缓存 浏览器默认开启

矩阵逆向初步学习

基本操作

numpy实现

import numpy as np
#rows行 ,cols列
Z = np.zeros((rows, cols)) #创建全为0的矩阵

G=np.array(list).reshape(rows,cols) #转列表为一维矩阵,并用.reshape(rows,cols)重新规划行列数rows=-1时自动识别

G.tolist() #转为列表

C = A @ B #矩阵乘法
C = A + B # +
C = A - B # -

np.rot90(G,k=1) #顺时针旋转k*90度,k<0时逆时针转动

invA = np.linalg.inv(A) #求逆
A.flatten() #降维,压缩

print(np.array2string(C,max_line_width=np.inf)) #不换行输出

C = A @ B
A = C @ invB
B = invA @ B

A.astype(int) #转换类型

卷积

import numpy as np

def conv2d(input_matrix, kernel, stride=1, padding=0):
    """
    :param input_matrix: 输入的二维矩阵(numpy 数组)
    :param kernel: 卷积核(二维 numpy 数组)
    :param stride: 步幅
    :param padding: 零填充数量(在输入矩阵周围填充0)
    :return: 卷积后的矩阵(numpy 数组)
    """

    input_matrix = np.array(input_matrix)
    kernel = np.array(kernel)

    # 获取尺寸
    in_h, in_w = input_matrix.shape
    k_h, k_w = kernel.shape

    # 添加 padding
    if padding > 0:
        input_matrix = np.pad(input_matrix, ((padding, padding), (padding, padding)), mode='constant', constant_values=0)

    # 计算输出尺寸
    out_h = (input_matrix.shape[0] - k_h) // stride + 1
    out_w = (input_matrix.shape[1] - k_w) // stride + 1

    # 创建输出矩阵
    output = np.zeros((out_h, out_w))

    # 进行卷积运算
    for i in range(out_h):
        for j in range(out_w):
            region = input_matrix[i*stride:i*stride+k_h, j*stride:j*stride+k_w]
            output[i, j] = np.sum(region * kernel)

    return output

sage实现

from sage.all import Zmod, matrix
# RR实数域,ZZ整数域,GF(x)有限域
Fp = Zmod(2**bit - 1) #自定义域,bit为2进制位数

m = matrix(Fp,rows,cols,list) #定义矩阵

m = m.stack(vector(list) #矩阵后添加一行(vector规定为一个向量)
m = m.insert_row(index, vector(list)) #指定行插入
m[r,c] #取值
m[r] #取行
m.rank() #秩
m.nrows() #将返回矩阵行数
m.ncols() #将返回矩阵列数
m.determinant() #行列式
m.inverse() && ~m ##求逆
C = A * B #乘法,用逆求解同上
A = B.solve_left(C) #A在B的左
B = A.solve_right(C)#B在A的右
[list(row) for row in m] #转二维列表
 m.list() #按行转为列表

卷积

def conv2d_sage(input_matrix, kernel, stride=1, padding=0, base_ring=RR):
    """
    :param input_matrix: 输入的二维列表或矩阵
    :param kernel: 卷积核(二维列表或矩阵)
    :param stride: 步幅(默认为 1)
    :param padding: 填充像素(默认为 0)
    :param base_ring: 运算域,如 RR, ZZ, GF(7)
    :return: 卷积后的矩阵(Sage Matrix)
    """
    # 确保输入是矩阵类型
    A = matrix(base_ring, input_matrix)
    K = matrix(base_ring, kernel)

    in_h, in_w = A.nrows(), A.ncols()
    k_h, k_w = K.nrows(), K.ncols()

    # 添加 padding
    if padding > 0:
        zero_block = lambda r, c: matrix(base_ring, r, c, 0)
        A = block_matrix([
            [zero_block(padding, padding), zero_block(padding, in_w), zero_block(padding, padding)],
            [zero_block(in_h, padding), A, zero_block(in_h, padding)],
            [zero_block(padding, padding), zero_block(padding, in_w), zero_block(padding, padding)]
        ])

    padded_h, padded_w = A.nrows(), A.ncols()
    out_h = (padded_h - k_h) // stride + 1
    out_w = (padded_w - k_w) // stride + 1

    output = Matrix(base_ring, out_h, out_w)

    for i in range(out_h):
        for j in range(out_w):
            region = A.submatrix(i * stride, j * stride, k_h, k_w)
            output[i, j] = sum((region * K).list())

    return output

演示

CODEGATE2025

下面用CODEGATE2025的一道题来了解一些矩阵操作。

其实就是一些矩阵的操作,如下图image-20250501004816271

前面的密钥填充和拓展可以直接动调获取。

输入24*24大小的数据,断点在第一个block3()函数。这里ida有点问题调试看不到变量的数据,可以单步进入block3()函数在进行第一步操作前查看buf的值。

image-20250501010653089

看到矩阵的结构,其实就是用密钥和0包围了一圈,这样的26x26矩阵刚好被3x3的矩阵卷积为24x24的矩阵进行操作。

后面的矩阵操作都基于这个24x24的矩阵,把接下来的操作用python模拟一下。

import numpy as np

def op1(A): #卷积操作
    B = np.zeros((24, 24), dtype=int)
    for i in range(24):
        for j in range(24):
            values = [
                A[i + 2][j + 2], A[i + 2][j + 1], A[i + 2][j],
                A[i + 1][j + 2], A[i + 1][j + 1], A[i + 1][j],
                A[i][j + 2], A[i][j + 1], A[i][j]
            ]
            B[i][j] = sum(values)
    return B

init = [0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x43,0x30,0x44,0x33,0x47,0x41,0x54,0x33,0x43,0x30,0x44,0x33,0x47,0x41,0x54,0x33,0x43,0x30,0x44,0x33,0x47,0x41,0x54,0x33,0x0,0x0,0x30,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x43,0x0,0x0,0x44,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x30,0x0,0x0,0x33,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x44,0x0,0x0,0x47,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33,0x0,0x0,0x41,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x47,0x0,0x0,0x54,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x41,0x0,0x0,0x33,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x54,0x0,0x0,0x43,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33,0x0,0x0,0x30,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x43,0x0,0x0,0x44,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x30,0x0,0x0,0x33,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x44,0x0,0x0,0x47,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33,0x0,0x0,0x41,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x47,0x0,0x0,0x54,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x41,0x0,0x0,0x33,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x54,0x0,0x0,0x43,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33,0x0,0x0,0x30,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x43,0x0,0x0,0x44,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x30,0x0,0x0,0x33,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x44,0x0,0x0,0x47,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33,0x0,0x0,0x41,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x47,0x0,0x0,0x54,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x41,0x0,0x0,0x33,0x43,0x30,0x44,0x33,0x47,0x41,0x54,0x33,0x43,0x30,0x44,0x33,0x47,0x41,0x54,0x33,0x43,0x30,0x44,0x33,0x47,0x41,0x54,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]

init = np.array(init).reshape(-1,26) #把一维列表转为二维矩阵
print("拓展后的矩阵:")
print(np.array2string(init,max_line_width=np.inf)) #不换行打印矩阵

A = op1(init.astype(int).tolist()) #3x3卷积
print("卷积后的矩阵:")
print(np.array2string(A,max_line_width=np.inf))

A = np.rot90(A, k=-1) #顺时针旋转90度
print("顺时针旋转90度:")
print(np.array2string(A,max_line_width=np.inf))

B = [0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1]
B = np.array(B).reshape(-1,24)
C = A @ B #相乘
C %= 0xffff
print("A*B")
print(np.array2string(C,max_line_width=np.inf))

D = B @ C #相乘
D %= 0xffff
print("B*C")
print(np.array2string(D,max_line_width=np.inf))

D = np.rot90(D, k=1) #顺时针旋转90度
print("顺时针旋转90度")
print(np.array2string(D,max_line_width=np.inf))

E = [0x54,0x12,0x2,0x2,0x4C,0x41,0x33,0x51,0x3F,0xC,0x6,0x18,0x40,0x43,0x34,0x47,0x5F,0x22,0x62,0x21,0x5E,0x1A,0x27,0x4D,0x33,0x56,0x48,0x2C,0x10,0x4,0x49,0x2,0x1C,0x28,0x4D,0x1C,0x3F,0x2B,0x17,0x19,0x27,0x42,0x52,0x46,0x3C,0x0,0x39,0x41,0x29,0x9,0x62,0x27,0x15,0x17,0x1A,0x1D,0x19,0x48,0x56,0x12,0x0,0x4,0x37,0x4A,0x3F,0x0,0x4B,0x19,0x3F,0x37,0x39,0x24,0xE,0x59,0x15,0xB8,0x11,0x3D,0x9,0x21,0x46,0x25,0x63,0x3F,0x4,0x17,0x59,0x5F,0x3E,0x61,0x51,0x1E,0x52,0x36,0x1,0x1B,0x25,0xC,0x13,0x3A,0x8C,0x61,0x44,0x2E,0x22,0x22,0x3E,0x62,0x39,0x56,0x3E,0x1E,0x2C,0x3B,0x32,0xD,0x32,0x4F,0x4C,0x43,0x60,0x32,0x2D,0x15,0x55,0xAE,0x6,0x5A,0x22,0x11,0x53,0x55,0x2F,0x1B,0x1D,0x13,0xB,0x26,0x38,0x21,0x59,0xA,0x33,0x52,0x62,0xF,0x18,0x53,0x2B,0x2C,0x8A,0x1,0x34,0x49,0x4D,0x3,0x25,0x9,0x3F,0x18,0x5D,0x3C,0x2C,0x24,0x44,0x11,0x1,0x18,0x28,0x38,0x3A,0x4D,0x1F,0x45,0xF,0x10,0x34,0xC,0x1A,0x2E,0x5E,0x1,0x31,0x59,0x6,0x33,0x39,0x7,0x5,0x4A,0xB,0x35,0x62,0x41,0x1B,0x15,0x60,0x31,0x19,0x27,0x9C,0x4D,0x27,0x4F,0x4F,0x21,0x7,0x38,0x63,0x32,0x2A,0x58,0xF,0x2F,0x5F,0x15,0x3B,0x11,0x4F,0x5E,0x2D,0x5,0xF,0xE,0x29,0x42,0x26,0x3C,0x13,0x4F,0x12,0x2B,0x41,0x11,0x9,0x6,0x41,0x38,0xE,0x7,0x44,0x2B,0x1,0x3E,0x1A,0x53,0x43,0x2C,0x3,0xC,0x32,0x0,0x4F,0xF,0x5B,0x60,0x58,0x47,0x4B,0x10,0x6,0xA,0x31,0x47,0x19,0x10,0x35,0xA,0x4E,0x6,0x17,0x7,0x56,0x4C,0x3B,0x58,0x18,0x18,0x2E,0x4B,0x50,0x8,0x42,0x1D,0x2E,0x59,0x59,0x34,0x5E,0x16,0x42,0x4,0x12,0x47,0x20,0x21,0x2,0x20,0x34,0x5,0x78,0x44,0x15,0x40,0x60,0x2A,0x59,0x27,0x17,0x62,0x5B,0x60,0x17,0x4B,0x46,0x8,0x27,0x55,0x59,0x42,0xB,0x60,0x1E,0x58,0x51,0x96,0x3D,0x19,0x32,0x30,0x55,0x56,0x56,0x50,0x41,0x1C,0x4C,0x6,0x0,0x4C,0x5,0x2A,0x18,0x35,0x12,0x51,0x3,0x19,0x52,0x34,0x46,0x8,0xD,0x56,0x3A,0x36,0x49,0x2B,0x47,0x46,0x47,0x15,0x48,0x53,0x4A,0x18,0x24,0x43,0x9,0x28,0x18,0x26,0xC,0x36,0x5,0x70,0x61,0x4D,0x11,0x27,0x23,0x39,0x13,0x58,0x43,0x1D,0xB,0x34,0xF,0x19,0x36,0x25,0x58,0x43,0x55,0x58,0x3A,0x40,0x53,0x33,0x52,0xA,0x36,0x59,0x3B,0x9,0x31,0x59,0x4F,0x56,0x4D,0x16,0x54,0x59,0x1F,0x1B,0x41,0x60,0xA,0x51,0x4C,0x47,0x11,0x4E,0x46,0x7A,0xC,0x3D,0x19,0xE,0x2C,0x29,0x4E,0x17,0x19,0x3F,0x7,0xB,0x2E,0x28,0x52,0x4,0x5E,0x5E,0x5B,0x7,0x1D,0xC,0x4,0x0,0x12,0x22,0x4E,0x49,0x25,0x34,0x47,0x6,0x37,0x2D,0x29,0x2,0x5E,0x34,0x30,0x16,0x16,0x49,0x3B,0x1,0x4C,0x10,0x41,0x43,0x1E,0x22,0x34,0x5C,0x21,0x2,0x5F,0x18,0x22,0xB,0x26,0x5,0x2,0x4A,0x3B,0x3C,0xB,0x1C,0x4B,0x32,0x5B,0x15,0x37,0x22,0x20,0x5C,0xC0,0x5C,0x28,0x4B,0x36,0x10,0x53,0x5C,0x1C,0x51,0x0,0x4F,0x51,0x5B,0x1A,0x21,0x52,0x22,0x3E,0xC,0xF,0x1E,0x34,0xD,0x18,0x1E,0x4B,0x30,0x5C,0x29,0x14,0x5A,0x54,0x2E,0x27,0xE,0x5F,0x33,0x1F,0x1C,0x36,0x40,0x3D,0x40,0x10,0x5B,0x44,0xA,0x25,0x42,0x30,0x4,0x4,0x10,0x33,0x5B,0x9,0x2E,0x1A,0x3B,0x2D,0x58,0x59,0x8,0x5B,0x22,0x20,0x0,0x3A,0x43,0x2F,0x2F,0xB,0x54,0x18,0x8A]
E = np.array(E).reshape(-1,24)
F = D + E #相加
F %=0xffff
print("D+E")
print(np.array2string(F,max_line_width=np.inf))

G = [0x6C6,0xB350,0xFB2A,0xA846,0xABD5,0xFBBA,0xD20,0xB2C4,0xBD5,0xA4F3,0x4064,0xBDCF,0x8511,0x2911,0xC4BD,0x65B6,0x7010,0x1F43,0x20F1,0x7268,0x6EF8,0x1524,0xF6A8,0x3A2,0x37CB,0xC40F,0x9720,0x13D2,0x3AA,0x4671,0xC1FC,0x2147,0xF9EF,0xB8AA,0x81EF,0x1F7A,0xDEAA,0x89BF,0xC101,0x2992,0xE50D,0x80D5,0xA7C2,0x5D2,0x9DF,0xAE25,0xCB5E,0xA5A9,0x9763,0xBAF2,0x86F8,0x9BFC,0x4435,0x70B3,0xAB91,0x44F4,0x4495,0xE241,0x43C9,0xCC02,0xA778,0x5031,0x9994,0xDBE1,0xE6CC,0xF905,0x7ED4,0x713A,0x1E87,0xA621,0xE3C5,0x2DCF,0x95C2,0xF961,0xA7E3,0xFAD7,0x2244,0xE219,0x7FFC,0x4CCD,0x5B2,0x3594,0xF6DD,0x6037,0x2C8F,0x5B3,0x3DB5,0x5361,0x9025,0xDB95,0xB3C9,0x6450,0xAE6E,0xF74F,0xB761,0xF9D0,0xA9,0xF10C,0xECBD,0xC698,0xC22,0x7EB8,0xEAA5,0xAB78,0x437F,0xBF50,0x9DA0,0x70E1,0xDBE8,0x9B40,0xB9A5,0xCBF4,0xE492,0xB5F6,0x919F,0x4B33,0x9EEF,0x5E9A,0xFFC0,0xAB7,0xF3BF,0x8283,0x41DF,0x7773,0x81B4,0xBA07,0xFD6,0x8FD3,0x5D0F,0x33B1,0xF5B0,0xFFBB,0x47B5,0xE9F7,0xD783,0xA9E6,0x96C1,0x1816,0xC30A,0xA3CD,0x7884,0xB1EC,0xC61,0xF77,0xB14A,0x8AFF,0xC779,0x626D,0xD759,0x6C81,0xCC5D,0xBD1A,0x95F5,0x5D61,0x9C9E,0x6293,0x2911,0x9758,0xB6D0,0x5BD4,0x3B98,0xDC7F,0xF27C,0x9816,0xDE49,0x8575,0xD547,0x6E36,0x8635,0x3E95,0xD8C6,0x24C7,0x6B58,0x9CEF,0xEA8C,0x582C,0xC9E0,0xBD3D,0xBC4E,0xD00C,0x3C61,0xC9F7,0xE213,0x4893,0x51C6,0xA72F,0xE1F4,0xF767,0x1A78,0x8D4F,0x423B,0xDA35,0xED13,0x228B,0xCD29,0x9F34,0x997D,0x5D1E,0xC18A,0x6159,0x6986,0x3C38,0xA076,0xFC28,0x6FC4,0x8751,0x96E0,0xFAFD,0x52C6,0x4906,0x1173,0x45C,0xDD70,0x45F3,0x5044,0x92AE,0x428A,0x29D8,0xC652,0x679D,0x213F,0xBF03,0xF0C1,0xE6A,0xBDD8,0x4591,0xB5B9,0x2558,0xA92D,0xC886,0xC02F,0x89CF,0x5395,0xC578,0x2078,0x4ADF,0xC6FF,0x6EC1,0x4A15,0x1309,0xFDED,0x468C,0x8FEB,0xAEEA,0xD873,0x1B87,0xE75B,0x80B5,0x236D,0x7097,0x6857,0x6B43,0x2BC,0x91EA,0xB01D,0x777A,0xB692,0x3918,0xD1CF,0x959E,0x572,0x59C7,0xD4FA,0xD9AB,0x904F,0x5D27,0x396C,0x4B82,0x85F2,0xA2F0,0xC88A,0x88E5,0xF4E2,0x6988,0x6496,0x4035,0x3D0E,0x15DC,0xB6DD,0xCBE4,0x2D92,0x418F,0x9AD4,0xAEDC,0xFA46,0x25E7,0x22A8,0xAEE5,0x1798,0xDFBD,0xCD93,0x58E,0x27DC,0xEAFF,0xAB5A,0x37AB,0xB78F,0x5E02,0x8E73,0x3AEC,0xF80C,0x711A,0x914C,0xDD62,0xE2D3,0x6DFE,0x3597,0x25C5,0xAD18,0xE45F,0x3808,0xEB56,0x33EA,0x6D19,0xFBCC,0xA388,0xB0FD,0xC271,0xED90,0x4095,0x440F,0x262D,0xB512,0x623A,0x6410,0x62A5,0x6995,0xA000,0xBAF9,0xE445,0x2465,0xA65E,0xB603,0xC209,0xB159,0x6C32,0x11D,0x3C2E,0xB23D,0xB479,0x9D4F,0xEF2F,0x833E,0xFE0F,0x2EB3,0x8B7B,0x61DB,0x1DC6,0x6534,0x37F1,0x908F,0xD7D,0xD25A,0xC690,0xB29,0x3220,0x97F,0x321A,0xCAC4,0x7AB,0x73AE,0xDB4E,0x4A65,0x96A0,0x64F0,0x5F45,0x1E77,0x2DE3,0xDD0C,0xA4C8,0x33DF,0xFACF,0x29B1,0x7CB,0x24AB,0x2A19,0x43F2,0x3293,0xC952,0x83EE,0xE01,0x424C,0x2CCC,0x21CB,0x701F,0x4A27,0x4E30,0x4ADC,0x846,0xDA65,0xE1F1,0xD6CF,0x15C1,0xED78,0xCFF2,0x1C69,0xEF05,0xDD53,0x2BB9,0x1401,0xEFD,0x7031,0xEFD9,0x5790,0x14B8,0xA5C6,0xFA73,0x1F8C,0x6171,0xA46B,0xC524,0x8A78,0x2DC3,0x61BC,0x4A2,0xDDC4,0x73C4,0x8C50,0xCFBC,0x3388,0x73F0,0xE94C,0x85CE,0x20BC,0x8F08,0x67E7,0xE5C8,0x69BD,0x46BF,0x69E4,0xF024,0xF5BB,0xAB91,0xC32,0x57E8,0xCC30,0xC68A,0xA5F3,0xEFBF,0x5F74,0xE7F,0x397F,0xF02B,0x2E51,0xFFE,0x32CE,0xF66A,0xA69D,0x93B1,0xE53F,0xF854,0x60B8,0xA7A2,0xEF57,0x6A86,0xC3CA,0x93E4,0xB2F1,0x590,0x8CC5,0xEEB7,0x663D,0x6311,0xDB16,0x9294,0x8299,0xBD,0xFCA1,0xD53F,0x7E60,0xFF44,0xA42C,0xA8F1,0x5175,0xE9A0,0xEB14,0xDB64,0xB072,0x3179,0x59D2,0xB7FF,0x2EE0,0xFD00,0x42FD,0x17FB,0xA871,0xD3CE,0x73B9,0x532C,0x2449,0x45A8,0xE49A,0xC3CB,0x4497,0x5841,0x11D7,0x7D08,0x46C3,0xCF5E,0x705C,0xC024,0xD07C,0x7F16,0x9D97,0x3E91,0x249F,0xE9A7,0x14E5,0x8C35,0x7A6D,0xF3E9,0xB8F6,0xDCDD,0x449D,0xA524,0xF38,0x4510,0x589D,0x78A1,0x4ABA,0xA3E5,0x9D3,0xF34B,0x5705,0xDA4D,0x3330,0x1949,0x2949,0xCE6C,0x5299,0x340,0xC795,0x98C2,0xD611,0x6212,0xB043,0x3253,0xFCF1,0x593C,0x3496,0x8D5,0xF597,0x7436,0xE146,0xCE9A,0xFDF3,0xB57C,0x59AA,0x8F34,0x6A4E,0x22F9,0xDB15,0x2CA,0x1DE0,0x1E5B,0x3A0F,0xAB47,0x7280,0x16BD,0x826B,0xFFEF,0x69A4,0xE62,0x674E,0xCDC3,0x2381,0x1187,0x12CC,0xD668,0x4DCF,0x89AC,0x75B6,0x95CD,0x1915,0xD51E,0x78B2]
G = np.array(G).reshape(-1,24)
H = F @ G #相乘
H %= 0xffff
print("F*G")
print(np.array2string(H,max_line_width=np.inf))

I = [0xFFFFFF8D, 0x0, 0xF, 0x1, 0xFFFFFFEB, 0x31, 0xFFFFFFE8, 0x5, 0x2A, 0xFFFFFFFE, 0xFFFFFFF0, 0xFFFFFFF7, 0x28, 0x2E, 0x38, 0xFFFFFFDE, 0x10, 0xFFFFFFE7, 0x27, 0x1A, 0x17, 0x2A, 0xFFFFFFC8, 0x0, 0xFFFFFFE1, 0xFFFFFFF1, 0x7, 0xFFFFFFF2, 0xB, 0x16, 0xD, 0xFFFFFFDF, 0xFFFFFFF7, 0x28, 0x1F, 0x36, 0xFFFFFFED, 0xFFFFFFE6, 0xFFFFFFEC, 0xC, 0x1E, 0xE, 0x2C, 0xFFFFFFF2, 0x31, 0xFFFFFFFC, 0xFFFFFFFC, 0x19, 0x35, 0x8, 0xFFFFFFD3, 0x14, 0xFFFFFFFB, 0x3A, 0x10, 0xFFFFFFF1, 0x12, 0x3B, 0x2D, 0x17, 0x32, 0x33, 0xFFFFFFDF, 0xB, 0x2E, 0xFFFFFFDE, 0xFFFFFFF1, 0xFFFFFFF7, 0xFFFFFFD2, 0xFFFFFFCE, 0x3, 0xFFFFFFDD, 0x9, 0x27, 0xFFFFFFF3, 0xFFFFFF81, 0x13, 0xFFFFFFD8, 0x1E, 0x15, 0xFFFFFFD8, 0x20, 0x25, 0xFFFFFFEC, 0x1E, 0x1E, 0x1D, 0x19, 0x3, 0x12, 0xFFFFFFF4, 0xFFFFFFC6, 0xFFFFFFD4, 0xFFFFFFB4, 0x27, 0xFFFFFFC9, 0xFFFFFFEE, 0xFFFFFFDE, 0x4, 0xFFFFFFF0, 0xFFFFFFED, 0xFFFFFFF7, 0xFFFFFFFC, 0xFFFFFFDD, 0x1F, 0xFFFFFFE0, 0x0, 0x3B, 0x5, 0x17, 0x1D, 0xFFFFFFD8, 0xFFFFFFE2, 0xFFFFFFFF, 0x36, 0xFFFFFFF3, 0xFFFFFFFF, 0xFFFFFFE1, 0x24, 0x38, 0x11, 0x10, 0xFFFFFFD8, 0x12, 0x9, 0xFFFFFF7F, 0x24, 0xFFFFFFDF, 0x0, 0xFFFFFFE9, 0x17, 0x2B, 0x3, 0x1E, 0xA, 0xFFFFFFFC, 0xFFFFFFD8, 0x3, 0xFFFFFFD6, 0xFFFFFFD8, 0xA, 0xFFFFFFEA, 0x1C, 0xFFFFFFDC, 0x18, 0xFFFFFFFA, 0xFFFFFFEC, 0xFFFFFFFE, 0xFFFFFFE7, 0x11, 0xFFFFFFCB, 0xFFFFFFFA, 0xFFFFFFEE, 0x31, 0xFFFFFFF0, 0xE, 0xFFFFFFFF, 0x1B, 0xFFFFFFF4, 0xFFFFFFB8, 0xFFFFFFF6, 0xFFFFFFDA, 0xFFFFFFFC, 0x0, 0x35, 0x1A, 0x17, 0xFFFFFFE4, 0x38, 0x1A, 0x2, 0x39, 0xFFFFFFDA, 0xFFFFFFEE, 0xE, 0xFFFFFF85, 0x30, 0x26, 0xFFFFFFE3, 0xFFFFFFF4, 0xFFFFFFF4, 0x12, 0xFFFFFFDA, 0x1F, 0x3B, 0xFFFFFFE5, 0xFFFFFFD4, 0xFFFFFFC8, 0x1B, 0xFFFFFFDF, 0xFFFFFFE3, 0x13, 0x36, 0x16, 0xFFFFFFF2, 0xFFFFFFE3, 0x10, 0xFFFFFFE1, 0x2E, 0x1E, 0xFFFFFFDE, 0x48, 0xFFFFFFA2, 0x18, 0x29, 0x34, 0xFFFFFFF7, 0xFFFFFFF3, 0xFFFFFFDF, 0xFFFFFFF7, 0x38, 0xFFFFFFFB, 0x19, 0x36, 0x3, 0x2B, 0xFFFFFFF3, 0x31, 0x38, 0x24, 0x2B, 0xFFFFFFE5, 0x35, 0xFFFFFFF1, 0x7, 0xFFFFFFA2, 0x53, 0xFFFFFFE4, 0xFFFFFFE4, 0x1F, 0x17, 0xFFFFFFE3, 0x2C, 0xFFFFFFD8, 0xFFFFFFE1, 0x3, 0x0, 0x3A, 0x3C, 0xFFFFFFD6, 0xFFFFFFD8, 0xFFFFFFE5, 0x37, 0x2E, 0xFFFFFFDC, 0xFFFFFFEA, 0xFFFFFFD3, 0x19, 0xFFFFFFF7, 0x16, 0x18, 0xFFFFFFFE, 0xC, 0xFFFFFFE2, 0x23, 0x20, 0xB, 0xFFFFFFFE, 0x1D, 0xFFFFFFE0, 0xFFFFFFDF, 0x2A, 0xFFFFFFCB, 0x16, 0xFFFFFFDE, 0xFFFFFFE2, 0x21, 0xFFFFFFFE, 0x2, 0x17, 0xFFFFFFE4, 0x3A, 0xFFFFFFA1, 0xFFFFFFF9, 0x14, 0x17, 0xFFFFFFF0, 0x39, 0xFFFFFFF4, 0xFFFFFFB5, 0xFFFFFFFD, 0x13, 0xFFFFFFE6, 0x3A, 0x31, 0xFFFFFFED, 0x2D, 0x21, 0x39, 0x15, 0x2F, 0x10, 0x12, 0xF, 0xFFFFFFEA, 0x6, 0x3B, 0xFFFFFFF4, 0xFFFFFFE7, 0x2D, 0x27, 0x1, 0x1B, 0xFFFFFFFE, 0x29, 0xFFFFFFB7, 0x19, 0x6, 0x8, 0xFFFFFFE8, 0x9, 0xB, 0xFFFFFFE3, 0x28, 0xFFFFFFE6, 0x1A, 0xFFFFFFB3, 0xFFFFFFD3, 0xFFFFFFA8, 0xFFFFFFE2, 0xFFFFFFA1, 0x22, 0xFFFFFFE4, 0x1, 0xFFFFFFD8, 0xFFFFFF8F, 0x2, 0x6, 0xFFFFFFFA, 0xFFFFFFFC, 0xFFFFFFDE, 0x1B, 0xFFFFFFDB, 0xFFFFFFF4, 0xFFFFFFF5, 0x23, 0x1B, 0x2, 0x9, 0xD, 0xFFFFFFE1, 0xFFFFFFFA, 0xC, 0xFFFFFFF2, 0xFFFFFFF0, 0xFFFFFFF6, 0x22, 0xFFFFFFF7, 0x19, 0xFFFFFFED, 0xFFFFFF8D, 0xFFFFFFF7, 0xFFFFFFEA, 0xFFFFFFFF, 0x9, 0x29, 0xFFFFFFD2, 0xFFFFFFCB, 0xFFFFFFC4, 0x1C, 0xFFFFFFDC, 0xFFFFFFEA, 0x12, 0x22, 0x19, 0x30, 0x32, 0x1B, 0xFFFFFFCD, 0xFFFFFFE8, 0x2D, 0x47, 0xFFFFFFDA, 0xFFFFFFF1, 0x20, 0x33, 0xFFFFFFE8, 0xF, 0x2D, 0x5, 0xFFFFFFC9, 0x17, 0x8, 0x26, 0x2B, 0x13, 0x16, 0xFFFFFFD9, 0xFFFFFFDB, 0xFFFFFFF2, 0xFFFFFFFC, 0xFFFFFFDE, 0x8, 0xFFFFFFED, 0xFFFFFFF3, 0x2B, 0xFFFFFFDC, 0xFFFFFFD9, 0x1C, 0x18, 0x3F, 0xFFFFFFCA, 0x8, 0xFFFFFFE9, 0xFFFFFFE5, 0xFFFFFFCE, 0x22, 0x24, 0x26, 0xFFFFFFFB, 0x28, 0xFFFFFFFD, 0xFFFFFFF8, 0xFFFFFFFA, 0x23, 0xFFFFFFEF, 0x1A, 0x23, 0x1E, 0xFFFFFFED, 0xFFFFFFDB, 0x8, 0x0, 0xFFFFFFE3, 0xFFFFFFC7, 0xFFFFFFC3, 0xFFFFFFCA, 0x0, 0xFFFFFFF0, 0x3B, 0xFFFFFFF3, 0xFFFFFFD9, 0xFFFFFFF2, 0xFFFFFFE6, 0x37, 0x0, 0x3A, 0x18, 0x27, 0x15, 0x2C, 0xFFFFFFEA, 0x16, 0xFFFFFFDA, 0xFFFFFFEF, 0x3, 0x39, 0xFFFFFFEC, 0xFFFFFFF6, 0x2, 0xE, 0xFFFFFFF6, 0x15, 0xFFFFFFD8, 0x8, 0x15, 0xFFFFFFE2, 0xFFFFFFEE, 0xFFFFFFDD, 0xFFFFFFEB, 0xFFFFFFFD, 0xFFFFFFFD, 0xFFFFFFF8, 0x2D, 0xFFFFFFE4, 0x8, 0x14, 0xFFFFFFDA, 0xFFFFFFE3, 0xFFFFFFD8, 0xFFFFFFD8, 0x45, 0x14, 0xFFFFFFED, 0x1C, 0x16, 0xF, 0xD, 0xFFFFFFDE, 0xFFFFFFE6, 0xFFFFFFE3, 0xFFFFFFED, 0xFFFFFFE0, 0xFFFFFFF2, 0x26, 0xFFFFFFDB, 0x1B, 0x36, 0xFFFFFFE2, 0xFFFFFFDA, 0x38, 0x27, 0xFFFFFFF1, 0x2B, 0xFFFFFFDD, 0xFFFFFFFD, 0x1F, 0xFFFFFFCB, 0xFFFFFFF7, 0xFFFFFFD1, 0xFFFFFFC6, 0x3, 0xC, 0x19, 0x2D, 0x34, 0xFFFFFFDA, 0xFFFFFFF6, 0xE, 0xFFFFFFEF, 0xFFFFFFE3, 0xC, 0x29, 0x17, 0xFFFFFFD9, 0x10, 0xFFFFFFE2, 0x5, 0x3, 0x1B, 0x5, 0x15, 0x10, 0x29, 0x21, 0xFFFFFF80, 0x11, 0x17, 0x22, 0x33, 0x17, 0x16, 0x14, 0xFFFFFFFE, 0x27, 0x37, 0xE, 0x28, 0x30, 0x38, 0x39, 0x4, 0x25, 0xFFFFFFE9, 0x1B, 0x2, 0x5, 0x23, 0x1B, 0xFFFFFFF0, 0xFFFFFFBE, 0xFFFFFFD9, 0xF, 0x28, 0xFFFFFFE8, 0xFFFFFFE3, 0xFFFFFFFE, 0xFFFFFFFB, 0x36, 0xFFFFFFE7, 0x14, 0x3B, 0xFFFFFFF8, 0x8, 0xFFFFFFF5, 0xFFFFFFFC, 0xF, 0x3A, 0x2A, 0xFFFFFFDA, 0xFFFFFFF5, 0x1F, 0x32, 0x6, 0x25, 0xFFFFFFC8]
I= np.array(I).reshape(-1,24)

K = (I + H) & 0xffff
K %= 0xffff
print("(I+H)result:")
print(np.array2string(K,max_line_width=np.inf))



提取出密文按照矩阵操作进行逆运算。原本打算用numpy来求逆矩阵,但是因为python的数据是没有定义长度大小的,所以numpy会算出小数。而我们的原文加密中,需要把大小维持在0xffff以内,所以我们需要为这个运算规定一个运算域,这里用sage的Zmod(2**16 - 1)实现,并用”“求解逆矩阵。即matrix(Fp, G)是在域Fp下求G的逆矩阵。这样求出的结果就是正常的。

from sage.all import Zmod, matrix
import numpy as np

G = [0x6C6,0xB350,0xFB2A,0xA846,0xABD5,0xFBBA,0xD20,0xB2C4,0xBD5,0xA4F3,0x4064,0xBDCF,0x8511,0x2911,0xC4BD,0x65B6,0x7010,0x1F43,0x20F1,0x7268,0x6EF8,0x1524,0xF6A8,0x3A2,0x37CB,0xC40F,0x9720,0x13D2,0x3AA,0x4671,0xC1FC,0x2147,0xF9EF,0xB8AA,0x81EF,0x1F7A,0xDEAA,0x89BF,0xC101,0x2992,0xE50D,0x80D5,0xA7C2,0x5D2,0x9DF,0xAE25,0xCB5E,0xA5A9,0x9763,0xBAF2,0x86F8,0x9BFC,0x4435,0x70B3,0xAB91,0x44F4,0x4495,0xE241,0x43C9,0xCC02,0xA778,0x5031,0x9994,0xDBE1,0xE6CC,0xF905,0x7ED4,0x713A,0x1E87,0xA621,0xE3C5,0x2DCF,0x95C2,0xF961,0xA7E3,0xFAD7,0x2244,0xE219,0x7FFC,0x4CCD,0x5B2,0x3594,0xF6DD,0x6037,0x2C8F,0x5B3,0x3DB5,0x5361,0x9025,0xDB95,0xB3C9,0x6450,0xAE6E,0xF74F,0xB761,0xF9D0,0xA9,0xF10C,0xECBD,0xC698,0xC22,0x7EB8,0xEAA5,0xAB78,0x437F,0xBF50,0x9DA0,0x70E1,0xDBE8,0x9B40,0xB9A5,0xCBF4,0xE492,0xB5F6,0x919F,0x4B33,0x9EEF,0x5E9A,0xFFC0,0xAB7,0xF3BF,0x8283,0x41DF,0x7773,0x81B4,0xBA07,0xFD6,0x8FD3,0x5D0F,0x33B1,0xF5B0,0xFFBB,0x47B5,0xE9F7,0xD783,0xA9E6,0x96C1,0x1816,0xC30A,0xA3CD,0x7884,0xB1EC,0xC61,0xF77,0xB14A,0x8AFF,0xC779,0x626D,0xD759,0x6C81,0xCC5D,0xBD1A,0x95F5,0x5D61,0x9C9E,0x6293,0x2911,0x9758,0xB6D0,0x5BD4,0x3B98,0xDC7F,0xF27C,0x9816,0xDE49,0x8575,0xD547,0x6E36,0x8635,0x3E95,0xD8C6,0x24C7,0x6B58,0x9CEF,0xEA8C,0x582C,0xC9E0,0xBD3D,0xBC4E,0xD00C,0x3C61,0xC9F7,0xE213,0x4893,0x51C6,0xA72F,0xE1F4,0xF767,0x1A78,0x8D4F,0x423B,0xDA35,0xED13,0x228B,0xCD29,0x9F34,0x997D,0x5D1E,0xC18A,0x6159,0x6986,0x3C38,0xA076,0xFC28,0x6FC4,0x8751,0x96E0,0xFAFD,0x52C6,0x4906,0x1173,0x45C,0xDD70,0x45F3,0x5044,0x92AE,0x428A,0x29D8,0xC652,0x679D,0x213F,0xBF03,0xF0C1,0xE6A,0xBDD8,0x4591,0xB5B9,0x2558,0xA92D,0xC886,0xC02F,0x89CF,0x5395,0xC578,0x2078,0x4ADF,0xC6FF,0x6EC1,0x4A15,0x1309,0xFDED,0x468C,0x8FEB,0xAEEA,0xD873,0x1B87,0xE75B,0x80B5,0x236D,0x7097,0x6857,0x6B43,0x2BC,0x91EA,0xB01D,0x777A,0xB692,0x3918,0xD1CF,0x959E,0x572,0x59C7,0xD4FA,0xD9AB,0x904F,0x5D27,0x396C,0x4B82,0x85F2,0xA2F0,0xC88A,0x88E5,0xF4E2,0x6988,0x6496,0x4035,0x3D0E,0x15DC,0xB6DD,0xCBE4,0x2D92,0x418F,0x9AD4,0xAEDC,0xFA46,0x25E7,0x22A8,0xAEE5,0x1798,0xDFBD,0xCD93,0x58E,0x27DC,0xEAFF,0xAB5A,0x37AB,0xB78F,0x5E02,0x8E73,0x3AEC,0xF80C,0x711A,0x914C,0xDD62,0xE2D3,0x6DFE,0x3597,0x25C5,0xAD18,0xE45F,0x3808,0xEB56,0x33EA,0x6D19,0xFBCC,0xA388,0xB0FD,0xC271,0xED90,0x4095,0x440F,0x262D,0xB512,0x623A,0x6410,0x62A5,0x6995,0xA000,0xBAF9,0xE445,0x2465,0xA65E,0xB603,0xC209,0xB159,0x6C32,0x11D,0x3C2E,0xB23D,0xB479,0x9D4F,0xEF2F,0x833E,0xFE0F,0x2EB3,0x8B7B,0x61DB,0x1DC6,0x6534,0x37F1,0x908F,0xD7D,0xD25A,0xC690,0xB29,0x3220,0x97F,0x321A,0xCAC4,0x7AB,0x73AE,0xDB4E,0x4A65,0x96A0,0x64F0,0x5F45,0x1E77,0x2DE3,0xDD0C,0xA4C8,0x33DF,0xFACF,0x29B1,0x7CB,0x24AB,0x2A19,0x43F2,0x3293,0xC952,0x83EE,0xE01,0x424C,0x2CCC,0x21CB,0x701F,0x4A27,0x4E30,0x4ADC,0x846,0xDA65,0xE1F1,0xD6CF,0x15C1,0xED78,0xCFF2,0x1C69,0xEF05,0xDD53,0x2BB9,0x1401,0xEFD,0x7031,0xEFD9,0x5790,0x14B8,0xA5C6,0xFA73,0x1F8C,0x6171,0xA46B,0xC524,0x8A78,0x2DC3,0x61BC,0x4A2,0xDDC4,0x73C4,0x8C50,0xCFBC,0x3388,0x73F0,0xE94C,0x85CE,0x20BC,0x8F08,0x67E7,0xE5C8,0x69BD,0x46BF,0x69E4,0xF024,0xF5BB,0xAB91,0xC32,0x57E8,0xCC30,0xC68A,0xA5F3,0xEFBF,0x5F74,0xE7F,0x397F,0xF02B,0x2E51,0xFFE,0x32CE,0xF66A,0xA69D,0x93B1,0xE53F,0xF854,0x60B8,0xA7A2,0xEF57,0x6A86,0xC3CA,0x93E4,0xB2F1,0x590,0x8CC5,0xEEB7,0x663D,0x6311,0xDB16,0x9294,0x8299,0xBD,0xFCA1,0xD53F,0x7E60,0xFF44,0xA42C,0xA8F1,0x5175,0xE9A0,0xEB14,0xDB64,0xB072,0x3179,0x59D2,0xB7FF,0x2EE0,0xFD00,0x42FD,0x17FB,0xA871,0xD3CE,0x73B9,0x532C,0x2449,0x45A8,0xE49A,0xC3CB,0x4497,0x5841,0x11D7,0x7D08,0x46C3,0xCF5E,0x705C,0xC024,0xD07C,0x7F16,0x9D97,0x3E91,0x249F,0xE9A7,0x14E5,0x8C35,0x7A6D,0xF3E9,0xB8F6,0xDCDD,0x449D,0xA524,0xF38,0x4510,0x589D,0x78A1,0x4ABA,0xA3E5,0x9D3,0xF34B,0x5705,0xDA4D,0x3330,0x1949,0x2949,0xCE6C,0x5299,0x340,0xC795,0x98C2,0xD611,0x6212,0xB043,0x3253,0xFCF1,0x593C,0x3496,0x8D5,0xF597,0x7436,0xE146,0xCE9A,0xFDF3,0xB57C,0x59AA,0x8F34,0x6A4E,0x22F9,0xDB15,0x2CA,0x1DE0,0x1E5B,0x3A0F,0xAB47,0x7280,0x16BD,0x826B,0xFFEF,0x69A4,0xE62,0x674E,0xCDC3,0x2381,0x1187,0x12CC,0xD668,0x4DCF,0x89AC,0x75B6,0x95CD,0x1915,0xD51E,0x78B2]


I = [0xFFFFFF8D, 0x0, 0xF, 0x1, 0xFFFFFFEB, 0x31, 0xFFFFFFE8, 0x5, 0x2A, 0xFFFFFFFE, 0xFFFFFFF0, 0xFFFFFFF7, 0x28, 0x2E, 0x38, 0xFFFFFFDE, 0x10, 0xFFFFFFE7, 0x27, 0x1A, 0x17, 0x2A, 0xFFFFFFC8, 0x0, 0xFFFFFFE1, 0xFFFFFFF1, 0x7, 0xFFFFFFF2, 0xB, 0x16, 0xD, 0xFFFFFFDF, 0xFFFFFFF7, 0x28, 0x1F, 0x36, 0xFFFFFFED, 0xFFFFFFE6, 0xFFFFFFEC, 0xC, 0x1E, 0xE, 0x2C, 0xFFFFFFF2, 0x31, 0xFFFFFFFC, 0xFFFFFFFC, 0x19, 0x35, 0x8, 0xFFFFFFD3, 0x14, 0xFFFFFFFB, 0x3A, 0x10, 0xFFFFFFF1, 0x12, 0x3B, 0x2D, 0x17, 0x32, 0x33, 0xFFFFFFDF, 0xB, 0x2E, 0xFFFFFFDE, 0xFFFFFFF1, 0xFFFFFFF7, 0xFFFFFFD2, 0xFFFFFFCE, 0x3, 0xFFFFFFDD, 0x9, 0x27, 0xFFFFFFF3, 0xFFFFFF81, 0x13, 0xFFFFFFD8, 0x1E, 0x15, 0xFFFFFFD8, 0x20, 0x25, 0xFFFFFFEC, 0x1E, 0x1E, 0x1D, 0x19, 0x3, 0x12, 0xFFFFFFF4, 0xFFFFFFC6, 0xFFFFFFD4, 0xFFFFFFB4, 0x27, 0xFFFFFFC9, 0xFFFFFFEE, 0xFFFFFFDE, 0x4, 0xFFFFFFF0, 0xFFFFFFED, 0xFFFFFFF7, 0xFFFFFFFC, 0xFFFFFFDD, 0x1F, 0xFFFFFFE0, 0x0, 0x3B, 0x5, 0x17, 0x1D, 0xFFFFFFD8, 0xFFFFFFE2, 0xFFFFFFFF, 0x36, 0xFFFFFFF3, 0xFFFFFFFF, 0xFFFFFFE1, 0x24, 0x38, 0x11, 0x10, 0xFFFFFFD8, 0x12, 0x9, 0xFFFFFF7F, 0x24, 0xFFFFFFDF, 0x0, 0xFFFFFFE9, 0x17, 0x2B, 0x3, 0x1E, 0xA, 0xFFFFFFFC, 0xFFFFFFD8, 0x3, 0xFFFFFFD6, 0xFFFFFFD8, 0xA, 0xFFFFFFEA, 0x1C, 0xFFFFFFDC, 0x18, 0xFFFFFFFA, 0xFFFFFFEC, 0xFFFFFFFE, 0xFFFFFFE7, 0x11, 0xFFFFFFCB, 0xFFFFFFFA, 0xFFFFFFEE, 0x31, 0xFFFFFFF0, 0xE, 0xFFFFFFFF, 0x1B, 0xFFFFFFF4, 0xFFFFFFB8, 0xFFFFFFF6, 0xFFFFFFDA, 0xFFFFFFFC, 0x0, 0x35, 0x1A, 0x17, 0xFFFFFFE4, 0x38, 0x1A, 0x2, 0x39, 0xFFFFFFDA, 0xFFFFFFEE, 0xE, 0xFFFFFF85, 0x30, 0x26, 0xFFFFFFE3, 0xFFFFFFF4, 0xFFFFFFF4, 0x12, 0xFFFFFFDA, 0x1F, 0x3B, 0xFFFFFFE5, 0xFFFFFFD4, 0xFFFFFFC8, 0x1B, 0xFFFFFFDF, 0xFFFFFFE3, 0x13, 0x36, 0x16, 0xFFFFFFF2, 0xFFFFFFE3, 0x10, 0xFFFFFFE1, 0x2E, 0x1E, 0xFFFFFFDE, 0x48, 0xFFFFFFA2, 0x18, 0x29, 0x34, 0xFFFFFFF7, 0xFFFFFFF3, 0xFFFFFFDF, 0xFFFFFFF7, 0x38, 0xFFFFFFFB, 0x19, 0x36, 0x3, 0x2B, 0xFFFFFFF3, 0x31, 0x38, 0x24, 0x2B, 0xFFFFFFE5, 0x35, 0xFFFFFFF1, 0x7, 0xFFFFFFA2, 0x53, 0xFFFFFFE4, 0xFFFFFFE4, 0x1F, 0x17, 0xFFFFFFE3, 0x2C, 0xFFFFFFD8, 0xFFFFFFE1, 0x3, 0x0, 0x3A, 0x3C, 0xFFFFFFD6, 0xFFFFFFD8, 0xFFFFFFE5, 0x37, 0x2E, 0xFFFFFFDC, 0xFFFFFFEA, 0xFFFFFFD3, 0x19, 0xFFFFFFF7, 0x16, 0x18, 0xFFFFFFFE, 0xC, 0xFFFFFFE2, 0x23, 0x20, 0xB, 0xFFFFFFFE, 0x1D, 0xFFFFFFE0, 0xFFFFFFDF, 0x2A, 0xFFFFFFCB, 0x16, 0xFFFFFFDE, 0xFFFFFFE2, 0x21, 0xFFFFFFFE, 0x2, 0x17, 0xFFFFFFE4, 0x3A, 0xFFFFFFA1, 0xFFFFFFF9, 0x14, 0x17, 0xFFFFFFF0, 0x39, 0xFFFFFFF4, 0xFFFFFFB5, 0xFFFFFFFD, 0x13, 0xFFFFFFE6, 0x3A, 0x31, 0xFFFFFFED, 0x2D, 0x21, 0x39, 0x15, 0x2F, 0x10, 0x12, 0xF, 0xFFFFFFEA, 0x6, 0x3B, 0xFFFFFFF4, 0xFFFFFFE7, 0x2D, 0x27, 0x1, 0x1B, 0xFFFFFFFE, 0x29, 0xFFFFFFB7, 0x19, 0x6, 0x8, 0xFFFFFFE8, 0x9, 0xB, 0xFFFFFFE3, 0x28, 0xFFFFFFE6, 0x1A, 0xFFFFFFB3, 0xFFFFFFD3, 0xFFFFFFA8, 0xFFFFFFE2, 0xFFFFFFA1, 0x22, 0xFFFFFFE4, 0x1, 0xFFFFFFD8, 0xFFFFFF8F, 0x2, 0x6, 0xFFFFFFFA, 0xFFFFFFFC, 0xFFFFFFDE, 0x1B, 0xFFFFFFDB, 0xFFFFFFF4, 0xFFFFFFF5, 0x23, 0x1B, 0x2, 0x9, 0xD, 0xFFFFFFE1, 0xFFFFFFFA, 0xC, 0xFFFFFFF2, 0xFFFFFFF0, 0xFFFFFFF6, 0x22, 0xFFFFFFF7, 0x19, 0xFFFFFFED, 0xFFFFFF8D, 0xFFFFFFF7, 0xFFFFFFEA, 0xFFFFFFFF, 0x9, 0x29, 0xFFFFFFD2, 0xFFFFFFCB, 0xFFFFFFC4, 0x1C, 0xFFFFFFDC, 0xFFFFFFEA, 0x12, 0x22, 0x19, 0x30, 0x32, 0x1B, 0xFFFFFFCD, 0xFFFFFFE8, 0x2D, 0x47, 0xFFFFFFDA, 0xFFFFFFF1, 0x20, 0x33, 0xFFFFFFE8, 0xF, 0x2D, 0x5, 0xFFFFFFC9, 0x17, 0x8, 0x26, 0x2B, 0x13, 0x16, 0xFFFFFFD9, 0xFFFFFFDB, 0xFFFFFFF2, 0xFFFFFFFC, 0xFFFFFFDE, 0x8, 0xFFFFFFED, 0xFFFFFFF3, 0x2B, 0xFFFFFFDC, 0xFFFFFFD9, 0x1C, 0x18, 0x3F, 0xFFFFFFCA, 0x8, 0xFFFFFFE9, 0xFFFFFFE5, 0xFFFFFFCE, 0x22, 0x24, 0x26, 0xFFFFFFFB, 0x28, 0xFFFFFFFD, 0xFFFFFFF8, 0xFFFFFFFA, 0x23, 0xFFFFFFEF, 0x1A, 0x23, 0x1E, 0xFFFFFFED, 0xFFFFFFDB, 0x8, 0x0, 0xFFFFFFE3, 0xFFFFFFC7, 0xFFFFFFC3, 0xFFFFFFCA, 0x0, 0xFFFFFFF0, 0x3B, 0xFFFFFFF3, 0xFFFFFFD9, 0xFFFFFFF2, 0xFFFFFFE6, 0x37, 0x0, 0x3A, 0x18, 0x27, 0x15, 0x2C, 0xFFFFFFEA, 0x16, 0xFFFFFFDA, 0xFFFFFFEF, 0x3, 0x39, 0xFFFFFFEC, 0xFFFFFFF6, 0x2, 0xE, 0xFFFFFFF6, 0x15, 0xFFFFFFD8, 0x8, 0x15, 0xFFFFFFE2, 0xFFFFFFEE, 0xFFFFFFDD, 0xFFFFFFEB, 0xFFFFFFFD, 0xFFFFFFFD, 0xFFFFFFF8, 0x2D, 0xFFFFFFE4, 0x8, 0x14, 0xFFFFFFDA, 0xFFFFFFE3, 0xFFFFFFD8, 0xFFFFFFD8, 0x45, 0x14, 0xFFFFFFED, 0x1C, 0x16, 0xF, 0xD, 0xFFFFFFDE, 0xFFFFFFE6, 0xFFFFFFE3, 0xFFFFFFED, 0xFFFFFFE0, 0xFFFFFFF2, 0x26, 0xFFFFFFDB, 0x1B, 0x36, 0xFFFFFFE2, 0xFFFFFFDA, 0x38, 0x27, 0xFFFFFFF1, 0x2B, 0xFFFFFFDD, 0xFFFFFFFD, 0x1F, 0xFFFFFFCB, 0xFFFFFFF7, 0xFFFFFFD1, 0xFFFFFFC6, 0x3, 0xC, 0x19, 0x2D, 0x34, 0xFFFFFFDA, 0xFFFFFFF6, 0xE, 0xFFFFFFEF, 0xFFFFFFE3, 0xC, 0x29, 0x17, 0xFFFFFFD9, 0x10, 0xFFFFFFE2, 0x5, 0x3, 0x1B, 0x5, 0x15, 0x10, 0x29, 0x21, 0xFFFFFF80, 0x11, 0x17, 0x22, 0x33, 0x17, 0x16, 0x14, 0xFFFFFFFE, 0x27, 0x37, 0xE, 0x28, 0x30, 0x38, 0x39, 0x4, 0x25, 0xFFFFFFE9, 0x1B, 0x2, 0x5, 0x23, 0x1B, 0xFFFFFFF0, 0xFFFFFFBE, 0xFFFFFFD9, 0xF, 0x28, 0xFFFFFFE8, 0xFFFFFFE3, 0xFFFFFFFE, 0xFFFFFFFB, 0x36, 0xFFFFFFE7, 0x14, 0x3B, 0xFFFFFFF8, 0x8, 0xFFFFFFF5, 0xFFFFFFFC, 0xF, 0x3A, 0x2A, 0xFFFFFFDA, 0xFFFFFFF5, 0x1F, 0x32, 0x6, 0x25, 0xFFFFFFC8]
I= np.array(I).reshape(-1,24)

E = [0x54,0x12,0x2,0x2,0x4C,0x41,0x33,0x51,0x3F,0xC,0x6,0x18,0x40,0x43,0x34,0x47,0x5F,0x22,0x62,0x21,0x5E,0x1A,0x27,0x4D,0x33,0x56,0x48,0x2C,0x10,0x4,0x49,0x2,0x1C,0x28,0x4D,0x1C,0x3F,0x2B,0x17,0x19,0x27,0x42,0x52,0x46,0x3C,0x0,0x39,0x41,0x29,0x9,0x62,0x27,0x15,0x17,0x1A,0x1D,0x19,0x48,0x56,0x12,0x0,0x4,0x37,0x4A,0x3F,0x0,0x4B,0x19,0x3F,0x37,0x39,0x24,0xE,0x59,0x15,0xB8,0x11,0x3D,0x9,0x21,0x46,0x25,0x63,0x3F,0x4,0x17,0x59,0x5F,0x3E,0x61,0x51,0x1E,0x52,0x36,0x1,0x1B,0x25,0xC,0x13,0x3A,0x8C,0x61,0x44,0x2E,0x22,0x22,0x3E,0x62,0x39,0x56,0x3E,0x1E,0x2C,0x3B,0x32,0xD,0x32,0x4F,0x4C,0x43,0x60,0x32,0x2D,0x15,0x55,0xAE,0x6,0x5A,0x22,0x11,0x53,0x55,0x2F,0x1B,0x1D,0x13,0xB,0x26,0x38,0x21,0x59,0xA,0x33,0x52,0x62,0xF,0x18,0x53,0x2B,0x2C,0x8A,0x1,0x34,0x49,0x4D,0x3,0x25,0x9,0x3F,0x18,0x5D,0x3C,0x2C,0x24,0x44,0x11,0x1,0x18,0x28,0x38,0x3A,0x4D,0x1F,0x45,0xF,0x10,0x34,0xC,0x1A,0x2E,0x5E,0x1,0x31,0x59,0x6,0x33,0x39,0x7,0x5,0x4A,0xB,0x35,0x62,0x41,0x1B,0x15,0x60,0x31,0x19,0x27,0x9C,0x4D,0x27,0x4F,0x4F,0x21,0x7,0x38,0x63,0x32,0x2A,0x58,0xF,0x2F,0x5F,0x15,0x3B,0x11,0x4F,0x5E,0x2D,0x5,0xF,0xE,0x29,0x42,0x26,0x3C,0x13,0x4F,0x12,0x2B,0x41,0x11,0x9,0x6,0x41,0x38,0xE,0x7,0x44,0x2B,0x1,0x3E,0x1A,0x53,0x43,0x2C,0x3,0xC,0x32,0x0,0x4F,0xF,0x5B,0x60,0x58,0x47,0x4B,0x10,0x6,0xA,0x31,0x47,0x19,0x10,0x35,0xA,0x4E,0x6,0x17,0x7,0x56,0x4C,0x3B,0x58,0x18,0x18,0x2E,0x4B,0x50,0x8,0x42,0x1D,0x2E,0x59,0x59,0x34,0x5E,0x16,0x42,0x4,0x12,0x47,0x20,0x21,0x2,0x20,0x34,0x5,0x78,0x44,0x15,0x40,0x60,0x2A,0x59,0x27,0x17,0x62,0x5B,0x60,0x17,0x4B,0x46,0x8,0x27,0x55,0x59,0x42,0xB,0x60,0x1E,0x58,0x51,0x96,0x3D,0x19,0x32,0x30,0x55,0x56,0x56,0x50,0x41,0x1C,0x4C,0x6,0x0,0x4C,0x5,0x2A,0x18,0x35,0x12,0x51,0x3,0x19,0x52,0x34,0x46,0x8,0xD,0x56,0x3A,0x36,0x49,0x2B,0x47,0x46,0x47,0x15,0x48,0x53,0x4A,0x18,0x24,0x43,0x9,0x28,0x18,0x26,0xC,0x36,0x5,0x70,0x61,0x4D,0x11,0x27,0x23,0x39,0x13,0x58,0x43,0x1D,0xB,0x34,0xF,0x19,0x36,0x25,0x58,0x43,0x55,0x58,0x3A,0x40,0x53,0x33,0x52,0xA,0x36,0x59,0x3B,0x9,0x31,0x59,0x4F,0x56,0x4D,0x16,0x54,0x59,0x1F,0x1B,0x41,0x60,0xA,0x51,0x4C,0x47,0x11,0x4E,0x46,0x7A,0xC,0x3D,0x19,0xE,0x2C,0x29,0x4E,0x17,0x19,0x3F,0x7,0xB,0x2E,0x28,0x52,0x4,0x5E,0x5E,0x5B,0x7,0x1D,0xC,0x4,0x0,0x12,0x22,0x4E,0x49,0x25,0x34,0x47,0x6,0x37,0x2D,0x29,0x2,0x5E,0x34,0x30,0x16,0x16,0x49,0x3B,0x1,0x4C,0x10,0x41,0x43,0x1E,0x22,0x34,0x5C,0x21,0x2,0x5F,0x18,0x22,0xB,0x26,0x5,0x2,0x4A,0x3B,0x3C,0xB,0x1C,0x4B,0x32,0x5B,0x15,0x37,0x22,0x20,0x5C,0xC0,0x5C,0x28,0x4B,0x36,0x10,0x53,0x5C,0x1C,0x51,0x0,0x4F,0x51,0x5B,0x1A,0x21,0x52,0x22,0x3E,0xC,0xF,0x1E,0x34,0xD,0x18,0x1E,0x4B,0x30,0x5C,0x29,0x14,0x5A,0x54,0x2E,0x27,0xE,0x5F,0x33,0x1F,0x1C,0x36,0x40,0x3D,0x40,0x10,0x5B,0x44,0xA,0x25,0x42,0x30,0x4,0x4,0x10,0x33,0x5B,0x9,0x2E,0x1A,0x3B,0x2D,0x58,0x59,0x8,0x5B,0x22,0x20,0x0,0x3A,0x43,0x2F,0x2F,0xB,0x54,0x18,0x8A]
E = np.array(E).reshape(-1,24)

B = [0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1]
B = np.array(B).reshape(-1,24)

init = [0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x43,0x30,0x44,0x33,0x47,0x41,0x54,0x33,0x43,0x30,0x44,0x33,0x47,0x41,0x54,0x33,0x43,0x30,0x44,0x33,0x47,0x41,0x54,0x33,0x0,0x0,0x30,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x43,0x0,0x0,0x44,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x30,0x0,0x0,0x33,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x44,0x0,0x0,0x47,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33,0x0,0x0,0x41,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x47,0x0,0x0,0x54,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x41,0x0,0x0,0x33,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x54,0x0,0x0,0x43,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33,0x0,0x0,0x30,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x43,0x0,0x0,0x44,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x30,0x0,0x0,0x33,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x44,0x0,0x0,0x47,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33,0x0,0x0,0x41,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x47,0x0,0x0,0x54,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x41,0x0,0x0,0x33,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x54,0x0,0x0,0x43,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33,0x0,0x0,0x30,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x43,0x0,0x0,0x44,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x30,0x0,0x0,0x33,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x44,0x0,0x0,0x47,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33,0x0,0x0,0x41,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x47,0x0,0x0,0x54,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x41,0x0,0x0,0x33,0x43,0x30,0x44,0x33,0x47,0x41,0x54,0x33,0x43,0x30,0x44,0x33,0x47,0x41,0x54,0x33,0x43,0x30,0x44,0x33,0x47,0x41,0x54,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
init = np.array(init).reshape(-1,26)

K = [0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x13, 0x3D, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0xC, 0x3D, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x4, 0xC, 0xC, 0x36, 0x36, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x50, 0xC, 0xC, 0xC, 0xC, 0x3D, 0x6, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x5, 0x41, 0xC, 0x3D, 0x36, 0x3D, 0x12, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0xC, 0x3D, 0xC, 0x36, 0xC, 0x1F, 0x13, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x4F, 0x3B, 0x3B, 0x3B, 0x18, 0xC, 0x36, 0xC, 0x3D, 0x36, 0x1C, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3E, 0x54, 0x3B, 0x3B, 0x3B, 0x3B, 0x3F, 0x3D, 0x36, 0xC, 0x3D, 0x3D, 0x38, 0x37, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x16, 0x54, 0x3, 0x54, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x51, 0xC, 0x3D, 0x3D, 0x3D, 0x3D, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x43, 0x54, 0x54, 0x54, 0x54, 0x44, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x34, 0x3D, 0x3D, 0xC, 0x3B, 0x3B, 0x3B, 0x3B, 0x29, 0x3, 0x3, 0x54, 0x3, 0x32, 0x3C, 0x3B, 0x3B, 0x3B, 0x3B, 0x26, 0x46, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x19, 0x1F, 0x3B, 0x3B, 0x37, 0x54, 0x54, 0x54, 0x3, 0x49, 0x1, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x12, 0x49, 0x2F, 0x2C, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3D, 0x42, 0x2F, 0x3, 0x54, 0x54, 0x3F, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x26, 0x54, 0xC, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x10, 0x32, 0x3, 0x3, 0x3, 0x54, 0x41, 0x40, 0x3B, 0x3B, 0x3B, 0x6, 0x10, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x27, 0x31, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0xD, 0x32, 0x42, 0x3, 0x54, 0x54, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x1D, 0x27, 0x27, 0x4B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x20, 0x32, 0x54, 0x49, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x47, 0x24, 0x24, 0x24, 0x24, 0x4B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x4C, 0x44, 0x3B, 0x3B, 0x3B, 0x3B, 0x53, 0x24, 0x24, 0x24, 0x24, 0x27, 0x4A, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x22, 0x27, 0x24, 0x27, 0x24, 0x24, 0xF, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x4D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x22, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x4F, 0x21, 0x1D, 0x24, 0x24, 0x24, 0x24, 0x9, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x14, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x52, 0x24, 0x24, 0x24, 0x24, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x4E, 0x24, 0x24, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0xA]
K = np.array(K).reshape(-1,24)

H = (K - I) & 0xffff #相减还原出H,这里要&0xffff把范围界定好

G=np.array(G).reshape(-1,24).tolist() #求G的逆矩阵
Fp = Zmod(2**16 - 1) #规定运算域在0到0xffff之间,避免小数的出现
G_T = [list(row) for row in ~matrix(Fp, G)] #习惯用numpy于是转为numpy的二维矩阵
G_T = np.array(G_T).reshape(-1,24) #resharp(),-1为自动识别,24为行元素个数

F = H @ G_T #H乘G的逆还原出F

D = F - E #减E还原出D

D = np.rot90(D,k=-1) #左旋转90度

B_T = [list(row) for row in ~matrix(Fp, B)] #求B的逆矩阵
B_T = np.array(B_T).reshape(-1,24)

C = B_T @ D #同上还原出C

A = C @ B_T #同上还原出A

A = np.rot90(A,k=1) #顺时针转90度还原

print(A)


#z3解卷积
from z3 import *

s = Solver()

#这里直接提取这个26*26的矩阵,修改我们输入的24*24的部分就行。
var = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 67, 48, 68, 51, 71, 65, 84, 51, 67, 48, 68, 51, 71, 65, 84, 51, 67, 48, 68, 51, 71, 65, 84, 51, 0],
     [0, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 67, 0], 
     [0, 68, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 48, 0], 
     [0, 51, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 68, 0], 
     [0, 71, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 51, 0], 
     [0, 65, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 71, 0], 
     [0, 84, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 65, 0], 
     [0, 51, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 84, 0], 
     [0, 67, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 51, 0], 
     [0, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 67, 0], 
     [0, 68, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 48, 0], 
     [0, 51, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 68, 0], 
     [0, 71, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 51, 0], 
     [0, 65, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 71, 0], 
     [0, 84, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 65, 0], 
     [0, 51, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 84, 0], 
     [0, 67, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 51, 0], 
     [0, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 67, 0], 
     [0, 68, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 48, 0], 
     [0, 51, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 68, 0], 
     [0, 71, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 51, 0], 
     [0, 65, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 71, 0], 
     [0, 84, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 65, 0], 
     [0, 51, 67, 48, 68, 51, 71, 65, 84, 51, 67, 48, 68, 51, 71, 65, 84, 51, 67, 48, 68, 51, 71, 65, 84, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]


for i in range(2,25):
    for j in range(2,25):
        var[i][j] = BitVec(f"s{i}_{j}",8) #设定内部的24*24也就是我们输入的数据作为变量

for i in range(24):
    for j in range(24):
        s.add(A[i][j] == var[i + 2][j + 2]+ var[i + 2][j + 1]+ var[i + 2][j] + var[i + 1][j + 2]+ var[i + 1][j + 1] + var[i + 1][j]+ var[i][j + 2]+ var[i][j + 1] + var[i][j]) #模拟卷积操作,添加约束条件

flag = ""

if s.check() == sat :
    m = s.model()
    for i in range(2,25):
        for j in range(2,25):
            flag += chr(m[var[i][j]].as_long()) #输出flag的结果


print(flag)

"""
C0DEGATE 1s a gl0ba1 iCnternationa1 hacking d03f3ns3 competition                         andD 5ecurity conference. 3Held annually since 20G08, C0D3GAT3 is known Aas the Olympics for haTckers, wh3re hack3rs a3nd security 3xperts frCom around the world ga0th3r t0 c0mpet3 for thDe title of the w0rld's3 best hack3r. In additGion to fierce competitAion among tru3 white-hTat hackers, a juni0r d3ivision is also he1d, Cs3rv1ng as a p1atform 0f0r discover1ng talentDed 1ndividuals 1n th3 3fi3ld of cyb3rsecurityG. You are good hacker.AC0D3GAT3C0D3GAT3C0D3GAT
"""

randomsystem

下面是TGCTF2025中的一道矩阵操作题目

矩阵操作,换位,乘法,生成密钥,异或加密

import re
import numpy as np

def gettaable_byasm():
    asm =   """
    mov     [ebp+var_104], 1
mov     [ebp+var_100], 1
mov     [ebp+var_FC], 0
mov     [ebp+var_F8], 1
mov     [ebp+var_F4], 0
mov     [ebp+var_F0], 0
mov     [ebp+var_EC], 1
mov     [ebp+var_E8], 0
mov     [ebp+var_E4], 0
mov     [ebp+var_E0], 1
mov     [ebp+var_DC], 1
mov     [ebp+var_D8], 0
mov     [ebp+var_D4], 0
mov     [ebp+var_D0], 1
mov     [ebp+var_CC], 0
mov     [ebp+var_C8], 1
mov     [ebp+var_C4], 0
mov     [ebp+var_C0], 0
mov     [ebp+var_BC], 1
mov     [ebp+var_B8], 1
mov     [ebp+var_B4], 0
mov     [ebp+var_B0], 1
mov     [ebp+var_AC], 1
mov     [ebp+var_A8], 0
mov     [ebp+var_A4], 0
mov     [ebp+var_A0], 0
mov     [ebp+var_9C], 0
mov     [ebp+var_98], 1
mov     [ebp+var_94], 0
mov     [ebp+var_90], 1
mov     [ebp+var_8C], 0
mov     [ebp+var_88], 1
mov     [ebp+var_84], 0
mov     [ebp+var_80], 1
mov     [ebp+var_7C], 0
mov     [ebp+var_78], 0
mov     [ebp+var_74], 1
mov     [ebp+var_70], 0
mov     [ebp+var_6C], 1
mov     [ebp+var_68], 0
mov     [ebp+var_64], 0
mov     [ebp+var_60], 0
mov     [ebp+var_5C], 0
mov     [ebp+var_58], 0
mov     [ebp+var_54], 0
mov     [ebp+var_50], 1
mov     [ebp+var_4C], 0
mov     [ebp+var_48], 1
mov     [ebp+var_44], 0
mov     [ebp+var_40], 0
mov     [ebp+var_3C], 0
mov     [ebp+var_38], 0
mov     [ebp+var_34], 0
mov     [ebp+var_30], 0
mov     [ebp+var_2C], 1
mov     [ebp+var_28], 1
mov     [ebp+var_24], 0
mov     [ebp+var_20], 1
mov     [ebp+var_1C], 1
mov     [ebp+var_18], 0
mov     [ebp+var_14], 0
mov     [ebp+var_10], 0
mov     [ebp+var_C], 0
mov     [ebp+var_8], 1
            """
    values = re.findall(r"mov.*?,\s*(\d+)", asm)
    values = [int(x) for x in values]
    return values

def exchange(input, tableM):
    inlen = len(input)
    for i in range(32):
        input[i], input[inlen - tableM[i] - 1] = input[inlen - tableM[i] - 1], input[i] #前32位与后32按盒位交换
    return input

def deexchange(input, tableM):
    inlen = len(input)
    for i in range(32):
        input[inlen - tableM[i] - 1], input[i] = input[i], input[inlen - tableM[i] - 1] #前32位与后32按盒位交换
    return input

def changeKey(key):
    data = []
    for i in range(0, len(key), 2):
        data.append((((key[i] - 48)<<4) | (key[i + 1] - 48)) &0xff)
    return data


key2 = [53, 50, 54, 53, 53, 54, 54, 53, 53, 50, 54, 53, 53, 51, 54, 53]
mm = [376, 356, 169, 501, 277, 329, 139, 342, 380, 365, 162, 258, 381, 339, 347, 307, 263, 359, 162, 484, 310, 333, 346,
      339, 150, 194, 175, 344, 158, 250, 128, 175, 158, 173, 152, 379, 158, 292, 130, 365, 197, 20, 197, 161, 198, 10,
      207, 244, 202, 14, 204, 176, 193, 255, 35, 7, 158, 181, 145, 353, 153, 357, 246, 151]

randi = [27, 26, 25, 23, 28, 1, 6, 10, 20, 7, 15, 14, 31, 18, 19, 21, 9, 30, 22, 24, 8, 2, 29, 3, 12, 11, 17, 16, 0, 13, 5, 4] #用c语言生成随机数

MatrixB = gettaable_byasm()

key = changeKey(key2)

for i in range(len(mm)):
    mm[i] ^= key[i % len(key)]

B = np.array(mm).reshape(-1,8)
A = np.array(MatrixB).reshape(-1,8) #转为矩阵-1为自适应

invA = np.linalg.inv(A) #求逆
res = invA @ B #矩阵乘法

resl =deexchange(res.astype(int).flatten().tolist(),randi) #flatten降维,转成list,astype转为int类型

flag =''.join(map(chr,resl))

print(flag)