1. 程式人生 > >加密演算法(MD5、RSA、AES)

加密演算法(MD5、RSA、AES)

加密技術通常分為兩大類:"對稱式"和"非對稱式"。

對稱性加密演算法:對稱式加密就是加密和解密使用同一個金鑰。資訊接收雙方都需事先知道密匙和加解密演算法且其密匙是相同的,之後便是對資料進行加解密了。對稱加密演算法用來對敏感資料等資訊進行加密。

非對稱演算法:非對稱式加密就是加密和解密所使用的不是同一個金鑰,通常有兩個金鑰,稱為"公鑰"和"私鑰",它們兩個必需配對使用,否則不能開啟加密檔案。傳送雙方A,B事先均生成一堆密匙,然後A將自己的公有密匙傳送給B,B將自己的公有密匙傳送給A,如果A要給B傳送消 息,則先需要用B的公有密匙進行訊息加密,然後傳送給B端,此時B端再用自己的私有密匙進行訊息解密,B向A傳送訊息時為同樣的道理。

雜湊演算法:雜湊演算法,又稱雜湊函式,是一種單向加密演算法。在資訊保安技術中,經常需要驗證訊息的完整性,雜湊(Hash)函式提供了這一服務,它對不同長度的輸入訊息,產生固定長度的輸出。這個固定長度的輸出稱為原輸入訊息的"雜湊"或"訊息摘要"(Message digest)。雜湊演算法不算加密演算法,因為其結果是不可逆的,既然是不可逆的,那麼當然不是用來加密的,而是簽名。

 

對稱性加密演算法有:AES、DES、3DES
用途:對稱加密演算法用來對敏感資料等資訊進行加密

DES(Data Encryption Standard):資料加密標準,速度較快,適用於加密大量資料的場合。

3DES(Triple DES):是基於DES,對一塊資料用三個不同的金鑰進行三次加密,強度更高。

AES(Advanced Encryption Standard):高階加密標準,是下一代的加密演算法標準,速度快,安全級別高;AES是一個使用128為分組塊的分組加密演算法,分組塊和128、192或256位的金鑰一起作為輸入,對4×4的位元組陣列上進行操作。眾所周之AES是種十分高效的演算法,尤其在8位架構中,這源於它面向位元組的設計。AES 適用於8位的小型微控制器或者普通的32位微處理器,並且適合用專門的硬體實現,硬體實現能夠使其吞吐量(每秒可以到達的加密/解密bit數)達到十億量級。同樣,其也適用於RFID系統。

 

非對稱性演算法有:RSA、DSA、ECC

RSA:由 RSA 公司發明,是一個支援變長金鑰的公共金鑰演算法,需要加密的檔案塊的長度也是可變的。RSA在國外早已進入實用階段,已研製出多種高速的RSA的專用晶片。

DSA(Digital Signature Algorithm):數字簽名演算法,是一種標準的 DSS(數字簽名標準),嚴格來說不算加密演算法。

ECC(Elliptic Curves Cryptography):橢圓曲線密碼編碼學。ECC和RSA相比,具有多方面的絕對優勢,主要有:抗攻擊性強。相同的金鑰長度,其抗攻擊性要強很多倍。計算量小,處理速度快。ECC總的速度比RSA、DSA要快得多。儲存空間佔用小。ECC的金鑰尺寸和系統引數與RSA、DSA相比要小得多,意味著它所佔的存貯空間要小得多。這對於加密演算法在IC卡上的應用具有特別重要的意義。頻寬要求低。當對長訊息進行加解密時,三類密碼系統有相同的頻寬要求,但應用於短訊息時ECC頻寬要求卻低得多。頻寬要求低使ECC在無線網路領域具有廣泛的應用前景。

 

雜湊演算法(簽名演算法)有:MD5、SHA1、HMAC
用途:主要用於驗證,防止資訊被修。具體用途如:檔案校驗、數字簽名、鑑權協議

MD5:MD5是一種不可逆的加密演算法,目前是最牢靠的加密演算法之一,尚沒有能夠逆運算的程式被開發出來,它對應任何字串都可以加密成一段唯一的固定長度的程式碼。

SHA1:是由NISTNSA設計為同DSA一起使用的,它對長度小於264的輸入,產生長度為160bit的雜湊值,因此抗窮舉(brute-force)性更好。SHA-1設計時基於和MD4相同原理,並且模仿了該演算法。SHA-1是由美國標準技術局(NIST)頒佈的國家標準,是一種應用最為廣泛的Hash函式演算法,也是目前最先進的加密技術,被政府部門和私營業主用來處理敏感的資訊。而SHA-1基於MD5,MD5又基於MD4。

HMAC:是金鑰相關的雜湊運算訊息認證碼(Hash-based Message Authentication Code),HMAC運算利用雜湊演算法,以一個金鑰和一個訊息為輸入,生成一個訊息摘要作為輸出。也就是說HMAC是需要一個金鑰的。所以,HMAC_SHA1也是需要一個金鑰的,而SHA1不需要。

 

其他常用演算法:

