如何用通俗易懂的話來解釋非對稱加密?

給同行解釋,其實也是一幫程序員,他們對加密沒有概念。在他們眼中base64和md5都是用來加密的。
我已經可以通過通俗易懂的話加上簡單的生活中的例子來說明簽名、base64、甚至是霍夫曼編碼壓縮(他們也認為壓縮是加密---這是一堆很奇葩的程序員,工作在非常小的領域)的用途、原理。

那麼,現在,如何來說明非對稱加密。。。(其實這個問題也是從SSL來的)?
包括用途、原理、、、以及簡單的例子。 謝謝了。

-------------
補充一下,對稱加密我已經可以說得他們能聽得懂了。。。


數據跑不完啊跑不完… 於是混知乎答答題。
=============================
這道題其實我關注很久了。這也是我一直頭痛的問題… 怎麼給一個完全不懂密碼學的人講解非對稱(Asymmetric)/公鑰(Public Key)加密體制呢。想起了我Boss的一句話:密碼學都源於生活,是為了解決生活中實際問題而來的。而且幾乎所有的密碼學體制在實際生活中都有一個對應。

那麼,我也來試著用生活中的例子來講一講公鑰加密體制唄。這個答案中,我盡量不使用任何公式,而是盡量用通俗易懂的方式回答。
=============================
1. 引言:以門鎖為例(對稱/私鑰加密體制,Symmetric / Private Key Encryption)
愚蠢的人類啊,為了保護自己的財產,天天都跟門鎖和鑰匙打交道。最開始的門鎖是這樣的:

這樣的:

以及看起來高端點,但其實還是很脆弱的這樣的:

看著挺結實,稍微來個鉗子什麼的馬上就斷了啊有木有!直到人們明確了什麼叫做安全的鎖,並且按照規定製造了這樣的鎖,門鎖才變得比較安全。門鎖大概有什麼樣的要求呢?簡單地說有這麼幾條:

  • 鎖芯前面的金屬頭必須非常堅固,非特殊工具無法打開。
  • 鑰匙必須足夠複雜,非常難複製(所以現在防盜門鑰匙基本都很難配的)。
  • 當然了,門本身也必須足夠結實…

按照這樣的要求,人們製作了一些很安全的門鎖,比如這樣的:

以及這樣的:

但是這些門鎖都有一個共同的問題:就是鎖門的時候必須用鑰匙鎖!在實際生活中這其實是個好事情。如果不用鑰匙鎖,那我把門撞上了結果沒帶鑰匙豈不是瞎了(這種情況時常發生嘛)…不過,如果門鎖只是鎖自己家的還好,畢竟進自己家門的話當然需要自己的許可了。可是,如果鎖門需要幾個人的參與,事情可就比較麻煩了,考慮這樣的情況:

  • 我親戚(或者其他我比較信任的人)來我家做客,但我臨時有事要出去,不知道幾點回來。難道讓我親戚看家,等我回來再離開么?最好的方法就是他歇夠了,出門把門一撞,完事~
  • 我新買的房子,需要裝修隊裝修。裝修過程中當然可以開著門誰都能進。裝修完了呢?施工隊等我回來驗收後我主動來鎖門他們才能走?

人類的智慧是無窮的。前面也提到了,我們可以找那種能把門撞上打不開的門鎖嘛,比如球形鎖這樣的:

這個非常方便啊有木有。別人想鎖門的時候,從裡面把按鈕按下去,一撞門,外面就打不開了,只有有鑰匙的人才能打開。如果不把按鈕按下去,外面還是可以打開的。更典型的是酒店的門鎖,差不多是這樣:

電子的哎,更高端了有木有。電子鎖如果檢測到門被關上了,它會自動彈出鎖芯把門鎖住,只有刷卡才能開。這非常好啊,徹底解決了這個問題。
=============================
2. 能「撞」上的保險箱(非對稱/公鑰加密體制,Asymmetric / Public Key Encryption)
數據加密解密和門鎖很像。最開始的時候,人們只想到了那種只能用鑰匙「鎖」數據的鎖。如果在自己的電腦上自己加密數據,當然可以用最開始這種門鎖的形式啦,方便快捷,簡單易用有木有。

但是我們現在是通信時代啊,雙方都想做安全的通信怎麼辦呢?如果也用這種方法,通信就好像互相發送密碼保險箱一樣… 而且雙方必須都有鑰匙才能進行加密和解密。也就是說,兩個人都拿著保險箱的鑰匙,你把數據放進去,用鑰匙鎖上發給我。我用同樣的鑰匙把保險箱打開,再把我的數據鎖進保險箱,發送給你。大概就這麼個樣子:

這樣看起來好像沒什麼問題。但是,這裡面最大的問題是:我們兩個怎麼弄到同一個保險箱的同一個鑰匙呢?好像僅有的辦法就是我們兩個一起去買個保險箱,然後一人拿一把鑰匙,以後就用這個保險箱了。可是,現代通信社會,絕大多數情況下別說一起去買保險箱了,連見個面都難,這怎麼辦啊?於是,人們想到了「撞門」的方法。我這有個可以「撞上」的保險箱,你那裡自己也買一個這樣的保險箱。通信最開始,我把保險箱打開,就這麼開著把保險箱發給你。你把數據放進去以後,把保險箱「撞」上發給我。撞上以後,除了我以外,誰都打不開保險箱了。這樣聽起來好像很合理的樣子,大概是這麼個情況:

