Matcryp을 출제한 '누구'라고 합니닷.
저는 익명.
일단 이 문제 이름처럼 matrix + crypto를 합친 좋은(?)문제죠. 사실 대부분 풀 줄 알았습니다. 일단 코드를 보시죠.

import numpy as np

f1 = open('flag', 'rb')
f2 = open('key', 'rb')

flag = [ 0 for _ in range(0, 2) ]
key = [ 0 for _ in range(0, 4) ]
final = [ [0, 0] for _ in range(0, 22) ]

for i in range(0, 22):    
    if i % 2 == 0:
        for j in range(0, 2):
            flag[j] = int(ord(f1.read(1)))
    for j in range(0, 4):
        key[j] = int(ord(f2.read(1)))

    flag_list = np.reshape(flag, (2, 1))
    key_list = np.reshape(key, (2, 2))

    enc = np.matmul(key_list, flag_list)
    enc = np.reshape(enc, 2)
    final[i] = enc.tolist()

final = np.reshape(final, 44)
final = final.tolist()
final = str(final)

f = open('enc', 'w')
f.write(final)

numpy를 일부로 사용했습니다. (사실 직접 전부 구현하기에는 시간이 너무 부족한 나이인지라...)
numpy를 사용하므로써 좀 더 코드를 직관성 있게 바꾸었는데 잘 보았을지는 모르겠습니다..

일단 뭐하는 코드인지 알아봐야죠
일단 파일을 열고 각각 2개 4개씩 받아오는 변수를 선언하죠.

f1 = open('flag', 'rb')
f2 = open('key', 'rb')

flag = [ 0 for _ in range(0, 2) ]
key = [ 0 for _ in range(0, 4) ]
final = [ [0, 0] for _ in range(0, 22) ]

그리고 반복문을 22번 돌려서 암호화를 시작합니다.플래그를 2글자씩 받아오면서 22번 반복하는 것을 보아화니 플래그의 총 길이는 44글자라는 것을 충분히 예측할 수 있을 거 같습니다. 그리고 파일에서 가져온 값을 (2, 2), (2, 1) 행렬로 바꾸어주고 행렬곱을 합니다.

flag_list = np.reshape(flag, (2, 1))
key_list = np.reshape(key, (2, 2))

enc = np.matmul(key_list, flag_list)

제가 키 파일과 최종 encrypt 파일을 주었으므로 행렬 곱의 연산을 알고 있다면 충분히 풀 수 있습니다.

일단 2가지의 풀이가 존재합니다.
첫번째 풀이는 두 행렬이 존재할때 한 행렬이 미지수로 표현되어 있으면 일차연립방정식으로 바꿀 수 있다는 점을 이용하는 것입니다.
두번째 풀이는 역행렬을 이용하는 것입니다. (2,2)행렬의 역행렬을 구해서 양변의 맨 앞에 곱을 해주면 미지수가 있는 (2,1)행렬을 구할 수 있습니다.