小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

非對稱加密算法原理及應用

 華燈初放l 2016-07-18
一、什么是非對稱加密算法


加密和解密所用的密鑰是不一樣的,所以叫“非對稱”。
非對稱加密算法的這兩個密鑰,一個稱為公鑰,一個稱為私鑰。

所謂公鑰和私鑰不是絕對的,公鑰和私鑰只是經過算法運算得到的一對數(shù)值,公開的那一個值稱為公鑰,不公開的稱為私鑰。
用公鑰加密的,可以用私鑰解密,反過來也成立。

RSA就是典型的非對稱加密算法。
關于RSA算法的解釋,最經典的當然是阮一峰老師的博客了:
http://www./blog/2013/06/rsa_algorithm_part_one.html
http://www./blog/2013/07/rsa_algorithm_part_two.html
想當初我看懂之后還在紙上自己推導了一遍,可惜后來又忘記了,只記得一個歐拉定理。。


二、使用非對稱加密算法通信的原理

由于非對稱加密算法一般比較慢,因此他一般用于密鑰交換。這個交換的密鑰就是指對稱密鑰。

通常,發(fā)送方用公鑰加密,接收方用私鑰解密。假如你是接收方,你可以把公鑰公開出去,那其他人想要與你通信時,先用你的公鑰把對稱密鑰加密后傳遞給你,你再通過私鑰解密得到對稱密鑰。從這以后,雙方都有對稱密鑰了,雙方的通信信息就通過這個密鑰來加密解密。

知乎上的一個回答說明了同樣的過程(https://www.zhihu.com/question/20744215/answer/16056710):
Java代碼  收藏代碼
  1. 假設我們回到了那個只能寄信的時代,大家都需要和知乎通信,而且通信的內容必須要保密。于是負責接收大家消息的@顧惜朝 想出來一個辦法,找了很多把上面說的那種鎖(公鑰),都用鑰匙打開,掛在外面。需要和知乎通信的人,在通信之前,需要擁有另外一把有兩個鑰匙的鎖(對稱加密算法),然后把這把鎖和其中一把鑰匙(對稱密鑰),放進一個無法被破拆的鐵盒子里面,用知乎提供的那把開著的鎖把鐵盒子鎖上。  
  2.   
  3. 這時候,這個鐵盒子就無法打開了,除了擁有鑰匙的顧惜朝。這個裝有一把鎖和鑰匙的鐵盒子,可以放心地交到任何一個人手上,然后讓他拿去給顧惜朝。顧惜朝拿到這個鐵盒子之后,加密通信會話就建立了。她就會用鑰匙打開鐵盒子,取出鎖和鑰匙,寫下“親愛的知乎用戶,你好,我是顧惜朝”小紙條,放進鐵盒子里,然后用你提供的鎖把鐵盒子鎖上,然后交回到你的手上。這個時候,鐵盒子被你提供的鎖鎖上了,除了你和顧惜朝,沒有別人有鑰匙能夠打開這個鐵盒子,鐵盒子也就可以安全地經過郵遞送到你的手上;你收到鐵盒子之后,用你自己的鑰匙打開鎖,讀鐵盒子里面的消息,然后放進新的小紙條,再寄送回去。  
  4.   
  5. 以上就是加密通信的過程。  


三、實際例子
3.1 https的通信建立就是用RSA:



第三步的crt public就是服務端的公鑰(傳說中的證書,當然證書還會包含其他信息),發(fā)給了客戶端。
第五步的random key就是對稱密鑰。第五步完成后,對稱密鑰就交換成功了。

3.2 http接口遠程調用參數(shù)的加密
以實際項目中,調用A公司的http接口為例:
假設params是可以在公網上安全傳輸?shù)闹?,顯然不能是明文,那它是怎么來的呢:
偽代碼:
Java代碼  收藏代碼
  1. params=encrypt(merchantId=111&sences=222&productId=333&extParams=444)  

其中的merchantId=111&sences=222&productId=333&extParams=444就是要傳遞的參數(shù)。
加密方法encrypt分三步:用A公司公鑰(A公司的私鑰在它們那里,不公開)加密再用base64編碼再經過url-encode。
可以推知,A公司的解密過程就是先url-decode再base64解密,最后用它的私鑰解密得到消息的明文。

那如何保證消息明文沒有被篡改呢?
此時就需要我們調用傳參時,同時傳遞數(shù)字簽名:

假設上一步算得params="555",則最后在http報文體中傳遞的就是params=555&sign=888,而這個sign就是數(shù)字簽名:
先hash再用我們的私鑰(我們的公鑰會直接給到A公司的開發(fā)人員,A公司的公鑰也是直接給到我們)加密:
Java代碼  收藏代碼
  1. String digest = sha1(params);  
  2. String rawSign = encodeByPrivateKey(digest);  
  3. String sign = urlEncode(rawSign);  


可以看到,數(shù)字簽名不是一成不變的,它隨著消息的改變而改變。它與我們現(xiàn)實中的個人簽名不同,個人簽名每次都是簽同一個名字。

A公司接收到簽名后,用我們的公鑰解密得到消息摘要(假設為digestX),然后把之前解密得到的消息明文hash一下,得到digestY,比較這兩個值是否相等,則可以知道消息有沒有被篡改。
說到這里我們發(fā)現(xiàn),我們需要提前與A公司協(xié)定好hash算法(例如sha1)。

那黑客有沒有可能同時篡改消息和簽名呢?不可以,因為他沒有我們的私鑰,改不了簽名。
在這http調用過程中,總結一句話:
用對方的公鑰來加密消息,用我們自己的私鑰來簽名。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多