=============================
3. 權威機構造保險箱(可信第三方,Trusted Third Party)
這種鎖看起來好像很不錯,但是鎖在運輸的過程中有這麼一個嚴重的問題:你怎麼確定你收到的開著的保險箱就是我發來的呢?對於一個聰明人,他完全可以這麼干:

  1. 裝作運輸工人。我現在把我開著的保險箱運給對方。運輸工人自己也弄這麼一個保險箱,運輸的時候把保險箱換成他做的。
  2. 對方收到保險箱後,沒法知道這個保險箱是我最初發過去的,還是運輸工人替換的。對方把數據放進去,把保險箱撞上。
  3. 運輸工人往回運的時候,用自己的鑰匙打開自己的保險箱,把數據拿走。然後複印也好,偽造也好,弄出一份數據,把這份數據放進我的保險箱,撞上,然後發給我。

從我的角度,從對方的角度,都會覺得這數據傳輸過程沒問題。但是,運輸工人成功拿到了數據,整個過程還是不安全的,大概的過程是這樣:

這怎麼辦啊?這個問題的本質原因是,人們沒辦法獲知,保險箱到底是「我」做的,還是運輸工人做的。那乾脆,我們都別做保險箱了,讓權威機構做保險箱,然後在每個保險箱上用特殊的工具刻上一個編號。對方收到保險箱的時候,在權威機構的「公告欄」上查一下編號,要是和保險箱上的編號一樣,我就知道這個保險箱是「我」的,就安心把數據放進去。大概過程是這樣的:

如何做出刻上編號,而且編號沒法修改的保險箱呢?這涉及到了公鑰體制中的另一個問題:數字簽名。不過題主的問題裡面既然沒有問道的話,我也就不勞心答了~
=============================
2015.08.04晚22:00繼續更新

本來就想到此為止了,不過評論區2個知乎er們希望我繼續講下去,那麼就繼續?

=============================
4 在保險箱上刻個字(數字簽名,Digital Signature)
上回說到如何做出刻上編號,而且編號沒法修改的保險箱。那麼我們繼續樓。要知道,刻字這種事情吧,誰都能幹,所以想做出只能自己刻字,還沒法讓別人修改的保險箱確實有點難度。那麼怎麼辦呢?這其實困擾了人們很長的時間。

直到有一天,人們發現:我們不一定非要在保險箱上刻規規矩矩的字,我們乾脆在保險箱上刻手寫名字好了。而且,刻字有點麻煩,乾脆我們在上面弄張紙,讓人直接在上面寫,簡單不費事。

具體做法是,我們在保險箱上嵌進去一張紙,然後每個出產的保險箱都讓權威機構的CEO簽上自己的名字。然後,CEO把自己的簽名公開在權威機構的「公告欄」上面。比如這個CEO就叫「學酥」,那麼整個流程差不多是這個樣子:

這個方法的本質原理是,每個人都能夠通過筆跡看出保險箱上的字是不是學酥CEO簽的。但是呢,這個字體是學酥CEO唯一的字體。別人很難模仿。如果模仿我們就能自己分辨出來了。要是實在分辨不出來呢,我們就請一個筆跡專家來分辨。這不是很好嘛。這個在密碼學上就是數字簽名

=============================
5 在保險箱上刻的字不能一樣(帶時間戳 / 隨機數的簽名,Signature with Timestamp / Randomness)
上面這個簽字的方法雖然好,但是還有一個比較蛋疼的問題。因為簽字的樣子是公開的,一個聰明人可以把公開的簽字影印一份,自己造個保險箱,然後把這個影印的字也嵌進去。這樣一來,這個聰明人也可以造一個相同簽字的保險箱了。

解決這個問題一個非常簡單的方法就是在看保險箱上的簽名時,不光看字體本身,還要看字體是不是和公開的字體完全一樣。要是完全一樣,就可以考慮這個簽名可能是影印出來的。甚至,還要考察字體是不是和其他保險柜上的字體一模一樣。因為聰明人為了欺騙大家,可能不影印公開的簽名,而影印其他保險箱上的簽名。

這種解決方法雖然簡單,但是驗證簽名的時候麻煩了一些。麻煩的地方在於我不僅需要對比保險箱上的簽名是否與公開的筆跡一樣,還需要對比得到的簽名是否與公開的筆跡完全一樣,乃至是否和所有發布的保險箱上的簽名完全一樣。有沒有什麼更好的方法呢?

當然有,人們想到了一個比較好的方法。那就是,學酥CEO簽字的時候吧,不光把名字簽上,還得帶上簽字得日期,或者帶上這個保險箱的編號。這樣一來,每一個保險箱上的簽字就唯一了,這個簽字是學酥CEO的簽名+學酥CEO寫上的時間或者編號。這樣一來,就算有人偽造,也只能偽造用過的保險箱。這個問題就徹底解決了。這個過程大概是這麼個樣子:

=============================
6 造價問題(密鑰封裝機制,Key Encapsulation Mechanism)
解決了上面的各種問題,我們要考慮考慮成本了… 這種能「撞」門的保險箱雖然好,但是這種鎖造價一般來說要比普通的鎖要高,而且鎖生產時間也會變長。在密碼學中,對於同樣「結實」的鎖,能「撞」門的鎖的造價一般來說是普通鎖的上千倍。同時,能「撞」門的鎖一般來說只能安裝在小的保險柜裡面。畢竟,這麼複雜的鎖,裝起來很費事啊!而普通鎖安裝在多大的保險柜上面都可以呢。如果兩個人想傳輸大量數據的話,用一個大的保險柜比用一堆小的保險柜慢慢傳要好的多呀。

