標籤:加密 encryption des
轉載請註明出處:http://blog.csdn.net/zhaokaiqiang1992
在我們的應用程式涉及到比較敏感的資料的時候,我們通常會對資料進行簡單的加密。在與伺服器之間的資料互動中,除了可以使用post請求來增強資料的安全性之外,我們可以使用常見的密碼編譯演算法,對資料進行加密。今天主要介紹的是DES密碼編譯演算法。
首先,DES屬於一種對稱的密碼編譯演算法,所謂對稱,就是說加密和解密使用的都是同一個密鑰,那麼在我們實際應用的時候,就是指伺服器和用戶端進行加密解密的時候,使用的是一個相同的密鑰。除此之外,還有非對稱式加密演算法,就是公開金鑰私密金鑰機制,這種方式可以被用來進行身分識別驗證,這個以後再細說。
DES全稱為Data EncryptionStandard,即資料加密標準,是一種使用祕密金鑰加密的塊演算法,DES演算法的入口參數有三個:Key、Data、Mode。其中Key為7個位元組共56位,是DES演算法的工作密鑰;Data為8個位元組64位,是要被加密或被解密的資料;Mode為DES的工作方式,有兩種:加密或解密。
下面是在Java或者是Android裡面,進行DES加密的代碼實現
package com.qust.rollcallstudent.utils;import java.security.InvalidAlgorithmParameterException;import java.security.Key;import java.security.spec.AlgorithmParameterSpec;import java.util.Locale;import javax.crypto.Cipher;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;import javax.crypto.spec.IvParameterSpec;/** * * @ClassName: com.qust.rollcallstudent.utils.DESUtil * @Description: DES加密解密工具包 * @author zhaokaiqiang * @date 2014-11-13 下午8:40:56 * */public class DESUtil {public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";/** * DES演算法,加密 * * @param data * 待加密字串 * @param key * 加密私密金鑰,長度不能夠小於8位 * @return 加密後的位元組數組,一般結合Base64編碼使用 * @throws InvalidAlgorithmParameterException * @throws Exception */public static String encode(String key, String data) {if (data == null)return null;try {DESKeySpec dks = new DESKeySpec(key.getBytes());SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// key的長度不能夠小於8位位元組Key secretKey = keyFactory.generateSecret(dks);Cipher cipher = Cipher.getInstance(ALGORITHM_DES);IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());AlgorithmParameterSpec paramSpec = iv;cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);byte[] bytes = cipher.doFinal(data.getBytes());return byte2String(bytes);} catch (Exception e) {e.printStackTrace();return data;}}/** * DES演算法,解密 * * @param data * 待解密字串 * @param key * 解密私密金鑰,長度不能夠小於8位 * @return 解密後的位元組數組 * @throws Exception * 異常 */public static String decode(String key, String data) {if (data == null)return null;try {DESKeySpec dks = new DESKeySpec(key.getBytes());SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// key的長度不能夠小於8位位元組Key secretKey = keyFactory.generateSecret(dks);Cipher cipher = Cipher.getInstance(ALGORITHM_DES);IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());AlgorithmParameterSpec paramSpec = iv;cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);return new String(cipher.doFinal(byte2hex(data.getBytes())));} catch (Exception e) {e.printStackTrace();return data;}}/** * 二行制轉字串 * * @param b * @return */private static String byte2String(byte[] b) {StringBuilder hs = new StringBuilder();String stmp;for (int n = 0; b != null && n < b.length; n++) {stmp = Integer.toHexString(b[n] & 0XFF);if (stmp.length() == 1)hs.append('0');hs.append(stmp);}return hs.toString().toUpperCase(Locale.CHINA);}/** * 二進位轉化成16進位 * * @param b * @return */private static byte[] byte2hex(byte[] b) {if ((b.length % 2) != 0)throw new IllegalArgumentException();byte[] b2 = new byte[b.length / 2];for (int n = 0; n < b.length; n += 2) {String item = new String(b, n, 2);b2[n / 2] = (byte) Integer.parseInt(item, 16);}return b2;}}
如果大家只是想用,就可以不用往下看了,下面開始說一些關於DES演算法的細節。
在上面的加密和解密的方法裡面,我們在擷取Cipher執行個體的時候,傳入了一個字串"DES/CBC/PKCS5Padding",這三個參數是什麼意思呢?
實際上,這三個參數分別對應的是“演算法/模式/填充”,也就是說我們要用DES演算法進行加密,採用的是CBC模式,填充方式採用PKCS5Padding。
除了CBC模式,還有ECB模式等,指的是不同的加密方式。
那麼CBC模式和ECB模式又有什麼區別呢?
ECB模式指的是電子密碼本模式,是一種最古老,最簡單的模式,將加密的資料分成若干組,每組的大小跟加密金鑰長度相同;然後每組都用相同的祕密金鑰加密, 比如DES演算法, 如果最後一個分組長度不夠64位,要補齊64位。這種模式的特點是:
1.每次Key、明文、密文的長度都必須是64位;
2.資料區塊重複排序不需要檢測;
3.相同的明文塊(使用相同的密鑰)產生相同的密文塊,容易遭受字典攻擊;
4.一個錯誤僅僅會對一個密文塊產生影響;
CBC模式指的是加密塊鏈模式,與ECB模式最大的不同是加入了初始向量。下面的代碼就是擷取一個初始向量,
IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
這種模式的特點是:
1.每次加密的密文長度為64位(8個位元組);
2.當相同的明文使用相同的密鑰和初始向量的時候CBC模式總是產生相同的密文;
3.密文塊要依賴以前的操作結果,所以,密文塊不能進行重新排列;
4.可以使用不同的初始化向量來避免相同的明文產生相同的密文,一定程度上抵抗字典攻擊;
5.一個錯誤發生以後,當前和以後的密文都會被影響;
PKCS5Padding參數則是在說明當資料位元數不足的時候要採用的資料補齊方式,也可以叫做資料填充方式。
PKCS5Padding這種填充方式,具體來說就是“填充的數字代表所填位元組的總數”
比如說,差兩個位元組,就是######22,差5個位元組就是###55555,這樣根據最後一個自己就可以知道填充的數字和數量。
介紹完DES的這些細節之後,我們就可以知道,在不同的平台上,只要能保證這幾個參數的一致,就可以實現加密和解密的一致性。
1.加密和解密的密鑰一致
2.採用CBC模式的時候,要保證初始向量一致
3.採用相同的填充模式
【Android開發經驗】如何保證Android與伺服器的DES加密保持一致