簡單的代碼解釋量子通訊(python實(shí)現(xiàn))

我只是一個程序員赞咙,對自然科學(xué)比較感興趣饵隙。首先說明,我對量子力學(xué)僅停留在科普級別的了解歌粥。我僅僅利用其性質(zhì)塌忽,來用代碼嘗試說明量子加密是如何實(shí)現(xiàn)的,僅供拓展思維失驶。打個比方土居,本文對量子加密的討論就如同通過“竄天猴”鞭炮作為demo來了解運(yùn)載火箭的原理。
本文內(nèi)容
量子通訊

觀測對測量結(jié)果的影響

一個宏觀對象嬉探,假設(shè)他有a,b,c 3個屬性擦耀,該屬性在對象生成時就確定,值可以為0或者1涩堤。就如同你生來就是男生/女生 不可修改眷蜓,當(dāng)然現(xiàn)在可以變性,但是實(shí)際上你的基因并不會改變定躏,僅僅是“形似”罷了账磺。

import random

class Object:
    def __init__(self):
        self.__a = random.randint(0,1)
        self.__b = random.randint(0,1)
        self.__c = random.randint(0,1)
    
    def get_a(self):
        return self.__a

    def get_b(self):
        return self.__b

    def get_c(self):
        return self.__b

o = Object()
print("a:"+str(o.get_a())+" b:"+str(o.get_b())+" c:"+str(o.get_c()))
print("b:"+str(o.get_b())+" a:"+str(o.get_a()))
print("c:"+str(o.get_a())+" b:"+str(o.get_b()))
print("a:"+str(o.get_a())+" c:"+str(o.get_b()))

顯而易見芹敌,對象生成后它的屬性便是一個確定的值痊远,該結(jié)果不會因?yàn)槟愕臏y量順序而改變。比如你是一個漢族男性氏捞,不會因?yàn)橄葯z查你的性別還是先檢查你的民族而有所差別碧聪,在人類沒有發(fā)現(xiàn)量子世界的性質(zhì)之前,世間萬物皆為如此液茎〕炎耍可能的運(yùn)行結(jié)果:

a:1 b:0 c:0
b:0 a:1
c:0 b:0
a:1 c:0

量子的觀測不對異性
對量子的不同特征進(jìn)行測量,觀測的順序會影響測量的結(jié)果捆等,這種性質(zhì)被稱為 “量子的觀測不對異性” 滞造。嗯,一個充滿哲♂學(xué)氣息的性質(zhì)栋烤,可見量子是個gay谒养,觀測只對同性。
注意明郭,該結(jié)果不是隨機(jī)的买窟,而是“疊加的”丰泊,因?yàn)楫?dāng)你的測量順序一定時得到的結(jié)果是確定的。在兩個屬性(a,b)的情況下始绍,一個量子的觀測方式有[a,b],[b,a]兩種瞳购,因此其a,b屬性應(yīng)該是兩種狀態(tài)的疊加。以此類推我們用代碼來描述一個擁有a,b,c 3個屬性的“量子對象”亏推。

class TreeNode:
        def __init__(self):
            self.__children = {}
            self.__val = random.randint(0,1)
        
        def set_child(self, name, child):
            self.__children[name]=child
            return child # 方便連續(xù)調(diào)用簡化代碼
        
        def get_child(self, name):
            return self.__children[name]
        
        def get_val(self):
            return self.__val

class Quantum:
    #關(guān)于疊加態(tài) 我們可以用樹結(jié)構(gòu)來維護(hù)
    #一個3個屬性的量子学赛,可表示為,
    #     root
    #   /   |   \
    #  a    b    c
    #  /\   /\   /\
    # b  c a  c a  b 
    # |  | |  | |  |
    # c  b c  a b  a
    

    # 測量方式,隊(duì)列径簿,如果新的測量屬性和隊(duì)列中最后一個值不一致則加入隊(duì)列罢屈,
    # 如果隊(duì)列長度大于(屬性數(shù)-1)則頭部數(shù)據(jù)出列,篇亭,為了便于理解缠捌,假設(shè)有abc三個屬性
    # 測量屬性 隊(duì)列值
    # a       [a]
    # b       [a,b]  
    # c       [b,c]  
    # c       [b,c]   和最后一次測量一樣 不發(fā)生改變
    # a       [c,a]  
    def __init__(self):
        self.route = []
        root = TreeNode()
        self.root = root
        root.set_child('a',TreeNode()).set_child('b',TreeNode()).set_child('c',TreeNode())
        root.get_child('a').set_child('c',TreeNode()).set_child('b',TreeNode())
        root.set_child('b',TreeNode()).set_child('a',TreeNode()).set_child('c',TreeNode())
        root.get_child('b').set_child('c',TreeNode()).set_child('a',TreeNode())
        root.set_child('c',TreeNode()).set_child('a',TreeNode()).set_child('b',TreeNode())
        root.get_child('c').set_child('b',TreeNode()).set_child('a',TreeNode())
    
    def __get(self, name):
        length = len(self.route)
        if (length == 0 or self.route[-1]!=name):
            self.route.append(name)
            if (len(self.route) >2):
                self.route.pop(0)
        node = self.root
        for name in self.route:
            node = node.get_child(name)
        return node.get_val()


    def get_a(self):
        return self.__get('a')

    def get_b(self):
        return self.__get('b')

    def get_c(self):
        return self.__get('c')