怎麼解決這個問題呢?人們又想出了一個非常棒的方法:我們把兩種鎖結合起來。能「撞」上的保險柜裡面放一個普通鎖的鑰匙。然後造一個用普通的保險柜來鎖大量的數據。這樣一來,我們相當於用能「撞」上的保險柜發一個鑰匙過去。對方收到兩個保險柜後,先用自己的鑰匙把小保險柜打開,取出鑰匙。然後在用這個鑰匙開大的保險柜。

這樣做更棒的一個地方在於,既然對方得到了一個鑰匙,後續再通信的時候,我們就不再需要能「撞」上的保險柜了啊,在以後一定時間內就用普通保險柜就好了,方便快捷嘛。這個過程大概是這麼個樣子:

=============================
7 迎接美妙生活吧
最終,我和對方可以充分利用各種各樣的鎖,通過一些很棒的方法,在公開場合下面做安全的通信啦。現在網路通信中的過程大致就是如此,不過裡面還有很多細節的東西。在此我賣個關子,大家可以按照實際生活中的解決方法想一想如何才能解決呢。一些其他的細節問題大致如下:

  • 既然能「撞上」的保險箱都是權威機構產生的,那麼權威機構怎麼把這個保險箱的鑰匙發給用戶呢?
  • 我們如何保證權威機構生產的保險箱是安全的呢?要是權威機構生產的保險箱本身就不安全怎麼辦(這實際上就是稜鏡門事件的一個理論原因)?

另一方面,對於普通的保險箱,或者能「撞上」的保險箱,在現今社會我們還有一些其他需求,這些需求怎麼解決呢?比如下面的問題:

  • (密鑰委託,Key Delegation):我想讓我的親屬能打開我一部分的保險箱。否則遇到突發情況的時候,誰幫我用我的錢交醫藥費啊…同時,我又不能讓他們能打開我全部的保險箱,比如鎖著我日記的保險箱,鎖著我不可告人的秘密的保險箱。
  • (全同態加密/簽名,Fully Homomorphic Encryption/Signature):我在保險箱里鎖了一些金子,我想讓金匠幫我造個首飾,但是我又不想讓金匠在加工過程中偷我的金子。在實際中解決的方法就是我保險箱上面裝了好多工具。金匠可以用這些工具對我保險箱裡面的金子進行加工。但是因為金子還在保險箱裡面鎖著,金匠拿不出金子來。
  • (函數加密,Functional Encryption):我想鎖一些數據在保險箱裡面。但是其實我也不知道這些數據誰能夠打開。不過,我可以確定,滿足某某某某條件的那些人可以打開保險柜,把數據取走。比如說:名字叫學酥的人;只要是個知乎er,還對密碼學感興趣;甚至,是個知乎er,而且年齡在25歲以下的;甚至,我們可以定義任意的條件,反正能滿足的才能打開就對了~

更多的功能等待各位知乎er們來挖掘啦。沒準就是一個很好的密碼學點子呢。

=============================
以上。


你把你家的郵箱放在樓下, 所有的人都可以往裡扔郵件, 而只有你能打開郵箱查看郵件.


首先,每個用戶都有兩把鑰匙,一把公鑰一把私鑰。公鑰是對外發布的,所有人都看的到所有人的公鑰,私鑰是自己保存,每個人都只知道自己的私鑰而不知道別人的。


用該用戶的公鑰加密後只能該用戶的私鑰才能解密。這種情況下,公鑰是用來加密信息的,確保只有特定的人(用誰的公鑰就是誰)才能解密該信息。
下面我拿A銀行和小明來舉例子吧。
假設這2者之間是用不對稱的加密演算法來保證信息傳輸的安全性(不被第三人知道信息的含義及篡改信息)。大致流程如下:
首先小明發了一條信息給A銀行「我要存500元」。這條信息小明會根據A銀行的對外發布的公鑰把這條信息加密了,加密之後,變成「XXXXXXX」發給A銀行。中間被第三者截獲,由於沒有A銀行的私鑰無法解密,不能知道信息的含義,也無法按正確的方式篡改。所以拿這條加密信息是沒辦法的。最後被A銀行接受,A銀行用自己的私鑰去解密這條信息,解密成功,讀取內容,執行操作。然後得知消息是小明發來的,便去拿小明的公鑰,把「操作成功(或失敗)」這條信息用小明的公鑰加密,發給小明。同理最後小明用自己的私鑰解開,得知知乎發來的信息內容。其他人截獲因為沒有小明的私鑰所以也沒有用。

還有第二種情況,公鑰是用來解密信息的,確保讓別人知道這條信息是真的由我發布的,是完整正確的。接收者由此可知這條信息確實來自於擁有私鑰的某人,這被稱作數字簽名,公鑰的形式就是數字證書。怎麼理解呢?

繼續拿小明和銀行A舉例子。銀行A發布了一個銀行客戶端的補丁供所有用戶更新,那為了確保人家下載的是正確完整的客戶端,銀行A會為這個程序打上一個數字簽名(就是用銀行A的私鑰對這個程序加密然後發布),你需要在你的電腦里裝上銀行A的數字證書(就是銀行對外發布的公鑰),然後下載好這個程序,數字證書會去解密這個程序的數字簽名,解密成功,補丁得以使用。同時你能知道這個補丁確實是來自這個銀行A,是由他發布的,而不是其他人發布的。

