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

  1. 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à 10. Với mỗi ký tự trong chuỗi, tính n = a^e mod p với e 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ả.
  2. Tính legendre symbol cho ap, ta nhận thấy a là một thặng dư mật hai của p. 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.
  3. 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()
  1. 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}