Base64:其實不是安全領域下的加密解密演算法,只能算是一個編碼演算法,通常用於把二進位制資料編碼為可寫的字元形式的資料,對資料內容進行編碼來適合傳輸(可以對img影象編碼用於傳輸)。這是一種可逆的編碼方式。編碼後的資料是一個字串,其中包含的字元為:A-Z、a-z、0-9、+、/,共64個字元(26 + 26 + 10 + 1 + 1 = 64,其實是65個字元,“=”是填充字元。Base64要求把每三個8Bit的位元組轉換為四個6Bit的位元組(3*8 = 4*6 = 24),然後把6Bit再添兩位高位0,組成四個8Bit的位元組,也就是說,轉換後的字串理論上將要比原來的長1/3。原文的位元組最後不夠3個的地方用0來補足,轉換時Base64編碼用=號來代替。這就是為什麼有些Base64編碼會以一個或兩個等號結束的原因,中間是不可能出現等號的,但等號最多隻有兩個。其實不用"="也不耽誤解碼,之所以用"=",可能是考慮到多段編碼後的Base64字串拼起來也不會引起混淆。)
Base64編碼是從二進位制到字元的過程,像一些中文字元用不同的編碼轉為二進位制時,產生的二進位制是不一樣的,所以最終產生的Base64字元也不一樣。例如"上網"對應utf-8格式的Base64編碼是"5LiK572R", 對應GB2312格式的Base64編碼是"yc/N+A=="。
標準的Base64並不適合直接放在URL裡傳輸,因為URL編碼器會把標準Base64中的“/”和“+”字元變為形如“%XX”的形式,而這些“%”號在存入資料庫時還需要再進行轉換,因為ANSI SQL中已將“%”號用作萬用字元。
為解決此問題,可採用一種用於URL的改進Base64編碼,它不在末尾填充'='號,並將標準Base64中的“+”和“/”分別改成了“-”和“_”,這樣就免去了在URL編解碼和資料庫儲存時所要作的轉換,避免了編碼資訊長度在此過程中的增加,並統一了資料庫、表單等處物件識別符號的格式。
另有一種用於正則表示式的改進Base64變種,它將“+”和“/”改成了“!”和“-”,因為“+”,“*”以及前面在IRCu中用到的“[”和“]”在正則表示式中都可能具有特殊含義。
此外還有一些變種,它們將“+/”改為“_-”或“._”(用作程式語言中的識別符號名稱)或“.-”(用於XML中的Nmtoken)甚至“_:”(用於XML中的Name)。

​HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL(SSL使用40 位關鍵字作為RC4流加密演算法,這對於商業資訊的加密是合適的。),因此加密的詳細內容就需要SSL。https:URL表明它使用了HTTP,但HTTPS存在不同於HTTP的預設埠及一個加密/身份驗證層(在HTTP與TCP之間),提供了身份驗證與加密通訊方法,現在它被廣泛用於全球資訊網上安全敏感的通訊,例如交易支付方面。它的主要作用可以分為兩種:一種是建立一個資訊保安通道,來保證資料傳輸的安全;另一種就是確認網站的真實性。

 

專案應用總結:
1. 加密演算法是可逆的,用來對敏感資料進行保護。雜湊演算法(簽名演算法、雜湊演算法)是不可逆的,主要用於身份驗證。
2. 對稱加密演算法使用同一個密匙加密和解密,速度快,適合給大量資料加密。對稱加密客戶端和服務端使用同一個密匙,存在被抓包破解的風險。
3. 非對稱加密演算法使用公鑰加密,私鑰解密,私鑰簽名,公鑰驗籤。安全性比對稱加密高,但速度較慢。非對稱加密使用兩個密匙,服務端和客戶端密匙不一樣,私鑰放在服務端,黑客一般是拿不到的,安全性高。
4. Base64不是安全領域下的加解密演算法,只是一個編碼演算法,通常用於把二進位制資料編碼為可寫的字元形式的資料,特別適合在http,mime協議下的網路快速傳輸資料。UTF-8和GBK中文的Base64編碼結果是不同的。採用Base64編碼不僅比較簡短,同時也具有不可讀性,即所編碼的資料不會被人用肉眼所直接看到,但這種方式很初級,很簡單。Base64可以對圖片檔案進行編碼傳輸。
5. https協議廣泛用於全球資訊網上安全敏感的通訊,例如交易支付方面。它的主要作用可以分為兩種:一種是建立一個資訊保安通道,來保證資料傳輸的安全;另一種就是確認網站的真實性。
6. 大量資料加密建議採用對稱加密演算法,提高加解密速度;小量的機密資料,可以採用非對稱加密演算法。在實際的操作過程中,我們通常採用的方式是:採用非對稱加密演算法管理對稱演算法的金鑰,然後用對稱加密演算法加密資料,這樣我們就集成了兩類加密演算法的優點,既實現了加密速度快的優點,又實現了安全方便管理金鑰的優點。
7. MD5標準金鑰長度128位(128位是指二進位制位。二進位制太長,所以一般都改寫成16進位制,每一位16進位制數可以代替4位二進位制數,所以128位二進位制數寫成16進位制就變成了128/4=32位。16位加密就是從32位MD5雜湊中把中間16位提取出來);sha1標準金鑰長度160位(比MD5摘要長32位),Base64轉換後的字串理論上將要比原來的長1/3。

 

參考文章:
http://www.cnblogs.com/mddblog/p/5380556.html
http://blog.csdn.net/xuefeng0707/article/details/19845111
http://blog.csdn.net/benbenxiongyuan/article/details/7756912
https://zh.wikipedia.org/wiki/Base64
http://www.cnblogs.com/hongru/archive/2012/01/14/2321397.html
http://www.cnblogs.com/chengxiaohui/articles/3951129.html
http://www.cnblogs.com/fireway/p/5860622.html
http://www.cnblogs.com/JCSU/articles/2803598.html
https://baike.so.com/doc/5404553-5642272.html
http://www.cnblogs.com/yangywyangyw/archive/2012/07/31/2620861.html