1. 程式人生 > 其它 >淺析MD5與AES加密

淺析MD5與AES加密

一、MD5

  MD5全稱為資訊-摘要演算法(雜湊演算法),是電腦保安領域的雜湊函式,用於確保訊息的完整性。另外摘要演算法還有SHA1,具體請度娘。

  MD5是一種單向加密,它的加密不可逆,它將任意長度的字串,經過演算法計算後生成固定長度的資料,一般為16位表示

1、MD5的用途:

(1)訊息完整性:每份資料生成的MD5碼不同,所以可以把MD5碼和資料一塊傳送,在對端使用MD5加密對資料加密在與接收的MD5碼做對比,保證資料的正確性。

(2)安全訪問認證:常被用到 mysql 和傳遞使用者賬戶資訊和密碼,從使用者端傳送到伺服器的只是一段128位的摘要,伺服器拿到後直接將其存入資料庫,下次登入只需與伺服器的密文進行對比即可,這樣保護了使用者的資訊,即便是後臺人員也無法去獲取使用者的賬戶密碼。

2、數字簽名:MD5生成程式碼

    public static String encryption(String plainText) {
        String re_md5 = new String();
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(plainText.getBytes());
            byte b[] = md.digest();
            int i;
            StringBuffer buf 
= new StringBuffer(""); for (int offset = 0; offset < b.length; offset++) { i = b[offset]; if (i < 0) i += 256; if (i < 16) buf.append("0"); buf.append(Integer.toHexString(i)); } re_md5
= buf.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return re_md5; }

  看知乎:https://www.zhihu.com/question/22311285

  上面說MD5其實不算是一種加密演算法,用處大多在檔案的是否完整,和密碼的保護上,更多詳情檢視大神解析。

3、專案應用:

  在檔案傳輸專案中,就通常使用MD5用於保證使用者的訊息完整性,和使用者賬戶密碼的保護。

  在客戶端,使用MD5將使用者的賬戶和密碼,進行MD5加密,傳遞給伺服器,伺服器將其與伺服器所儲存的MD5進行對比,如果比配就將使用者自己的介面返回給使用者,然後進行資料的傳輸,也是使用MD5,在對端對資料進行加密,匹配檢視資料是否完整。

二、其他加密演算法

  非對稱加密:包括RSA DSA RCC,非對稱加密是相比對稱加密而言的。

  對稱加密:包括AES,DES,3DES

  兩者的關係:對稱加密是在加密前雙方都應該知道加密演算法和金鑰,而且金鑰相同。比如:A和B實現約定使用的加密演算法和解密金鑰,然後進行資料傳輸。

  非對稱加密是雙方各自產生自己的金鑰,然後將自己的加密金鑰傳遞給對方,在使用時先給資料使用對方的加密金鑰加密,傳送給對方後,各自使用自己的解密金鑰來解密資料。

  不過對稱加密解密速度慢,安全效能高;非對稱加密速度快,安全效能不高,所以經常使用非對稱加密傳遞對稱加密的金鑰,然後使用對稱加密來加密傳遞的資料。

三、AES:

  AES加密有三種長度分別是128位, 192位,256位。

  AES加密是一種分組加密,他將明文劃分一組一組的,每組明文長度相等,一次加密一組明文,直到全部加密,分組長度為128位(16位元組),明文長度不足的進行填充。AES加密是位元組加密,使用時要轉成位元組碼。明文分組用位元組單位的正方形矩陣表示,一般稱為狀態矩陣。

  128位會進行10輪加密,一輪加密步驟:位元組代換,行位移,列混合,輪金鑰加。在最後一輪不進行列混合;解密反過來,分為輪金鑰加,逆列混合,逆行位移,逆位元組代換,第一步不進行逆列混合。

  位元組代換:AES加密定義了一個S盒和一個逆S盒。將狀態矩陣中的元素查表進行替換。

  行移位:將行位移進行左迴圈位移,即狀態矩陣的第N行左移N個位元組。

  列混合變換:同過將行移位矩陣與固有矩陣相乘得到的混合矩陣。

  輪金鑰加:將128位輪金鑰Ki同狀態矩陣中的資料進行逐位異或操作,如下圖所示,金鑰Ki中每個字W[4i],W[4i+1],W[4i+2],W[4i+3]為32位位元字,包含4個位元組,他們的生成演算法下面在下面介紹。輪金鑰加過程可以看成是字逐位異或的結果,也可以看成位元組級別或者位級別的操作。也就是說,可以看成S0 S1 S2 S3 組成的32位字與W[4i]的異或運算。

  AES加密的內容詳見這篇部落格:https://blog.csdn.net/qq_28205153/article/details/55798628

  關於AES加密的一些內容,也可以見之前的部落格:從nodejs的AES加密解密之後檔案大小不一致的問題談談AES加密中的補位nodejs大檔案分片加密解密