Mô tả
Summary
Adrien đã tìm cách mã hóa tin nhắn của mình với sự trợ giúp của các ký hiệu và dấu trừ. Bạn có thể tìm cách khôi phục lại cờ không?
Tệp thử thách:
Hướng dẫn giải
- Phân tích mã nguồn, ta thấy rằng flag ban đầu được chuyển thành chuỗi bao gồm hai loại ký tự là
1
và0
. Với mỗi ký tự trong chuỗi, tínhn = a^e mod p
vớie
là một số ngẫu nhiên, nếu ký tự đó là 1 thì cho vào mảng kết quả, là 0 thì cho-n mod p
vào mảng kết quả. - Tính legendre symbol cho
a
vàp
, ta nhận thấya
là một thặng dư mật hai củap
. Màa mod p = 1
thìa^e mod p
cũng bằng 1. Do đó, các ký tự trước khi lấy lũy thừa có giá trị như thế nào thì khi tính legendre symbol cũng sẽ có kết quả như vậy. - Viết code để tính lengendre symbol và cho giá trị vào mảng
bytes
:
bytes = b''
for i in range(0, len(enc)):
if(i % 8 == 0):
bytes += b' '
if legendre(enc[i], p):
bytes += b'1'
else:
bytes += b'0'
bytes = bytes.split()
- Biến
bytes
sau khi thực hiện đoạn code trên sẽ trở thành một mảng các byte string 8 bits. Ta chuyển từng chuỗi sang dạng ascii và thu được cờ:
flag = ''
for byte in bytes:
flag += chr(int(byte,2))
print(flag)
Cờ
Success
crypto{p4tterns_1n_re5idu3s}