加密和簽名的區別?

工作中遇到對數據進行加密或者加簽的操作,但是不知道他們有什麼區別


之前在做相關的完整性和機密性校驗的事情,了解過一點,答一下。

就拿A給B發送經過簽名加密信息來說:

1、A對信息簽名的作用是確認這個信息是A發出的,不是別人發出的;

2、加密是對內容進行機密性保護,主要是保證信息內容不會被其他人獲取,只有B可以獲取。

也就是保證整個過程的端到端的唯一確定性,這個信息是A發出的(不是別人),且是發給B的,只有B才被獲得具體內容(別人就算截獲信息也不能獲得具體內容)。

這只是大概說了作用,具體說來,涉及到密鑰相關的東西。密鑰有公鑰和私鑰之分。

那麼這裡一共有兩組四個密鑰:A的公鑰(PUB_A),A的私鑰(PRI_A);B的公鑰(PUB_B),B的私鑰(PRI_B)。

公鑰一般用來加密,私鑰用來簽名。

通常公鑰是公開出去的,但是私鑰只能自己私密持有。

公鑰和私鑰唯一對應,用某個公鑰簽名過得內容只能用對應的私鑰才能解簽驗證;同樣用某個私鑰加密的內容只能用對應的公鑰才能解密。

這時A向B發送信息的整個簽名和加密的過程如下:

1、A先用自己的私鑰(PRI_A)對信息(一般是信息的摘要)進行簽名。

2、A接著使用B的公鑰(PUB_B)對信息內容和簽名信息進行加密。

這樣當B接收到A的信息後,獲取信息內容的步驟如下:

1、用自己的私鑰(PRI_B)解密A用B的公鑰(PUB_B)加密的內容;

2、得到解密後的明文後用A的公鑰(PUB_A)解簽A用A自己的私鑰(PRI_A)的簽名。

從而整個過程就保證了開始說的端到端的唯一確認。A的簽名只有A的公鑰才能解簽,這樣B就能確認這個信息是A發來的;A的加密只有B的私鑰才能解密,這樣A就能確認這份信息只能被B讀取。


你想對你男(女)朋友或是老公(老婆)說「我愛你」。

未加密的情景是

你:我愛你。

TA:我也愛你。

加密的情況是

你:今天月亮真漂亮啊。

(有密鑰)TA:我也覺得月亮很漂亮 / 我死也無憾了。

(無密鑰)TA:初一哪來的月亮?

你想發簡訊「我愛你」給你男(女)朋友或是老公(老婆),但手機沒電了,借的隔壁老王的電話。

無簽名且正常的情況是

你:我愛你。

TA:你是誰?

無簽名且不正常的情況是

......

......

有正確簽名的情況是

你:我愛你,我是XX,還記得我最初用月亮的典故表白的嗎?

TA:記得啊,我也愛你。

有惡意簽名且仔細驗證過的情況是

你?:我愛你,親愛的是我啊。

TA:你是誰?

有惡意簽名且沒驗證的情況是

......

......


通俗點說加密就是你哪怕看到了不該看到的東西,也理解不了。

簽名就是你做了任何事,都抵賴不了。

大意如此。


加密就是把文本通過加密演算法和解密鑰匙(key)把文本/文件 變成另外的東西,別人可以通過這個解密的鑰匙來解密。如果有第三方拿到了密文和鑰匙,就可以拿到原文了。

a + key -&> 加密演算法 -&> b

b + key -&> 解密演算法 -&> a

這個過程是可逆的。

簽名是演算法約定一個鹽,通過這個演算法把原文和鹽加在一起,然後提取他們的摘要作為簽名,一般是不可逆的過程。別人得到簽名和鹽是沒用的,因為無法解密。通過簽名認證的方式是,兩者都通過一樣的演算法和約定好的鹽,提取出摘要,然後比對這兩個摘要是否一致來完成驗證。

a + yan -&> 摘要演算法 -&> b

a` + yan -&> 摘要演算法 -&> b`

如果 b==b`, 則(基本上)可以認為 a=a`, 完成驗證。


如果要用最簡單的方法來解釋,就是加密和簽名是兩個相反的過程。

