公鑰與私鑰,在使用公鑰密碼學加密與簽名時,真的就很難選擇嗎?算法
這篇文章是第二版,由於初版不幸地……閒話少說,言歸正傳。加密
常常聽到有人說,在使用公鑰密碼學加密與簽名時,必定要知道是使用公鑰仍是使用私鑰,不然容易鬧笑話。但是,對於一個學過一點密碼學的人來講,真的就那麼難嗎?下面就來討論一下這個問題。spa
密碼學中要使用Key,而在公鑰密碼學中,有兩個Key,一個公鑰PK(Public Key),一個私鑰SK(Secret Key),其中公鑰PK公開,任何人均可以查到,而私鑰SK保密,理論上只應該有你一我的知道。這一點是與分組密碼算法(DES,AES)不一樣的(DES的實現能夠看我之前的一篇博文),由於在分組密碼算法中,只有一個KEY,且是在通訊雙方共享的,而且須要保密。下面以公鑰密碼算法RSA爲例(RSA的小數狀況實現也能夠看個人另外一篇文章),來說一講在公鑰密碼學,加密與簽名時,key的選擇問題。io
首先要說一說通訊,通訊天然要涉及通訊雙方,固然,你也能夠本身和本身通訊(若是你這時還加密簽名的話,你這是閒得……)。密碼學的大師給了通訊雙方兩個好聽的名字A(lice),B(ob)。下面約定一下PK(A),PK(B)分別表明Alice和Bob的公鑰,是徹底公開的,任何人均可以查到;SK(A)爲Alice的私鑰,只有Alice本身知道,SK(B)爲Bob的私鑰,只有Bob一我的知道。下面從Bob的角度來討論。class
加密:原理
加密,爲何要加密?由於通訊的雙方使用的是公開的信道,而信道上是可能有竊聽者的,若是使用明文傳輸消息,即不加密,那麼竊聽者就能夠知道消息的內容了,若是你傳輸的是什麼**消息的話,你就悲劇了。因此爲防止消息被不該該知道的人知道,傳輸時要加密。密碼
在公鑰密碼學中,一個消息M,在key1的控制下,通過密碼算法,獲得密文C,是爲加密;而密文C,在另外一個Key2的控制下,通過密碼算法,能夠獲得對應的明文M,是爲解密。其中一個是公鑰PK,一個是私鑰SK,這是與分組密碼不一樣的。下面來講Bob要傳輸消息給Alice,該使用那個Key。這裏使用枚舉,這個辦法很好用。總共用四個key。(你不會還想用其餘人的key吧。。。)im
1)使用PK(B)嗎(本身的公鑰)?這個,來分析分析。使用PK(B)加密的消息,只能使用對於的SK(B)來解密,而SK(B)只有你本身知道,Alice不知道,竊聽者也不知道。使用這個Key的效果最好,別的人都不能知道消息的內容,竊聽者也拿它沒辦法,可是,通訊的另外一方Alice也不知道消息的內容了,這樣的通訊就沒有意義了。因此,否認掉。總結
2)使用SK(B)嗎(本身的私鑰)?咱們來看看,使用SK(B)加密的消息,要使用PK(B)來加密。而PK(B)是公開的,Alice知道,恩,Alice能夠解密消息了,這個能夠吧!這個真的能夠嗎?正是由於PK(B)是公開的,Alice知道,竊聽者也知道,因此Alice能解密,竊聽者也能解密,因此根本就沒有保密性。和明文傳輸沒多大的差異了。這個一個悲劇的選擇。Pass掉。通信
3)使用SK(A)嗎(對方的私鑰)?SK(A)是Alice的私鑰,只有Alice知道,Bob不知道,這個不行。假設Alice將私鑰偷偷告訴了你,這樣你就可使用了吧。原理和結局同2中的分析。一樣……
4)使用PK(A)嗎(對方的公鑰)?排除法告訴咱們,只有這個能夠選了,那就選它吧。原理什麼的就不用講了吧,你們也沒興趣的。不行,老夫子教導咱們,知其然必知其因此然。咱們要知道原理。好吧,講一講。使用PK(A)加密的消息,要使用SK(A)來解密,而SK(A)對方是知道的,因此消息是能夠解密的;而又由於SK(A)只有Alice知道,別的人包括竊聽者是不知道的,因此消息的保密性是能夠保證的。知足要求。恩,終於弄懂了。
講了這麼多,口都渴了,喝口水了再來說。。。。。。下面將簽名。
簽名:
簽名,現實生活中,咱們可使用本身的筆跡來簽名的。而電子世界呢?簽名,這個是公鑰密碼學提供的而分組密碼是沒法與他比的特性。簽名,爲何要簽名?舉個例子,假如你發送一條消息給銀行,從你的帳號中轉1億出去(反正是舉例子,說這麼大的數額也沒什麼關係),銀行執行了這條消息,轉了帳,過後,你跟銀行說,你沒有轉過帳,要讓銀行賠償,若是銀行拿不出證據,那銀行就悲劇了、破產了,而銀行是能夠拿出證據的,證據就在那條消息中,由於你對它簽名了,而簽名在法律上是有效的證據的。好吧。那麼,Bob要對消息簽名,他該使用哪一個key?枚舉法再次閃亮登場……
1)使用PK(A)嗎(對方的公鑰)?假設能夠的話,因爲PK(A)是公開的,那麼任何都是能夠僞造你的簽名的,你的銀行卡就爆了。。。
2)使用SK(A)嗎(對方是私鑰)?一樣這個你是不知道的。就是對方告訴了你,仍是有問題的,由於這個和你的另外一個key不匹配,簽名是不能驗證的,這個問題一樣出如今1中。因此,不妥。。。
3)使用PK(B)嗎(本身的公鑰)?一樣有問題,第一,原理同1,因爲是公開的,任何人均可以僞造,銀行卡再次爆掉了;第二,原理同2,要驗證,就須要使用你的另外一個key,即你的私鑰,而這個只有你本身知道,因此簽名沒法驗證。這又是一個失敗的例子。。。
4)私鑰SK(B)嗎(本身的私鑰)?仍是說說原理吧。簽名要使用惟一能確認是你的東西來簽名,譬如筆跡。由於SK(B)只有你本身知道,因此知足要求的;其次,使用SK(B)簽名的東西,是能夠用PK(B)驗證的,由於它是公開的。因此也知足要求。Jackpot!
寫了這麼多,終於寫完了。因爲昨天的失誤,今天算是從新敲了一遍,我還覺得只有幾百字呢,沒想到竟有2k多的字。不過上面的都是廢話,下面來總結一下,接下來的這句纔是重點。
在公鑰密碼學中,加密使用對方的公鑰,簽名使用本身的私鑰。
廢話完了,昨天寫的是洗洗睡了,今天就寫個,喝水去了!