聲明:如下內容或摘自或總結自吳軍老師的《數學之美》,因爲所理解能力有限,本文並不對內容的科學性進行考證,但求可以從中略窺知一二,則已是大有裨益了。而內容的科學性考證仍是交給一些領域專家們去作吧,我盡我所能普遍涉獵而已。css
兩千年前,相傳名將凱撒爲了防止敵方截獲情報,用密碼傳送情報。凱撒的作法很簡單,就是對二十幾個羅馬字母創建一張對應表,好比說
這樣,若是不知道密碼本,即便截獲一段信息也看不懂,好比收到一個的消息是EBKTBP,那麼在敵人看來是毫無心義的字,經過密碼本解破出來就是 CAESAR 一詞,即凱撒的名字。這種編碼方法史稱凱撒大帝。
以上原始的方法經過統計一下字母頻率就能夠破解。而若是編碼時,一對多,並隨機挑選,這樣就沒法經過統計破解。
好的密碼必須作到已知明文和密文的對應推斷不出新的密文內容,就是說沒法把握從密文到明文的轉換規律。html
根據信息論,密碼最高的境界是敵方在截獲密碼時,信息量沒有增長。通常來說,當密碼分佈均勻並統計獨立,提供的信息最少,相似白噪聲就最難把握。
以早期著名的RSA算法爲例,說明公開密匙的加密過程。算法
有公匙和私匙之分,一個用於加密,一個用於解密;
兩個看似無關的密匙,在數學上是關聯的;編程
找兩個很大的素數(質數)P 和 Q,越大越好,好比 100 位長的, 而後計算它們的乘積 N=P×Q,M=(P-1)×(Q-1)。安全
找一個和 M 互素的整數 E,也就是說 M 和 E 除了 1 之外沒有公約數。markdown
找一個整數 D,使得 E×D 除以 M 餘 1,即 E×D mod M = 1。ide
其中 E 是公鑰,誰均可以用來加密,D 是私鑰用於解密,必定要本身保存好。乘積 N 是公開的,即便敵人知道了也不要緊。
咱們用下面的公式對 X 加密,獲得密碼 Y。編碼
好了,如今沒有密鑰 D,神仙也沒法從 Y 中恢復 X。若是知道 D,根據費爾馬小定理,則只要按下面的公式就能夠垂手可得地從 Y 中獲得 X。atom
1.簡單。只是一些乘法而已。
2.可靠。公開密鑰方法保證產生的密文是統計獨立而分佈均勻的。也就是說,不論給出多少份明文和對應的密文,也沒法根據已知的明文和密文的對應來破譯下一份密文。更重要的是 N,E 能夠公開給任何人加密用,可是隻有掌握密鑰 D 的人才能夠解密, 即便加密者本身也是沒法解密的。這樣,即便加密者被抓住叛變了,整套密碼系統仍然是安全的。(而凱撒大帝的加密方法有一個知道密碼本的人泄密,整個密碼系統就公開了。)
3.靈活。能夠產生不少的公開密鑰E和私鑰D的組合給不一樣的加密者。加密
首先聲明世界上沒有永遠破不了的密碼,關鍵是它能有多長時間的有效期,一種加密方法只要保證50年內計算機破解不了就能夠滿意了。
下面補充一些數學上的知識和段子:
摘自 http://www.cricode.com/1087.html
A CHEF HIDE A BED
廚子藏起來了一張牀!這是如此的重要,須要當即通知總部。千萬重要的是,不能讓反革命的廚子知道。
第一步是轉碼,也就是將英文轉換成某個對應的數字。這個對應很容易創建,好比:
A B C D E F G H I
1 2 3 4 5 6 7 8 9
將上面的信息轉碼,得到下面的數字序列:
A CHEF HIDE A BED
1 3856 8945 1 254
這串數字徹底沒有什麼祕密可言。廚子發現了這串數字以後,很容易根據數字順序,對應字母表猜出來。
爲了和狡猾的廚子鬥智鬥勇,咱們須要對這串數字進一步加密。使用總部發給咱們的鎖,兩個數字:3和10。咱們分爲兩步處理。
第一步是求乘方。第一個數字是3,也就是說,總部指示咱們,求上面數字串的3次方:
原字符串: 1 3 8 5 6 8 9 4 5 1 2 5 4
三次乘方: 1 27 512 125 216 512 729 64 125 1 8 125 64
第二步是求餘數。第二個上鎖的數字是10,將上面每一個三次乘方除以10,得到其他數:
餘數: 1 7 2 5 6 2 9 4 5 1 8 5 4
將這串數字發回總部。中途被廚子偷看到,但一時不能瞭解其中的意思。若是仍是像剛纔同樣對應字母表的話,信息是:
AGBEFBIDEAHED
這串字母徹底不包含正常的單詞。
信息到了總部。總部開始用神奇的鑰匙來解讀。這個鑰匙是3。(偷偷告訴你的,別告訴廚子。)
(這裏鑰匙不當心和以前鎖中的一個數字相同。這只是巧合。)
解鎖過程也是兩步。第一步求鑰匙次的乘方,即3次方。第二步求它們除以10(鎖之一)的餘數。
加密信息:1 7 2 5 6 2 9 4 5 1 8 5 4
三次乘方:1 343 8 125 216 8 729 64 125 1 512 125 64 (這裏用的是鑰匙的「3」)
除十得餘:1 3 8 5 6 8 9 4 5 1 2 5 4
正是咱們發送的信息。對應字母表,總部能夠當即知道原來的信息。
再次強調,爲了演示方便,選用了簡單的鎖和鑰匙。鎖和鑰匙只是湊巧相同。爲此,咱們作一個小練習。
練習:總部新公佈出來的鎖是2987(次乘方)和3937(爲除數)。
1) 做爲特工,用上面的算法爲信息加密(你可能須要一些編程來計算,嘗試用Python的數學計算功能?)。
猜到鑰匙是什麼了呢?不是上面兩個數字中的任何一個,而是143!
2) 做爲值班人員,驗證143是鑰匙,能夠解密信息。
爲了簡便,你能夠只檢驗一個簡單的信息,好比「IE」。
發覺本身被愚弄了,廚子很生氣,後果很嚴重。廚子發奮看了書,知道了這個加密方法叫RSA,是三爲發明人 R. Rivest, A. Shamir和L. Adelman名字首字母合起來的。RSA算法是1977年發明的。全稱是RSA Public Key System。這個」Public Key」是公共密鑰,也就是咱們上面說的鎖。再讀下去,廚子大窘。這個1977年的,現代計算機加密的RSA算法,竟然源於17世紀。
RSA的原理藉助了數論中的「歐拉定理」(Euler’s theorem)。17世紀的費馬首先給出一個該定理的特殊形式,即「費馬小定理」:
p是一個正的質數,a是任意一個不能被p整除的整數。那麼,
咱們並不須要太深刻了解費馬小定理,由於等下就會看到這個定理的「升級版」。但這個定理依然很美妙,它優美的獲得乘方和整除的某種特殊關係。使用一個例子來講明它。好比p=7,a=3。那麼費馬小定律表示,
事實上,上面的數字計算獲得
數學小貼士:
1) 除 (divide),商和餘數:兩個整數相除,有一個爲整數的商,和一個餘數。好比10/3=3,餘1。咱們用一個特別的方式記錄這一敘述:
10≡1(mod3)
也能夠寫成另外一種方式:
[10]3=[1]3
這一表述方式與「10除以3,得3餘1」這樣的方式並無什麼區別。但採用標準的數學方式更容易和別人交流。
若是咱們知道:
[a]n=[b]n
那麼存在某個整數t,且:
a=nt+b
2) 整除 (divisible):當一個整數a除以另外一個整數b,餘數爲0時,那麼咱們說a能夠被b整除。好比說,4能夠被2整除。即
[4]2=[0]2
3) 質數 (prime number):一個質數是隻能被±1和這個數自身整除的整數(不包括±1)。好比2,3,5,7,11,13等等。
加密方法是將原來的某種信息按照某個規律打亂。某種打亂的方式就叫作密鑰(cipher code)。發出信息的人根據密鑰來給信息加密,而接收信息的人利用相同的密鑰,來給信息解密。就好像一個帶鎖的盒子。發送信息的人將信息放到盒子裏,用鑰匙鎖上。而接受信息的人則用相同的鑰匙打開。加密和解密用的是同一個密鑰,這種加密稱爲對稱加密(symmetric encryption)。
若是一對一的話,那麼兩人須要交換一個密鑰。一對多的話,好比總部和多個特工的通訊,依然可使用同一套密鑰。但這種狀況下,對手偷到一個密鑰的話,就知道全部交流的信息了。二戰中盟軍的情報戰成果,不少都來自於破獲這種對稱加密的密鑰。
對稱加密的薄弱之處在於給了太多人的鑰匙。若是隻給特工鎖,而總部保有鑰匙,那就容易了。特工將信息用鎖鎖到盒子裏,誰也打不開,除非到總部用惟一的一把鑰匙打開。只是這樣的話,特工每次出門都要帶上許多鎖,太容易被識破身份了。總部老大想了想,乾脆就把造鎖的技術公開了。特工,或者任何其它人,能夠就地取材,按照圖紙造鎖,但沒法根據圖紙造出鑰匙。鑰匙只有總部的那一把。
關鍵是鎖和鑰匙工藝不一樣。知道了鎖,並不能知道鑰匙。這樣,銀行能夠將「造鎖」的方法公佈給全部用戶。每一個用戶能夠用鎖來加密本身的信用卡信息。即便被別人竊聽到,也不用擔憂:只有銀行纔有鑰匙呢!這樣一種加密算法叫作非對稱加密(asymmetric encryption)。非對稱加密的經典算法是RSA算法。它來自於數論與計算機計數的奇妙結合。
2015-9-16 藝少