如果想了解演算法的數學原理,可以看這篇博客:
RSA演算法原理(一)
RSA演算法原理(二)


舉一個小學生都能懂的例子吧:

-----------------------------

看一個小時候經常在《趣味數學》這類書里的一個數學小魔術:

讓對方任意想一個3位數,並把這個數和91相乘,然後告訴我積的最後三位數,我就可以猜出對方想的是什麼數字啦!比如對方想的是123,那麼對方就計算出123 * 91等於11193,並把結果的末三位193告訴我。看起來,這麼做似乎損失了不少信息,讓我沒法反推出原來的數。不過,我仍然有辦法:只需要把對方告訴我的結果再乘以11,乘積的末三位就是對方剛開始想的數了。可以驗證一下,193 * 11 = 2123,末三位正是對方所想的秘密數字!

其實道理很簡單,91乘以11等於1001,而任何一個三位數乘以1001後,末三位顯然都不變(例如123乘以1001就等於123123)。

知道原理後,我們可以構造一個定義域和值域更大的加密解密系統。比方說,任意一個數乘以400000001後,末8位都不變,而400000001 = 19801 * 20201,於是你來乘以19801,我來乘以20201,又一個加密解密不對稱的系統就構造好了。

甚至可以構造得更大一些:4000000000000000000000000000001 = 1199481995446957 * 3334772856269093,這樣我們就成功構造了一個30位的加密系統。

這是一件非常coooooooool的事情,任何人都可以按照我公布的方法加密一個數,但是只有我才知道怎麼把所得的密文變回去。

其安全性就建立在算乘積非常容易,但是要把4000000000000000000000000000001分解成後面兩個數相乘,在沒有計算機的時代幾乎不可能成功!但如果僅僅按照上面的思路,如果對方知道原理,知道我要構造出帶很多0的數,根據19801和8位演算法這2個條件非常容易窮舉出400000001這個目標值。

要解決這個問題,真實世界就不是使用乘法了,比如RSA演算法使用的是指數和取模運算,但本質上就是上面這套思想。



RSA加密是一個方便更換鎖芯,但難以暴力拆卸的鎖

看到上面這麼多以生活中鎖的實例解釋RSA的回答,我決定用簡單的數學和一些很小的數字解釋RSA加密。

-------------------------------------

RSA加密過程用簡單的話說是這樣的:

1. 選兩個很大的質數 p, q

2. 計算 n=pcdot qn 被公開

3. 再選一個數字 e ,需要保證 e(p-1)(q-1) 沒有除1之外的公因數。數字 e (p-1)(q-1)同樣是公開的。

4. 如需加密信息 X,計算 X^e mod n

-------------------------------------

那麼我們用很小的質數來試試看~

1. 我們來假定 p=11, q=17 (真實情況下選擇的兩個質數會大得多得多得多!)

2. n=11cdot17=187

3. 選擇e=3 ,滿足與160沒有除1之外的公因數。

4. 假如我要加密的信息為 X=MATH ,每個字母以它在字母表中的順序賦值(A=1,B=2,C=3, etc)

於是我要加密信息就是 M=13, A=1, T=20, H=8

5. 加密後, 13^3mod187=140 , 1^3mod187=1 , 20^3mod187=146 , 8^3mod187=138 。我發出去的信息就成為了(140, 1, 146, 138)。看起來完全不像MATH吧?

加密完成!

-------------------------------------

看起來,加密的過程對計算機來說挺容易的,那麼接收消息的一方要如何解密呢?


解密的過程簡單來講是這樣的:

1. 找到一個數字 d ,滿足 deequiv1mod(p-1)(q-1)

2. 解密信息 Y ,需要計算 Y^dmod n

-------------------------------------

那我們解密上邊發送過來的信息中的第一個數字,140。

1. 選擇 d=107,滿足 dcdot e=321equiv1 mod160

2. Y^d=140^{107}mod 187 ,數字太大處理不了的話,講這個數字拆成 140^{107}=140^1cdot 140^2cdot 140^8cdot 140^{32}cdot 140^{64} 分別mod 187,再乘在一起最終的結果為 equiv 13 ,放到字母表裡第13個字母就是M啦!

用同樣的方法可以最後得到13,1,20,8,對應字母表中的M,A,T,H。解密就完成了。(過程略~)

-------------------------------------

RSA之所以可以被推廣,並且大範圍應用,是因為目前我們還沒有完全攻陷質數這一領域。我們目前還沒有很好的辦法得知一個很大的數字是不是質數。現在出現了一些預測質數的方法,但我們還不能像給偶數 =2n 一樣,給質數一個完美的定義

設想用兩個很大的質數p, q進行同樣的運算,即便兩個數字的乘積,各自減一的乘積,和與後者沒有公因數的e是公開的,其他人也很難通過任何演算法得知p,q的值。即便人可以通過計算機不停嘗試,突然密鑰 p,q 更換了它們的賦值,那這個嘗試者就前功盡棄了。

如果哪天人類完全掌握了質數的本質,這一天就是RSA加密的末日啦。