好了,我們已經(jīng)通過代碼實(shí)現(xiàn)了“觀測對測量結(jié)果產(chǎn)生影響”的效果译蒂。每一次get屬性值曼月,就是對對象的一次觀測,不同觀測順序下柔昼,變量會返回不同的值哑芹。

# 創(chuàng)造一個量子并對他的屬性反復(fù)觀測
q = Quantum()
print('a',q.get_a())
print('b',q.get_a())
print('a',q.get_b())
print('c',q.get_c())
print('a',q.get_a())
print('b',q.get_a())
print('a',q.get_a())

可能的運(yùn)行結(jié)果

a 0
b 0
a 1
c 1
a 0
b 0
a 0

量子秘鑰分發(fā)

通過量子的物理性質(zhì),保證了秘鑰分發(fā)時的絕對安全
用代碼來模擬該過程:

from quantum import Quantum
import random


class Observer:
    length = 20

    def __init__(self, name):
        self.name = name
        self.q_list = []  # 量子集合

    # 初始化量子集合
    def init_quantum(self):
        for i in range(Observer.length):
            self.q_list.append(Quantum())

    # 觀測
    def observe(self):
        def __observe(quantum):
            ran = random.randint(0, 2)
            #最常見的光量子就有“線偏振”和“圓偏振”兩種屬性
            # 只使用a,b兩個屬性 來模擬這種情況
            if (ran == 0):
                return ('a', q.get_a())
            else:
                return ('b', q.get_b())
        self.path = []
        self.result = []
        for q in self.q_list:
            result = __observe(q)
            self.path.append(result[0])
            self.result.append(result[1])
        print(self.name,'觀測方式:', self.path)
        print(self.name,'觀測結(jié)果:', self.result)
    
    # 從另一個觀測者獲取量子序列
    def get_quantum(self, another):
        self.q_list=another.q_list
    
    # 從另一個觀測者獲取觀測方式
    def get_path(self, another):
        self.key = []
        for i in range(Observer.length):
            if (another.path[i] == self.path[i]):
                self.key.append(self.result[i])
        print(self.name,'秘鑰:', self.key)

觀測和秘鑰傳輸

sender = Observer('發(fā)送者')
sender.init_quantum() # 初始化量子序列
sender.observe() # 對量子序列進(jìn)行觀測

reciver = Observer('接收者')
reciver.get_quantum(sender) # 發(fā)送者把量子傳輸給接收者
reciver.observe() # 接收者對其觀測

# 雙方交換觀察方式
sender.get_path(reciver)
reciver.get_path(sender)

可以得到這樣的運(yùn)行結(jié)果:

發(fā)送者 觀測方式: ['b', 'b', 'a', 'a', 'a', 'b', 'b', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'a', 'b', 'a', 'b', 'b', 'b']
發(fā)送者 觀測結(jié)果: [0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1]
接收者 觀測方式: ['a', 'b', 'a', 'a', 'b', 'b', 'a', 'a', 'b', 'b', 'b', 'b', 'a', 'b', 'b', 'b', 'b', 'b', 'b', 'a']
接收者 觀測結(jié)果: [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0]
發(fā)送者 秘鑰: [0, 0, 1, 1, 0, 1, 0, 0, 1, 1]
接收者 秘鑰: [0, 0, 1, 1, 0, 1, 0, 0, 1, 1]

如何保證安全

在模擬的代碼中捕透,“量子的觀測不對異性” 通過存儲觀測方式 path 在Quantum對象中實(shí)現(xiàn)聪姿。這是我們在宏觀世界來模擬這種現(xiàn)象的一種實(shí)現(xiàn)手段,實(shí)際上這是一種基本物理性質(zhì)乙嘀,觀測者不可能從量子上得到之前對它觀測的方式末购。