這裡你提這個問題,一般來說是指的非對稱的情況。在非對稱的情況下,加密過程是把私鑰自己保存下來,把公鑰開放了發布出去,然後其他人通過公鑰加密給你通信,由於只能由私鑰解密,所以最後數據只有你能夠讀取;簽名就正好相反,是你把數據通過私鑰加密了然後把數據發出去,別人能夠通過你的公鑰解密數據就表示這個數據是你發出來的。

簽名是非對稱加密帶來的一個最重要的進步。這裡你不用具體去考慮為什麼私鑰既可以加密也可以解密,只需要認為加密和解密都是運算過程就可以了,密鑰保證了這個過程輸出結果的正確性。

當然,這兒如果涉及實際問題還需要一些應用上的手段。一般來說,如果單用簽名,需要同時發送簽名前和簽名後數據,然後數據的接收者對簽名後的數據解密後與簽名前對比。所以,從應用的角度來說的話,簽名只是解決了一個數據可信性的問題,包括防串改(因為數據有簽名後的版本)、防抵賴(因為只有發送者可以簽名)等等。這裡說的是比較簡單的情況,因為在實際的應用場景中,還得考慮重放等情況,所以還需要時間戳等配合才能達到實際的效果。


嗯……這個問題真的很好。我以前沒咋仔細思考過這個事情。

加密演算法很簡單的,就是拿來把文件弄的那些你不想讓他看到的人看不懂,你想讓看懂的人看得懂的。

簽名演算法比較複雜。如果你說的是最基礎的簽名演算法,一般是拿來證明傳輸後文件的完整性和傳輸給你的人對這份文件的所有權的。但廣義的簽名演算法就不止這些啦。有很多奇奇怪怪的東西混在裡面。

在我來看,簽名演算法是屬於密碼演算法的一個特殊分支。幾乎所有可用於加密的公鑰密碼演算法都可以用於簽名演算法。(反正都是單向陷門演算法推過來推過去……嗯,當然沒我說得那麼輕鬆,要不我怎麼到最後三年寧願從0開始也要改方向呢^_^)

雖然簽名演算法都包含證明文件的完整性(未被篡改)這個功能,簽名演算法按照不同功能分為了不同的類型。

有些演算法是為了明著證明自己身份(比如普通簽名演算法),有些是為了讓別人可以代理他進行簽名(如代理簽名演算法)、有些是為了匿名證明自己對文件的所有權(環簽名演算法)、有些是為了半匿名地證明自己對文件的所有權或知情權或管他啥權(群簽名演算法,與環簽名相比群組織者還是會知道匿名者是誰)、有些是為了讓簽名者簽了還不能知道自己簽了啥啥時候簽卻不能否認的(盲簽名演算法)、有的簽名是一個群體人們裡面有至少一個固定數目人參與才可以產生證明自己是文件發送者的(門限簽名)、還有那種需要只有接受者才能還原簽名的簽名(不可否認簽名)……

這還不算複雜~這些簽名演算法中的某些還可以混搭~

比如代理環簽名演算法、門限盲簽名演算法、不可否認群簽名演算法……

好玩吧~ 到這個時候我覺得就難簡單說簽名演算法是到底拿來幹啥的了吧。(≧?≦)

另外簽名演算法除了用於文件簽名還可以用於投票啊、電子貨幣啊、文件完整性驗證啊、隱私保護啊、身份識別啊各種領域。改改就好。


在現有的非對稱密鑰體系中,我有一個私鑰,一個公鑰,公鑰是公開的,私鑰是非公開的,加密是用公鑰對信息進行處理,處理後的結果只能用私鑰還原,而簽名是用自己的私鑰對信息進行處理,而對方只能用公鑰進行信息還原。


加密的目的是非明文傳輸

加簽的目的是防止篡改


拜讀理解了,感謝


坡下碎石 的例子挺好的,簡單來說,加密是防止別人截取信息的,簽名是為了確認這個信息是誰發的(身份驗證)


推薦閱讀:

如何從物理隔離計算機傳輸數據?
國內哪些網站的用戶資料庫安全性做的最好?他們都是怎麼做的?
國內外有哪些關於信息安全方面的網站或論壇?
CSDN 為什麼會用明文存儲密碼?是意外還是故意的?

TAG:數據安全 | 數據加密 | 金融IT |