為什麼會提出非對稱密鑰體制呢?
在採用對稱密鑰體系時,加密與解密採用相同的演算法和密鑰,這就說明收發雙方需要保存有相同密鑰。這就需要一個安全的通道來傳遞這個密鑰,但實際上這樣安全的通道是不方便的或者沒有的。所以就有了非對稱形式的(不同的密鑰)。公鑰是公開的,私鑰則只有接受者才有,這樣就不必傳遞私鑰了,更安全了。
基本的數學原理?
加解密過程由單向陷門函數實現。單向陷門函數是指由已知的y=f(x)和x求出y是簡單的,但是已知y=f(x)和y求出x是困難的。當前工程應用大都基於大數分解,離散對數和橢圓曲線此類數學難題。


/我有好多鎖,鑰匙都是同一把/ (公鑰多個,私鑰一個)

/喜歡我的小夥子們啊,誰想和我說情話/

/我就給你一把我的鎖/ (送你一把公鑰)

/哦,給你的時候是開著的/

/請把你的甜言蜜語寫下來/

/放進盒子里/

/用我給你的這把鎖鎖上/ (用公鑰加密)

/好了/

/快遞給我吧/

/親自送來吧/

/讓別人帶給我吧/

/無所謂/

/只有我有這把鑰匙,開了鎖/ (私鑰解密)

/看得到你的情話/


我有了一個神奇的魔法箱子,有2個完全不同的鑰匙孔,對應著2把完全不同的鑰匙AB。
我自己留了鑰匙A,把鑰匙B送給你,在很久以前。
現在當我開鎖把東西放進盒子之後,東西就消失了。然後我告訴你我放了東西在箱子里。
只有你用鑰匙B去打開箱子的時候,東西才會出現,並且只有用鑰匙B才能取出這個東西。

因此,就算我的鑰匙A被盜了,被複制了,別人也無法得到這個東西。
只有用鑰匙B才能打開箱子,拿到東西,要是被盜被複制,就不是我的責任了。

由於AB鑰匙完全不一樣,所以叫非對稱加密。


有這樣一個酒店,房間的電子門鎖特別奇怪:所有的門可以用酒店管理員的「公」鑰匙把門鎖住,但是門只能用發給每個住客的「私」鑰匙把門打開。

客戶從來不管關門:意味著客戶出門,管理員得趕緊把門鎖上;用戶進屋了,管理員也得趕緊去把門鎖上。我們都信任管理員都是手腳超快的機械臂,這些操作都是0延時的。

丟東西了?立即會有一個電子法庭會開始進行審判: 酒店會列印解鎖記錄,由客戶確認記錄中是否存在非法解鎖,並且要求客戶提供「私」鑰匙。如果客戶提供不了「私」鑰匙,責任算客戶的;如果客戶提供了「私」鑰匙,並且客戶認為某個解鎖記錄不是自己發起的,則解鎖記錄中的簽名對比,如果用「私」鑰匙重新發起簽名的結果和酒店的記錄匹配,則認為責任算客戶的否則責任算酒店(甭管是記錄系統出bug了還是酒店簽名檢查系統出問題了)的。


非對稱加密的意思是,加密是一碼事,解密是另一碼事。

比如,小明和小紅互相要玩cosplay,但是因為太過羞恥,所以好多對話希望用暗語(加密)

公鑰的意思就是,小紅在給小明發消息的時候,用的是微信這個公開但保密的app(但是存在被人看到,丟手機等情況下,公鑰是有可能被破解的)

私鑰的意思就是,小紅髮的消息只有小明看得懂................

哪怕這個微信被小明室友偷偷截圖發在班級群里,但是大家看不懂。

你必須符合公鑰加密(例子里微信發消息,其實已經很安全很隱私了),而且還要符合私鑰解密(例子里就是只有小明看得懂)

對於公鑰(微信)來說:

1:必須是小紅這個微信號發給我的,我才去看

2:其他任何qq小紅,微信小紅室友等用各種理由發來的消息,我都不看

對於私鑰來說(看得懂)

1:哪怕微信被室友看到

2:哪怕手機被家長檢查

什麼「首長」,什麼「哥譚市」,什麼「葫蘆娃」,只要小明自己看得懂


非對稱加密就是:解密過程不是加密的逆過程。加密演算法已知,密文已知依然推不出明文


這種事情當然要一起講才行╮(╯▽╰)╭,簡要說一下對稱加密。
對稱加密

小明跟小紅都事先約定保險柜密碼。只要知道密碼就可以打開保險柜,得到裡面的東西。

非對稱加密

小明的信箱編號是11A,小紅的信箱編號是11B。這些都是大家知道的,類似於11A,11B這樣的就叫公鑰

小明想給小紅傳送信件,只需要把寫好的信件投到小紅的信箱裡面。被信箱保護的信件,就好比加密的信息。只有小紅用她的鑰匙才能打開。而小紅的鑰匙就是她的私鑰。


這就是公開密鑰,每個人都有一對密鑰,一個公開,一個保密。
A要給B發送信息,就用B的公鑰加密信息然後發送給B。
B得到了加密信息,用自己的密鑰解開加密信息,得到明文信息。


大體原理就是這樣了,例子也就是小明小紅通信了=。=
你同行是程序員的話,可以再詳細一點。
小明給小紅髮送信息,「i love you xiaohong 」用不對稱加密演算法加密,公鑰是11B。得到亂碼「whatthefuxk「。
小紅得到信息,用自己的私鑰「shenmegui」解密」whatthefuxk「,得到明文」iloveyou「
小紅回複信息」hello beitai「........

