公鑰與私鑰,有那麼複雜嗎

     公鑰與私鑰,在使用公鑰密碼學加密與簽名時,真的就很難選擇嗎?

    這篇文章是第二版,因爲第一版不幸地……閒話少說,言歸正傳。
    經常聽到有人說,在使用公鑰密碼學加密與簽名時,一定要知道是使用公鑰還是使用私鑰,否則容易鬧笑話。可是,對於一個學過一點密碼學的人來說,真的就那麼難嗎?下面就來討論一下這個問題。
    密碼學中要使用Key,而在公鑰密碼學中,有兩個Key,一個公鑰PK(Public Key),一個私鑰SK(Secret Key),其中公鑰PK公開,任何人都可以查到,而私鑰SK保密,理論上只應該有你一個人知道。這一點是與分組密碼算法(DES,AES)不同的(DES的實現可以看我以前的一篇博文),因爲在分組密碼算法中,只有一個KEY,且是在通信雙方共享的,並且需要保密。下面以公鑰密碼算法RSA爲例(RSA的小數情況實現也可以看我的另一篇文章),來講一講在公鑰密碼學,加密與簽名時,key的選擇問題。
    首先要說一說通信,通信自然要涉及通信雙方,當然,你也可以自己和自己通信(如果你這時還加密簽名的話,你這是閒得……)。密碼學的大師給了通信雙方兩個好聽的名字A(lice),B(ob)。下面約定一下PK(A),PK(B)分別代表Alice和Bob的公鑰,是完全公開的,任何人都可以查到;SK(A)爲Alice的私鑰,只有Alice自己知道,SK(B)爲Bob的私鑰,只有Bob一個人知道。下面從Bob的角度來討論。
    加密:
    加密,爲什麼要加密?因爲通信的雙方使用的是公開的信道,而信道上是可能有竊聽者的,如果使用明文傳輸消息,即不加密,那麼竊聽者就可以知道消息的內容了,如果你傳輸的是什麼**消息的話,你就悲劇了。所以爲防止消息被不應該知道的人知道,傳輸時要加密。
    在公鑰密碼學中,一個消息M,在key1的控制下,經過密碼算法,得到密文C,是爲加密;而密文C,在另一個Key2的控制下,經過密碼算法,可以得到對應的明文M,是爲解密。其中一個是公鑰PK,一個是私鑰SK,這是與分組密碼不同的。下面來說Bob要傳輸消息給Alice,該使用那個Key。這裏使用枚舉,這個辦法很好用。總共用四個key。(你不會還想用其他人的key吧。。。)
    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多的字。不過上面的都是廢話,下面來總結一下,接下來的這句纔是重點。
    在公鑰密碼學中,加密使用對方的公鑰,簽名使用自己的私鑰。
    廢話完了,昨天寫的是洗洗睡了,今天就寫個,喝水去了!
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章