發送者對明文進行加密而後生成密文,接受者再對密文解密獲得明文的過程。 如今使用的全部加密算法都是公開的!可是密鑰確定不是公開的。git
公鑰
加密,使用 私鑰
解密私鑰
加密,使用 公鑰
解密(私鑰簽名,公鑰驗籤)1是對數據加密,2是防止僞造客戶端數據,對服務器攻擊,更重要是防止模擬了客戶端,進行支付相關的操做github
就我的理解,最主要的就是密鑰的不一樣,對稱加密客戶端和服務端使用同一個密鑰,非對稱加密使用不一樣的密鑰。算法
客戶端的代碼是很容易被破解的,IDA、hopper disassembler
工具的使用,使得破解更加簡單並且破解後容易閱讀,再配合Charles抓取網絡包,根據關鍵字很容易就定位到加密代碼,而後獲取密鑰。sass
因爲對稱加密密鑰同樣,因此解密就垂手可得;可是非對稱加密就不會出現這種問題,由於服務端和客戶端的密鑰不同,公鑰加密私鑰解密,加密的公鑰也是公開的,而私鑰通常放在服務端,黑客通常是拿不到的。安全
另外就是沒有密鑰狀況下強制暴力破解,非對稱加密也要比對稱加密花的多的多的時間來破解。一條信息就要花你幾年的時間,因此很安全。服務器
好比對於"Hello world!"
進行加密後獲得結果R,還可使用密鑰經過結果R解密獲得"Hello world!"
;而對"Hello world!"
進行簽名獲得結果R,卻不能使用密鑰經過R得到"Hello world!"
,要否則的話壓縮算法要逆天了!好比hash,使用幾十個字符就能存儲幾G幾T的數據。。。網絡
好比A對B發送了信息Message;經過加密後,即使C經過網絡包截取得到了Message,它也不知道里面的具體內容,只能看到一堆亂碼;經過簽名,假設D也用相同的加密算法發送了此Message,可是簽名錯誤,那麼B經過簽名依然拒絕D的Message。函數
假設A、B雙方均擁有一對公私鑰(PUB_A
、PRI_A
、PUB_B
、PRI_B
)。工具
A向B發送Message的整個簽名和加密的過程以下:性能
Message_hash_A
PRI_A
對Message_hash_A
進行簽名獲得Message_sign
(這裏爲何不直接對Message進行簽名,而要對Message_hash_A
進行簽名呢?由於Message的長度可能很長,而Message_hash_A
的長度則是固定的,這樣性能更高,格式也固定,何況hash的結果通常不會出現重複的可能)PUB_B
對信息Message
和信息Message_sign
進行加密獲得Message_RSA
,這時A將Message_RSA
發送給B。當B接收到A的信息Message_RSA
後,獲取Message
的步驟以下:
PRI_B
解密獲得明文:Message
和Message_sign
;PUB_A
解Message_sign
獲得Message_hash_A
;同時,B再對Message
使用與A相同的HASH獲得Message_hash_B
;Message_hash_A
與Message_hash_B
相同,則說明Message
沒有被篡改過。上面的過程當中,A知道A的公私鑰同時也要知道B的公鑰;同理B要知道A的公鑰和B的公私鑰
關於公私鑰再打個比方:公鑰
就像一把鎖同樣將數據鎖住;私鑰
就像鑰匙同樣,能將對應的鎖打開。
公鑰加密,私鑰解密的好處是:公鑰能夠公開,那麼不管誰有公鑰均可以給你發送信息,並且也只有你才能解密
咱們常用的Github就是使用了簽名的方法,SSH,在本地電腦生成一對公私鑰,將公鑰傳到github,而後使用私鑰進行簽名,github經過公鑰延籤後認爲你的身份合法。
另外,加密和編碼是不同的,好比ASCII是屬於編碼,是將0~255與字符一一對應。