應該很通俗。。。

參考《應用密碼學》


一句話通俗易懂版:

給你一把打開的鎖,用它鎖住重要的東西寄回給我。鑰匙我自己留著誰也不給。


鎖=公鑰;鑰匙=私鑰



非對稱加密原理解析


作者:wangzz
原文地址:非對稱加密原理解析

一、加密演算法種類


1密鑰
密鑰,一般就是一個字元串或數字,在加密或者解密時傳遞給加密或解密演算法,以使演算法能夠正確對明文加密或者對密文解密。
2加密演算法分類
這世上存在兩種加密演算法:對稱加密(symmetric cryptography)和非對稱加密(asymmetric cryptography)。
也就是說,你想進行加解密操作的時候需要具備兩樣東西:秘鑰和加解密演算法。
2.1、對稱加密
對稱加密演算法的特點是加密使用的密鑰和解密使用的密鑰是相同的。也就是說,加密和解密都是使用的同一個密鑰。因此對稱加密演算法要保證安全性的話,密鑰自然要做好保密,只能讓使用的人知道,不能對外公開。
2.2、非對稱加密
在非對稱加密演算法中,有公鑰和私鑰兩種密鑰,其中,公鑰是公開的,不需要保密,私鑰由個人持有,必須妥善保管和注意保密。加密和解密使用兩種不同的密鑰,是它得名的原因。估計大家都聽說過RSA,這就是一種常見的,應用很廣的非對稱加密演算法。

二、非對稱加密方法
1公鑰私鑰的使用原則
①每一個公鑰都對應一個私鑰。
②密鑰對中,讓大家都知道的是公鑰,不告訴大家,只有自己知道的,是私鑰。 ③如果用其中一個密鑰加密數據,則只有對應的那個密鑰才可以解密。
④如果用其中一個密鑰可以進行解密數據,則該數據必然是對應的那個密鑰進行的加密。

非對稱密鑰密碼的主要應用就是公鑰加密和公鑰認證。
2公鑰加密、解密
加密的目的,是不希望第三者看到當前兩個通訊用戶的通訊內容。

2.1加密
A(客戶)想給B(伺服器)發送一段文字,但是不想讓別人看到,因此想使用非對稱加密方法來加密這段文字,當然,B需要有一對公鑰和私鑰:
① B將他的公鑰發送給A
② A用B給他的公鑰加密這段文字,然後傳給B
③ B用他的私鑰解密A發過來的消息,這裡要強調的是,只要B的私鑰不泄露,這封信就是安全的,即使落在別人手裡,也無法解密。
通過這幾步,B就能成功收到A發送的信息,同時又達到了保密的目的。

2.2解密
如果B想給A回信息,就簡單的多了:
① B將要回復的信息通過自己的私鑰加密,然後傳送給A
② A用B之前給他的公鑰解出這份信息。

3、公鑰認證
在2公鑰加密、解密裡面描述的通訊過程看似簡單,但想想這個問題:在過程2中,A怎麼B給他的回信在傳遞過程中,有沒有被人修改?這就涉及到數字簽名的概念。

3.1數字簽名(digital signature)
微軟官方給出的定義:「數字簽名」是指可以添加到文件的電子安全標記。使用它可以驗證文件的發行者以及幫助驗證文件自被數字簽名後是否發生更改。

3.1.1數字簽名原理
要達到這個目的,一般是對信息做一個hash計算得到一個hash值,注意,這個過程是不可逆的,也就是說無法通過hash值得出原來的信息內容。在把信
息發送出去時,把這個hash值加密後做為一個簽名和信息一起發出去。
接收方在收到信息後,會重新計算信息的hash值,並和信息所附帶的hash值(解密後)進行對比,如果一致,就說明信息的內容沒有被修改過,因為這裡
hash計算可以保證不同的內容一定會得到不同的hash值,所以只要內容一被修改,根據信息內容計算的hash值就會變化。當然,不懷好意的人也可以修
改信息內容的同時也修改hash值,從而讓它們可以相匹配,為了防止這種情況,hash值一般都會加密後(也就是簽名)再和信息一起發送。

3.1.2數字簽名使用方式
下面通過例子來說明這個過程:
B給A回信時,採用了數字簽名的方式
1、B先用hash函數,生成信件的摘要(digest)
2、B使用自己的私鑰,對這個摘要加密,這樣就生成了數字簽名(signature)
3、B將這個簽名附在要回復的信息後面,一起發給A
4、A收到B的信息後,取下數字簽名,並通過B的公鑰解密,得到信件的摘要信息
5、A在對B發送的信息本身使用B指定的hash函數,將得到的結果同上一步解密得到的摘要進行對比,如果兩者一致,就說明B發過來的信息未被修改過。

3.2數字證書(Digital Certificate)
問題就這樣結束了嗎?遠沒有,試想,雖然A確定了B回給他的信息是未修改過的,但是怎麼確定給他回信息的就是B?如果有不懷好意的C把A保存的B的公鑰偷偷換成自己的,並冒用B的名義給A發信息呢?
要解決這個問題,A只要能確定自己持有的公鑰到底是不是B的就行了,這就需要用到數字證書。
數字證書是用來驗證公鑰所屬的用戶身份。在日常生活中,如果我們要驗證一個人的身份,通常的做法是查看他的身份證。我們信任身份證頒發機構即政府機構的公信力,因此只要驗證一個人的身份證不是偽造的,我們就相信這個人的身份和身份證上所描述的是一致的。
數字證書就是一個人或者組織在網路世界中的身份證,其發證機關是證書管理機構(certificate authority,CA)。CA用自己的私鑰對用戶的身份信息(主要是用戶名和該用戶的公鑰)進行簽名,該簽名和用戶的身份信息一起就形成了證書。

