并不需要会量子计算。
我看的是 TUNA 杰哥的这一篇快速入门的 BB84。制备基底和量子态填一样长的随机序列,最后取测量基底和制备基底相同的位置的量子态作为密钥即可。
>>> 制备基底 = "+x+++x+xx+xxxx+++xxxxxxx+xx+x++x+x++x++x+xxxx++x+++xxx++xx++++x++x++++x++++x+x++x+++xxx++xx+xxxx++xxxx++x++xx++x++xxxxxx+x+xx++x"
>>> 量子态 = "00111010000101101011101011011111011110101101110011101101010010110110100010101110100101000000001000000111100011000101100110111100"
>>> 测量基底 = "xx+++x+xx+x+x++xx++xx++x+xxx++x+x+x++++x++xxxx+xxx+x+x++x++x+x+xx+xx++++xx+xxx+x++x+x+xx+xx++x++++xxxxx+xxxx++x+x+xx+x+x+xx+++++"
>>> ''.join([量子态[i] if 制备基底[i] == 测量基底[i] else '' for i in range(len(量子态))])
'011101000001110110110101011001010100110010110100000000000011101101011010'
我不会量子计算,但我会抄代码啊。
直接看题目中给的 Qiskit 库教程,很明显藏宝图就是用 Qiskit 生成的。就那几种 gate,稍微试几个组合 draw 一下看看就明白怎么回事了。最后调用 qc.measure_all()
就能“运行”这个电路。完整代码请见 量子藏宝图/code.py。
运行效果:
$ python3 量子藏宝图/code.py
{'001100110011011000110000101100111011110110011100000110101011001000011000100110000001100100011011001100011011000100011001001111101 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000': 502, '101100110011011000110000101100111011110110011100000110101011001000011000100110000001100100011011001100011011000100011001001111101 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000': 522}
不用明白输出的都是啥。那两个 129 位比特串后 128 位是一样的,就是 flag 了:
>>> (0b01100110011011000110000101100111011110110011100000110101011001000011000100110000001100100011011001100011011000100011001001111101).to_bytes(16, 'big')
b'flag{85d1026cb2}'