量子不可克隆
要保證安全還需要量子的另一個特性“量子不可克隆”。就是說虎谢,世間沒有兩個相同的量子盟榴,你不可能通過一個已得到的量子獲得完全相同的另一個量子。沒有這個原理婴噩,竊聽者完全可以復(fù)制一個量子對它進(jìn)行觀測并把原來的量子傳送給接收者擎场。

竊聽過程
知道上述兩個物理性質(zhì)后,如果有人試圖監(jiān)聽几莽,便是只能中截獲了發(fā)送者傳輸?shù)牧孔友赴欤⒂^測其值,然后再把它發(fā)送給接收者章蚣。然而此時所有人都不知道發(fā)送者的觀測方式站欺。竊聽者也只能按自己的想法隨意觀測其屬性。但沒有關(guān)系,你對量子的觀測便改變了量子的狀態(tài)镊绪,當(dāng)接收者獲取到量子時匀伏,即便和發(fā)送者用同樣的方式觀測,也有可能得到不同的結(jié)果蝴韭,當(dāng)這個序列數(shù)量非常大的時候,這是必然發(fā)生的够颠,結(jié)果就是得到了和發(fā)送者不一樣的秘鑰,這樣竊聽便被發(fā)現(xiàn)了榄鉴。

模擬上述過程:

sender = Observer('發(fā)送者')
sender.init_quantum() # 初始化量子序列
sender.observe() # 對量子序列進(jìn)行觀測

interceptor = Observer('竊聽者')
interceptor.get_quantum(sender) # 截取信息
interceptor.observe() # 觀測

reciver = Observer('接收者')
reciver.get_quantum(interceptor) # 發(fā)送者把量子傳輸給接收者
reciver.observe() # 接收者對其觀測

# 雙方交換觀察方式
sender.get_path(reciver)
reciver.get_path(sender)

運(yùn)行結(jié)果:

發(fā)送者 觀測方式: ['b', 'a', 'b', 'a', 'b', 'b', 'b', 'a', 'b', 'a', 'b', 'b', 'a', 'a', 'b', 'b', 'b', 'a', 'b', 'a']
發(fā)送者 觀測結(jié)果: [1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1]
竊聽者 觀測方式: ['a', 'b', 'a', 'b', 'b', 'b', 'b', 'a', 'b', 'a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'b', 'b', 'b']
竊聽者 觀測結(jié)果: [0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0]
接收者 觀測方式: ['a', 'a', 'b', 'b', 'a', 'a', 'a', 'b', 'a', 'b', 'b', 'b', 'b', 'a', 'b', 'b', 'b', 'a', 'b', 'a']
接收者 觀測結(jié)果: [0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0]
發(fā)送者 秘鑰: [1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1]
接收者 秘鑰: [1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0]

代碼請參考
https://github.com/lzlz000/simple-clear-knowledge/tree/master/%5Bpython%5D%E9%87%8F%E5%AD%90%E9%80%9A%E8%AE%AF

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末履磨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子庆尘,更是在濱河造成了極大的恐慌剃诅,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驶忌,死亡現(xiàn)場離奇詭異矛辕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)付魔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門聊品,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人几苍,你說我怎么就攤上這事翻屈。” “怎么了妻坝?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵伸眶,是天一觀的道長。 經(jīng)常有香客問我刽宪,道長厘贼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任纠屋,我火速辦了婚禮涂臣,結(jié)果婚禮上盾计,老公的妹妹穿的比我還像新娘售担。我一直安慰自己,他們只是感情好署辉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布族铆。 她就那樣靜靜地躺著,像睡著了一般哭尝。 火紅的嫁衣襯著肌膚如雪哥攘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音逝淹,去河邊找鬼耕姊。 笑死,一個胖子當(dāng)著我的面吹牛栅葡,可吹牛的內(nèi)容都是我干的茉兰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼欣簇,長吁一口氣:“原來是場噩夢啊……” “哼规脸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起熊咽,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤莫鸭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后横殴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體被因,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年衫仑,在試婚紗的時候發(fā)現(xiàn)自己被綠了氏身。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡惑畴,死狀恐怖蛋欣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情如贷,我是刑警寧澤陷虎,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站杠袱,受9級特大地震影響尚猿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜楣富,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一凿掂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纹蝴,春花似錦庄萎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兼犯,卻和暖如春忍捡,著一層夾襖步出監(jiān)牢的瞬間集漾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工砸脊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留具篇,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓凌埂,卻偏偏與公主長得像栽连,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子侨舆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容