3.2.1數字證書的構成
? 證書的發布機構(Issuer)
指出是什麼機構發布的這個證書,也就是指明這個證書是哪個證書中心(certificate authority,簡稱CA)發布的的(只是創建證書,不是指證書的使用者)。
? 證書的有效期(Valid from , Valid to)
也就是證書的有效時間,或者說證書的使用期限。 過了有效期限,證書就會作廢,不能使用了。
? 公鑰 (Public key)
這個我們在前面介紹公鑰密碼體制時介紹過,公鑰是用來對消息進行加密解密的,是很長的一串數字。
? 證書所有者(Subject)
這個證書是發布給誰的,或者說證書的所有者,一般是某個人或者某個公司名稱、機構的名稱、公司網站的網址等。
? 簽名所使用的演算法 (Signature algorithm)
指的這個數字證書的數字簽名所使用的加密演算法,這樣就可以使用證書發布機構的證書裡面的公鑰,根據這個演算法對指紋進行解密。指紋的加密結果就是數字簽名
? 指紋以及指紋演算法 (Thumbprint, Thumbprint algorithm)
這個是用來保證證書的完整性的,也就是說確保證書沒有被修改過。
其原理就是在發布證書時,發布者根據指紋演算法(一個hash演算法)計算整個證書的hash值(指紋)並和證書放在一起,使用者在打開證書時,自己也根據指
紋演算法計算一下證書的hash值(指紋),如果和剛開始的值對得上,就說明證書沒有被修改過,因為證書的內容被修改後,根據證書的內容計算的出的hash
值(指紋)是會變化的。

3.2.2數字證書的生成過程

1、使用數字證書申請者的身份信息生成數字簽名


2、將證書申請者的身份信息和數字簽名一起組成數字證書


3.2.3數字證書原理
有了數字證書以後,A和想跟B通信,就可以通過B的數字證書來獲取B的公鑰,以達到驗證自己手中的公鑰到底是不是B的目的。過程是這樣的:
1、B給A回信的時候,在信息後面附上了自己的數字證書
2、A收到B的回信以後,會取出附帶的數字證書,並讀取證書中的發布機構(Issuer),然後從操作系統的受信任證書機構列表中查找該證書辦發機構的公鑰,如果找不到,說明這個證書頒發機構是個不受信任的,B發過來的信息當然也是不安全的
3、使用上一步取到的證書頒發機構的公鑰,解出數字證書,得到可能是B的用戶信息和數字簽名
4、A通過證書中指定的加密演算法對可能是B的用戶信息進行hash加密
5、加密後的結果和證書中解出的數字簽名進行對比,如果相同,就說明這份用戶信息確實是B的,也就是說用戶信息中包含的公鑰確實是B的
這樣就驗證了B身份的真實性。
下圖很形象的表示了這個過程:

3.2.4證書發布中心(CA)的公鑰的嵌套驗證
這裡有一個有趣的問題,用戶A使用證書機構的公鑰來驗證用戶B的數字證書,但如果A和B使用的證書認證中心(CA)不同怎麼辦呢?由於證書認證中心可以通
過另外一個更高級別的認證中心對該證書機構的公鑰頒發一個證書,這樣形成了一個公鑰證書的嵌套循環,該循環的終點就是根證書機構。根證書機構較少,其公鑰
可以通過安全的方式發布,如通過USB拷貝、書面文件當面移交。如此依賴,A就必須從B的CA的樹形結構底部開始,從底層CA往上層CA查詢,一直到找到
共同的信任CA為止。
整個過程如下圖所示:

3.2.5證書發布機構
3.2.5.1誰可以成為證書發布機構
到這裡,你可能會想,那我們自己就不能發布證書嗎?就一定要花錢去申請?
當然不是,我們自己也可以成立證書發布機構,但是需要通過一些安全認證等等,只是有點麻煩。另外,如果數字證書只是要在公司內部使用,公司可以自己給自己
生成一個證書,在公司的所有機器上把這個證書設置為操作系統信任的證書發布機構的證書(這句話仔細看清楚,有點繞口),這樣以後公司發布的證書在公司內部
的所有機器上就可以通過驗證了(在發布證書時,把這些證書的Issuer(發布機構)設置為我們自己的證書發布機構的證書的Subject(主題)就可以
了)。但是這隻限於內部應用,因為只有我們公司自己的機器上設置了信任我們自己這個所謂的證書發布機構,而其它機器上並沒有事先信任我們這個證書發布機
構,所以在其它機器上,我們發布的證書就無法通過安全驗證。

我們自己可以去註冊一家公司來專門給別人發布證書,但是很明顯,我們自己的專門發布證書的公司是不會被那些國際上的權威機構認可的,人家怎麼知道你是不是
個狗屁皮包公司?因此微軟(或其它操作系統提供商)在它的操作系統中,並不會信任我們這個證書發布機構,當應用程序在檢查證書的合法信的時候,一看證書的
發布機構並不是操作系統所信任的發布機構,就會拋出錯誤信息。也就是說windows操作系統中不會預先安裝好我們這個證書發布機構的證書,不信任我們這
個發布機構。

