量子密碼學(QuantumCTF初探與解題)

2024-02-29

Author:堇姬Naup

共筆

https://hackmd.io/@3C-Tim/HJLfSR_t6/edit

題目writeup(註解打得很詳細了,我就不多說了)

AIS3前測

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
import random
from math import sqrt

#將binary string轉成十進制的function
def BinaryToDecimal(binary):
binary1 = binary
decimal, i, n = 0, 0, 0
while(binary != 0):
dec = binary % 10
decimal = decimal + dec * pow(2, i)
binary = binary//10
i += 1
return (decimal)
#將十進制明文轉成UTF8的函數
def dec2utf8(plaintext_bin):
res=""
for i in range(0, len(plaintext_bin), 8):
temp_data = int(plaintext_bin[i:i + 8])
decimal_data = BinaryToDecimal(temp_data)
res = res + chr(decimal_data)
return res

qubit_num=1024

basis_vectors = {
'+': [{'real': 0, 'imag': 1}, {'real': 1, 'imag': 0}],
'x': [{'real': 1/sqrt(2), 'imag': 1/sqrt(2)}, {'real': 1/sqrt(2), 'imag': -1/sqrt(2)}]
}

Alice_bases = ['+', '+', 'x', '+', '+', 'x', '+', 'x', 'x', '+', 'x', '+', '+', 'x', '+', '+', 'x', '+', 'x', '+', '+', '+', 'x', 'x', '+', 'x', 'x', 'x', 'x', 'x', '+', '+', '+', '+', '+', 'x', 'x', 'x', '+', '+', 'x', '+', '+', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', 'x', '+', 'x', 'x', '+', '+', '+', 'x', '+', '+', 'x', 'x', '+', 'x', '+', '+', '+', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', '+', 'x', '+', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', 'x', '+', '+', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', 'x', '+', 'x', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', 'x', 'x', '+', 'x', 'x', '+', '+', 'x', 'x', 'x', '+', '+', 'x', 'x', '+', 'x', 'x', '+', 'x', '+', '+', 'x', '+', 'x', '+', 'x', 'x', '+', 'x', 'x', 'x', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', 'x', 'x', 'x', 'x', 'x', '+', 'x', 'x', '+', '+', '+', '+', 'x', 'x', '+', '+', 'x', '+', '+', 'x', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', '+', '+', 'x', 'x', '+', 'x', '+', 'x', 'x', 'x', 'x', 'x', 'x', '+', 'x', '+', '+', '+', '+', 'x', 'x', 'x', 'x', 'x', '+', 'x', 'x', '+', 'x', '+', 'x', '+', 'x', 'x', 'x', '+', '+', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', 'x', '+', 'x', '+', '+', '+', '+', 'x', 'x', '+', 'x', 'x', '+', '+', '+', 'x', 'x', '+', 'x', 'x', 'x', '+', '+', 'x', '+', '+', 'x', '+', '+', '+', '+', '+', '+', 'x', 'x', 'x', '+', '+', '+', '+', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', '+', 'x', '+', '+', 'x', '+', '+', '+', 'x', '+', 'x', 'x', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', 'x', 'x', '+', '+', 'x', 'x', '+', 'x', 'x', 'x', '+', 'x', '+', '+', '+', '+', 'x', '+', 'x', 'x', 'x', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', 'x', '+', '+', '+', '+', '+', '+', 'x', 'x', '+', '+', '+', '+', '+', '+', '+', 'x', 'x', '+', '+', 'x', '+', 'x', '+', '+', 'x', 'x', 'x', 'x', 'x', '+', 'x', 'x', '+', 'x', '+', '+', '+', '+', '+', 'x', '+', 'x', '+', '+', 'x', '+', 'x', '+', 'x', 'x', '+', 'x', 'x', 'x', '+', 'x', '+', 'x', 'x', 'x', '+', 'x', 'x', '+', 'x', '+', 'x', '+', 'x', '+', '+', '+', 'x', 'x', '+', 'x', 'x', 'x', '+', '+', '+', '+', '+', '+', '+', '+', 'x', '+', 'x', '+', 'x', '+', 'x', '+', 'x', '+', 'x', 'x', 'x', '+', '+', '+', 'x', '+', 'x', 'x', '+', '+', '+', '+', 'x', 'x', '+', 'x', 'x', 'x', 'x', 'x', 'x', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', 'x', 'x', '+', 'x', 'x', 'x', 'x', '+', '+', 'x', '+', '+', '+', '+', 'x', '+', '+', 'x', 'x', 'x', '+', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', '+', '+', 'x', '+', '+', '+', 'x', 'x', '+', '+', '+', '+', '+', 'x', '+', 'x', 'x', 'x', 'x', '+', '+', '+', 'x', '+', 'x', 'x', 'x', 'x', '+', 'x', 'x', '+', '+', '+', 'x', '+', '+', '+', 'x', 'x', '+', '+', 'x', '+', 'x', 'x', 'x', '+', 'x', 'x', '+', '+', 'x', 'x', '+', 'x', 'x', 'x', '+', 'x', '+', '+', '+', 'x', '+', '+', '+', 'x', '+', '+', 'x', '+', '+', 'x', 'x', '+', 'x', '+', '+', '+', 'x', 'x', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', 'x', '+', '+', '+', 'x', '+', 'x', '+', 'x', 'x', '+', '+', 'x', '+', 'x', 'x', '+', '+', 'x', '+', '+', '+', 'x', '+', 'x', 'x', '+', 'x', 'x', '+', '+', 'x', '+', 'x', '+', '+', 'x', 'x', 'x', '+', '+', 'x', '+', 'x', 'x', '+', 'x', 'x', '+', 'x', 'x', '+', 'x', 'x', '+', '+', '+', '+', 'x', 'x', 'x', '+', 'x', '+', 'x', 'x', '+', '+', '+', 'x', '+', '+', 'x', 'x', '+', '+', '+', 'x', 'x', '+', 'x', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', '+', '+', '+', 'x', '+', '+', '+', 'x', '+', 'x', 'x', '+', 'x', 'x', '+', '+', 'x', '+', '+', 'x', '+', 'x', 'x', '+', '+', '+', 'x', 'x', 'x', 'x', '+', '+', '+', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', 'x', '+', 'x', '+', '+', 'x', '+', '+', 'x', '+', 'x', '+', 'x', '+', 'x', '+', 'x', '+', '+', '+', 'x', '+', 'x', 'x', '+', '+', '+', 'x', '+', 'x', 'x', '+', 'x', 'x', '+', '+', 'x', 'x', '+', 'x', '+', '+', 'x', '+', 'x', 'x', '+', '+', 'x', 'x', 'x', 'x', 'x', '+', '+', '+', 'x', 'x', '+', 'x', 'x', '+', 'x', 'x', '+', 'x', 'x', '+', '+', '+', 'x', 'x', '+', '+', '+', '+', '+', 'x', '+', '+', '+', 'x', '+', 'x', 'x', '+', '+', '+', '+', 'x', '+', 'x', 'x', 'x', '+', '+', 'x', 'x', 'x', '+', '+', '+', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', 'x', '+', 'x', '+', '+', '+', 'x', '+', 'x', '+', 'x', '+', 'x', 'x', '+', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', '+', 'x', '+', '+', 'x', '+', 'x', '+', 'x', '+', '+', 'x', '+', '+', '+', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', '+', '+', 'x', 'x', '+', '+', '+', 'x', 'x', '+', '+', 'x', 'x', '+', 'x', 'x', '+', 'x', '+', '+', '+', 'x', '+', 'x', '+', 'x', '+', 'x', 'x', '+', '+', '+', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', 'x', 'x', 'x', '+', 'x', 'x', 'x', '+', '+', '+', 'x', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', '+', '+', 'x', 'x', 'x', 'x', 'x', '+', 'x', '+', '+', '+', '+', '+', '+', '+', 'x', '+', '+', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', '+', '+', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', 'x', 'x', 'x', '+', 'x', 'x', 'x', '+', '+', '+', '+', 'x', '+', '+', 'x', 'x', 'x', '+', '+', 'x', '+', '+', 'x', '+', 'x', 'x', 'x', '+', '+', 'x', 'x', '+', '+', '+', '+', 'x', '+', '+', '+', '+', 'x', 'x', '+', '+', '+', 'x', '+']
qubits = [random.choice(basis_vectors[basis]) for basis in Alice_bases]
Alice_bit_string="1100100100011110111000011001011011010010101100010001110100000011001001110111110110110010100011100000010111101011110010110110001110101110110001100101101001111001000011110000111110101110010000111001110000100010010011000111011100000001111101010000110001010111011110111110100110010100001100010101001011011000001011010110001101000000110110000111001100101111100111000001110010101000000010001100010110111111000100111011000100000001101010000111000011000110010110100110110100000000101011111010010101110011000111010110111001101010100011100000010100110010101000100111111110001010001111010000001000000101011001100000010011001011011111101001000000100111011001000101100000100001111000100010010011100000101100101111000110101100101011011110110111001101101101110011010010011010001111001010001100111101110100101100001111011010010001011010111000100011110011000110010100001000100100001000011011101000011111111011011000001111101110011000011010110111011011111000001011000010111000101100110000000011011111010100111100111100101110110001000001011111"

Bob_bases=['+', 'x', 'x', '+', 'x', '+', 'x', 'x', '+', '+', 'x', 'x', 'x', 'x', 'x', '+', 'x', '+', '+', 'x', '+', 'x', 'x', '+', '+', '+', 'x', 'x', '+', 'x', 'x', 'x', 'x', 'x', '+', 'x', '+', '+', 'x', 'x', 'x', 'x', 'x', 'x', '+', '+', '+', '+', '+', 'x', '+', '+', '+', 'x', '+', 'x', '+', 'x', '+', '+', '+', '+', 'x', 'x', '+', '+', '+', 'x', 'x', 'x', 'x', '+', '+', 'x', '+', '+', 'x', '+', '+', 'x', 'x', '+', '+', 'x', 'x', '+', '+', '+', '+', '+', '+', '+', 'x', 'x', '+', '+', '+', 'x', 'x', '+', 'x', '+', '+', '+', 'x', '+', 'x', '+', 'x', '+', 'x', '+', '+', '+', 'x', 'x', '+', 'x', '+', '+', '+', 'x', '+', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', 'x', '+', 'x', 'x', 'x', '+', 'x', 'x', '+', 'x', 'x', '+', 'x', '+', 'x', '+', 'x', '+', '+', '+', 'x', 'x', '+', '+', '+', 'x', 'x', 'x', 'x', 'x', 'x', 'x', '+', '+', 'x', 'x', '+', 'x', 'x', '+', '+', 'x', '+', '+', 'x', 'x', 'x', '+', '+', 'x', 'x', 'x', '+', '+', '+', 'x', 'x', 'x', 'x', 'x', '+', '+', '+', '+', 'x', 'x', '+', '+', '+', 'x', 'x', 'x', '+', '+', '+', 'x', '+', '+', '+', '+', 'x', '+', 'x', 'x', 'x', 'x', '+', '+', '+', '+', 'x', '+', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', '+', 'x', 'x', 'x', '+', '+', '+', '+', '+', '+', '+', 'x', '+', '+', 'x', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', 'x', '+', 'x', 'x', 'x', 'x', '+', '+', 'x', 'x', '+', 'x', '+', 'x', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', '+', 'x', '+', 'x', '+', 'x', '+', 'x', 'x', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', 'x', '+', 'x', 'x', '+', 'x', '+', 'x', 'x', '+', 'x', '+', '+', '+', '+', '+', '+', 'x', '+', '+', '+', 'x', 'x', 'x', '+', '+', '+', 'x', '+', 'x', '+', '+', '+', '+', 'x', '+', '+', 'x', '+', '+', 'x', '+', '+', 'x', 'x', '+', 'x', '+', '+', 'x', 'x', '+', '+', '+', 'x', 'x', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', '+', 'x', 'x', 'x', '+', '+', 'x', '+', 'x', '+', '+', 'x', 'x', 'x', 'x', 'x', 'x', '+', '+', '+', '+', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', '+', 'x', 'x', '+', 'x', 'x', 'x', 'x', '+', 'x', 'x', '+', '+', 'x', '+', '+', 'x', 'x', '+', 'x', '+', 'x', '+', '+', '+', 'x', 'x', 'x', '+', '+', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', 'x', '+', 'x', 'x', 'x', '+', '+', '+', '+', 'x', 'x', '+', '+', 'x', 'x', '+', '+', '+', 'x', '+', '+', 'x', 'x', '+', 'x', '+', '+', 'x', '+', 'x', '+', 'x', '+', 'x', '+', 'x', '+', '+', 'x', 'x', 'x', '+', '+', 'x', '+', 'x', '+', 'x', 'x', '+', '+', 'x', '+', '+', 'x', '+', '+', '+', 'x', 'x', '+', 'x', '+', '+', '+', '+', 'x', '+', 'x', '+', 'x', 'x', '+', '+', 'x', '+', '+', '+', '+', '+', 'x', 'x', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', 'x', 'x', 'x', '+', '+', 'x', '+', 'x', 'x', 'x', '+', '+', '+', '+', '+', '+', 'x', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', '+', '+', 'x', '+', 'x', '+', 'x', 'x', '+', '+', 'x', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', 'x', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', '+', '+', '+', '+', 'x', 'x', '+', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', '+', '+', '+', 'x', 'x', '+', '+', 'x', '+', '+', '+', 'x', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', '+', '+', '+', '+', '+', 'x', 'x', '+', '+', '+', '+', '+', '+', 'x', '+', 'x', 'x', 'x', '+', '+', '+', 'x', '+', '+', 'x', '+', '+', '+', '+', 'x', '+', '+', 'x', '+', '+', '+', 'x', '+', '+', '+', 'x', 'x', 'x', '+', '+', '+', 'x', '+', '+', '+', '+', 'x', 'x', 'x', 'x', '+', '+', '+', 'x', '+', '+', '+', '+', 'x', 'x', 'x', '+', '+', 'x', '+', 'x', '+', '+', 'x', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', 'x', 'x', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', 'x', '+', 'x', '+', '+', 'x', '+', '+', 'x', '+', '+', '+', '+', 'x', '+', 'x', '+', 'x', '+', '+', '+', 'x', 'x', '+', '+', '+', 'x', 'x', 'x', '+', '+', 'x', '+', 'x', '+', 'x', 'x', '+', 'x', '+', 'x', 'x', '+', 'x', 'x', 'x', '+', '+', 'x', '+', '+', '+', '+', '+', '+', 'x', 'x', 'x', 'x', 'x', 'x', 'x', '+', 'x', 'x', 'x', '+', '+', '+', '+', '+', '+', 'x', 'x', '+', 'x', '+', '+', 'x', 'x', '+', '+', '+', 'x', 'x', 'x', '+', '+', 'x', 'x', 'x', 'x', 'x', '+', '+', '+', '+', 'x', '+', 'x', 'x', '+', '+', 'x', '+', '+', 'x', '+', '+', 'x', '+', 'x', 'x', 'x', '+', '+', '+', '+', '+', 'x', 'x', '+', '+', '+', 'x', 'x', '+', '+', 'x', '+', 'x', '+', 'x', '+', 'x', 'x', 'x', '+', 'x', '+', '+', 'x', 'x', '+', '+', '+', '+', 'x', 'x', '+', '+', '+', 'x', '+', 'x', 'x', 'x', 'x', '+', '+', 'x', 'x', '+', '+', '+', '+', 'x', '+', '+', '+', 'x', '+', '+', '+', '+', 'x', '+', 'x', '+', '+', '+', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', 'x', '+', 'x', 'x', 'x', 'x', '+', 'x', '+', '+', 'x', 'x', '+', 'x', '+', 'x', '+', '+', '+', '+', '+', '+', 'x', '+', '+', '+', '+', '+', '+', '+', 'x', 'x', '+', '+', 'x', '+', '+', 'x', 'x', 'x', 'x', 'x', '+', 'x', 'x', 'x', 'x', 'x', 'x', 'x', '+', '+', 'x', '+', '+', 'x', 'x', '+', 'x', 'x', 'x', '+', 'x', 'x', 'x', '+', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', '+', 'x', '+', '+', '+', 'x', '+', 'x', 'x', '+', '+', '+', 'x', '+', '+', 'x', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', 'x', '+', '+', 'x', 'x', 'x', 'x', 'x']

ciphertext_bin="111010111010010000000101100110100000101000101101100000011111110010101001100111101110010010001100100000101001110000100101111001011010000101001000110110010101000001000111101111001011001101110010000110100011110100110110010110011111000110000000101000000001001101110100001000010001001111001100010100101101100110111000010010110101101101111110011101110111110011010001"


############################請依照以上提示取出flag############################

key=""
for i in range(0,qubit_num-1):
if Alice_bases[i]==Bob_bases[i]:
if (Bob_bases[i]=='+' and qubits[i]['real']==0 and qubits[i]['imag']==1) or (Bob_bases[i]=='x' and qubits[i]['real']==1/sqrt(2) and qubits[i]['imag']==1/sqrt(2)):
key+=Alice_bit_string[i]
if (Bob_bases[i]=='+' and qubits[i]['real']==1 and qubits[i]['imag']==0) or (Bob_bases[i]=='x' and qubits[i]['real']==1/sqrt(2) and qubits[i]['imag']==-1/sqrt(2)):
key+=Alice_bit_string[i]

print("key:")
print(key)

plaintext_bin=''
print(len(ciphertext_bin),len(key))
for i in range(len(ciphertext_bin)):
if key[i]==ciphertext_bin[i]:
plaintext_bin+='0'
else:
plaintext_bin+='1'

print("P:")
print(plaintext_bin)

flag=dec2utf8(plaintext_bin)

print('flag = '+flag+"\n")


image
image

B92

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import random
from math import sqrt
import requests
import json

#將binary string轉成十進制的function
def BinaryToDecimal(binary):
binary1 = binary
decimal, i, n = 0, 0, 0
while(binary != 0):
dec = binary % 10
decimal = decimal + dec * pow(2, i)
binary = binary//10
i += 1
return (decimal)
#將十進制明文轉成UTF8的函數
def dec2utf8(plaintext_bin):
res=""
for i in range(0, len(plaintext_bin), 8):
temp_data = int(plaintext_bin[i:i + 8])
decimal_data = BinaryToDecimal(temp_data)
res = res + chr(decimal_data)
return res

#傳送的qubit總量 key只會有將近1/4
qubit_num=2048

basis_vectors = {
'0': [{'real': 0, 'imag': 1}],
'1': [{'real': 1/sqrt(2), 'imag': -1/sqrt(2)}]
}


#1.Alice亂數產生位元字串
Alice_bit_string = [random.choice('01') for _ in range(qubit_num)]

#2.Alice產生相對應的qubit序列
qubits = [random.choice(basis_vectors[basis]) for basis in Alice_bit_string]

#3.將qubit序列和basis string傳給localhost server(Bob)
#用post傳送json格式的資料到本機端的網頁,並取得json格式反饋
URL = 'http://localhost/index_b92.php'
response = requests.post(
URL,
json={'qubits': qubits}
)

#4.localhost server(Bob)回傳ciphertext和將留下的string
#取得本機伺服器的反饋後解析其json資料
data=json.loads(response.text)
#print(response.text)
print("Reserved string from Bob:")
print(data["reserved"])
print("")
print("Ciphertext from Bob:")
print(data["ciphertext"]+"\n")

res =''
for i in range(0, len(data["ciphertext"]), 8):
temp_data = int(data["ciphertext"][i:i + 8])
decimal_data = BinaryToDecimal(temp_data)
res = res + chr(decimal_data)
print("")
print("Ciphertext to utf8:")
print(res)
print("")


#5.自己比對留下來的string並還原出金鑰
key=""
for i in range(0,qubit_num-1):
##寫出取出key的程式##
if data["reserved"][i]=='1':
key+=Alice_bit_string[i]

print("Your key:")
print(key+"\n")

#6.解密從localhost server來的ciphertext
#開始用KEY XOR來解密
ciphertext_bin=data["ciphertext"]
plaintext_bin=""
for i in range(len(ciphertext_bin)):
if key[i]==ciphertext_bin[i]: #位元相同為0
plaintext_bin+='0'
else: #位元相異為1
plaintext_bin+='1'

#將解密完的binary string轉成utf8(8bits)
flag =''
for i in range(0, len(plaintext_bin), 8):
temp_data = int(plaintext_bin[i:i + 8])
decimal_data = BinaryToDecimal(temp_data)
flag = flag + chr(decimal_data)

print('flag2 = '+flag+"\n")

image
image