2007年12月2日 星期日

[心得] 淺談公鑰私鑰、數位簽章、憑證

最近除了比較硬的東西之外(Linux Kernel Code = =a)
沒什麼東西好寫的~
就來談一下數位簽章憑證這些東西吧!

說到數位簽章、憑證,
就必須要先說說 Public-Key Cryptography,
也就是公鑰密碼學

傳統的對稱密碼學的想法很簡單:
用同一組 key,將原來的資訊加密之後,把 key藏好,
需要解密時,把 key拿出來就可以解密了!
但是這有一些問題,
當需把資訊傳遞給別人的時候,對方要如何解密?
傳 key過去,傳送途中有危險性
也無法確認是不是本人發送的資訊。
如果面對面告知,耗費的成本又很高。

這時候就是公鑰密碼學派上用場的時候了!
所謂公鑰,就是可以公開的鑰匙。
既然有可以公開的鑰匙,那當然有另一把可以對應的私鑰!
用公鑰加密的文件,可以用私鑰解開
反之,用私鑰加密的文件,可以用公鑰解開

比較簡單的作法就是,所有人都把自己的公鑰放到網路上,
當 A要把訊息傳給 B時,就找到 [公鑰B],用此公鑰加密,
傳給 B之後, B自然有 [私鑰B] 可以解密。
更安全一些的作法則是多使用自己的 [私鑰A] 加密,
對方解密時也就多使用 [公鑰A] 解密,如 圖一
(圖一)
(圖中紅色X是該使用者所沒有的密鑰)

這方法固然安全性提昇了,
但由於耗費的成本太高(耗時、耗系統資源),
所以通常只用在傳送密鑰、簽章、憑證,這些方面!


以上都能稍微理解的話,就可以稍微說明簽章跟憑證了。


數位簽章跟憑證是不同的東西!
我們可以把 [數位簽章] 想像成 [蓋章] 一樣的東西,
在一份資料上面蓋了章,證明這份資料確實是某人發出的,
也就不會有事後賴帳不承認這事實的情況!
而 [憑證] 則可以想像成 [公鑰的保證書],
以此為憑來驗證拿到的公鑰真的是某人的公鑰。

接下來可能要配合圖片比較好說明,
圖二 為 A傳送資訊給 B,
圖三 為 B接收到資訊之後。

兩人可能已經事先透過圖一的方式,交換了傳統密碼學的密碼了
而這密碼會用在傳遞的文件上
(前面有說,公鑰密碼學耗資源,所以用於交換密碼而沒有用來傳輸整份資料)

(圖二)
A把 [公鑰A] 交給可信任的 Certificate Authority(CA)簽發憑證,
之後 CA 會用 [私鑰CA] 加密,成為 [憑證] 送還給 A。
而要送出去的資訊(可能已加密過),
則經過 hash後,成為一組字串,
把這組字串,用 [私鑰A] 加密,成為 [數位簽章]。
最後則把 [憑證]、[公鑰A]、[資訊]、[數位簽章] 一同發送給 B。


(圖三)
B收到 A送來的 [憑證]、[公鑰A]、[資訊]、[數位簽章] 之後,
(圖中用紅色框起來的部份)
就向 CA詢問 [公鑰CA],以此解開憑證,並確認跟 [公鑰A] 一不一樣!
確認 [公鑰A] 正確之後,
就可以用 [公鑰A] 來解密 [數位簽章],得到一份字串,
再將送來的 [資訊] hash看看出來的字串一不一樣。

因為透過了可信任的 CA,
這樣的作法就可以確認資訊有沒有中途經過竄改或更動,
同時也能確認發送者。

希望這簡單的說明能讓大家知道數位簽章跟憑證是什麼,
同時讓大家上網看到 xxx憑證 之類的訊息時不會慌張,呵 ^^


(以上是簡單的說明,如果有誤也歡迎來信告知。)

12 則留言:

winart 提到...

您好
首先謝謝您這篇文章讓我更加了解這些理論
看完文章後還是有點不了解
文章中提到

比較簡單的作法就是,所有人都把自己的公鑰放到網路上,
.........

請問是放在網路上的哪裡?
當 A要把訊息傳給 B時,就找到 [公鑰B],用此公鑰加密,
請問要如何在網路上找到公鑰B?

這方面可能是自己笨看的不是很懂
可否煩請您再一次更詳細的敘述一下
再次的謝謝您

Askeing 提到...

通常公鑰會存放在 CA Server 上
而 CA 一般都是公正、權威、可信賴的第三方組織
所以可能是任何組織或單位

舉例來說
內政部自然人憑證管理中心
就存放了所有登記的自然人憑證

winart 提到...

感謝您親切的回答
終於弄懂這幾個東西了
謝謝您喔

liyon 提到...

感謝你的講解

Askeing 提到...

不會,
只是之前閒來無事分享一下心得筆記 ^^

魔法設計師 提到...

你弄錯囉,私鑰的用途不是加密來給公鑰解開....因為公鑰你公開出去,那私鑰把文件加密就沒有意義了,因為人人都可以看到你加密的文件(那何必加密呢?)。

非對稱式金鑰的加密機制是:
1.公鑰加密,私鑰解密:

A要把重要私密文件交給B,就拿B公開的公鑰把文件加密。結果,只有有B私鑰的B自己能解密,看到A傳來的重要文件,[b]其他人不行[/b]。

2.私鑰簽章,公鑰驗證:

B要[b]向全世界不特定的多數人[/b]發布自己寫的一個了不起的程式作品,就把自己的私鑰"sign"了自己的程式,然後任何人,可以透過CA的信任圈取得B的公鑰來核對下載來的程式是不是真的B寫的。

Askeing 提到...

To 魔法設計師,
我說得跟您說的是一樣的喔!
「當 A要把訊息傳給 B時,就找到 [公鑰B],用此公鑰加密,傳給 B之後, B自然有 [私鑰B] 可以解密。」

至於圖一是拿自己的私鑰跟對方的公鑰進行雙重加密 ^^

至於簽章跟驗證的步驟圖二、圖三應該大致沒錯!?
:P

真的叫無名 提到...

圖二中,只少了A要傳送出去的"資料"沒經過[B公鑰]加密

Askeing Yen 提到...

To 真的叫無名:
好久的文章了,感謝補充 ^^

顏宏益 提到...

to Askeing Yen :

感謝你的詳細解說,讓我對於Mac上的公用密鑰與私有密鑰有更深一層的了解,非常期待你的新文章~

chiu jackie 提到...

說明的太好了,一目了然,感謝贴文。

chiu jackie 提到...

說明的太好了,一目了然,感謝贴文。