3.2.5.2不受信任的證書發布機構的危害
為什麼一個證書發布機構受不受信任這麼重要?我們舉個例子。假設我們開了一個狗屁公司來為別人發布證書,並且我和微軟有一腿,微軟在他們的操作系統中把我
設置為了受信任的證書發布機構。現在如果有個小公司叫hisunsray花了10塊錢讓我為他們公司申請了一個證書,並且公司慢慢壯大,證書的應用範圍也
越來越廣。然後有個奸商的公司baidu想冒充hisunsray,於是給了我¥10000,讓我為他們頒布一個證書,但是證書的名字(Subject)
要寫hisunsray,假如我為了這¥10000,真的把證書給了他們,那麼他們以後就可以使用這個證書來冒充hisunsray了。
如果是一個優秀的證書發布機構,比如你要向他申請一個名字叫hisunsray的證書,它會讓你提供很多資料證明你確實可以代表hisunsray這個公司,也就是說他回去核實你的身份。證書發布機構是要為他發布出的證書負法律責任的。

3.2.6如何查看數字證書
我們的操作系統中會預先安裝好一些證書發布機構的證書,我們可以通過證書管理器進行證書的增、刪操作,下面介紹如何找到它們。

3.2.6.1windows
開始菜單-&>運行,輸入certmgr.msc,回車

3.2.6.2mac
打開keychain,選擇鑰匙串中的系統根證書,種類中的證書即可看到下圖所示的收信人證書發布機構列表:

當然,以上這些內容,只涉及到非對稱加密方法的最基礎原理,實際使用的時候肯定複雜很多,有興趣大家可以私下研究。


先聲明,我不是專家。
我對對稱和非對稱加密的理解:
1) 場景:你要通過電話把你的銀行密碼告訴給你老婆。
2.1) 對稱加密:你跟你老婆說,銀行密碼是我說的數字之後+1;然後你告訴你老婆,我的銀行密碼是1024。你老婆知道以後,掐指一算,哦,我老公的密碼是1025.
產生的問題:別人竊聽了電話,也能算出來你的信息,拿你銀行的錢。
2.2) 非對稱加密:你老婆先用某機器造了兩把鑰匙,「私鑰」她自己留著,「公鑰」通過電話告訴你,譬如公鑰是「窗前明月光」,但是「私鑰」她不會通過電話告訴你,你拿到公鑰之後,就對銀行密碼進行加密,然後告訴你老婆加密後的文字,竊聽者雖然知道1)加密的文本 2)公鑰「窗前明月光」,但是有這兩個信息沒法解密,但是你老婆拿到信息以後,用她的私鑰卻解開了,知道了你的銀行密碼是-loveyou。

所以非對稱加密兩個步驟,
1)第一個步驟:「握手」,通信告訴你公鑰匙什麼
2)信息加密和信息發送。

在這個過程中,私鑰僅僅在本地存儲,從來沒有廣播過,減少了被偷走的可能性。每次僅在通信前,「接受信息方」產生一個公鑰和私鑰,然後把公鑰發給「發送信息方」,使每次連接用的公鑰和解密的私鑰都是不同的。


核心在於單向陷門函數


推薦華南理工大學計算機網路安全課程,講得很清晰


我有一個鎖和一個鑰匙。這個鎖只能被這個鑰匙打開。

我把這個鎖給別人,告訴別人給我發消息的時候用這個鎖 鎖在盒子里寄給我就行。因為中間經手的人沒有這個鎖的鑰匙拿到了也打不開,看不到裡面是什麼。

然後我拿到了盒子,用我自己的鑰匙打開鎖,就可以看到盒子裡面的東西了。


這個故事裡的鎖就是公鑰,鑰匙就是私鑰。不同的就是因為計算機里的東西是可複製的,所以我可以把這個鎖複製一萬份分發給一萬個人(注意,這個一萬個鎖都是一樣的,就是只有我手上這個鑰匙才能打開),你們所有人給我發消息的時候都用這個鎖 鎖上,我拿到以後用這一把鑰匙就可以開了。


非對稱密碼也叫做公鑰密碼,是一種加密和解密使用不同密鑰的一種密碼演算法,通俗的說,假如你需要給我發送一條消息,那麼你需要事先告知我,我會把自己的加密密鑰(也稱為公鑰)告訴你,然後你用我所告知你的加密密鑰進行加密,我會用自己的解密密碼(私鑰)進行解密,且僅有我自己知道解密的秘鑰從而保證了信息的機密性。也解決了對稱密碼中的密鑰配送問題。

現在最常用的是RSA,即密文=(明文的E次方 )對N取余

明文=(密文的D次方)對N取余

首先,你可以去取兩個很大的指數p,q ,那麼N=p*q L是p-1和q-1的最小公倍數,E是一個大於1小於L的數,且E和L互質,D只要滿足大於1小於L,且E*D對L取余等於1就能成功解密。

可以查看這個網站


推薦閱讀:

編寫怎樣的代碼能使計算機發熱效率最高?
如何高效的識別出網路爬蟲?
MATLAB循環嵌套的優化,可否改成矩陣運算?
一個N*N的矩陣,取值為0或1,有什麼好的演算法判斷一行或一列全為1啊?
卡爾曼濾波器是如何運用於多感測器融合的?

TAG:程序員 | 軟體開發 | 演算法 | 加密 | 密碼學 |