標籤:des 3des
轉載請註明出處:http://blog.csdn.net/zhaokaiqiang1992
在前面的文章裡面,我們討論了DES演算法,同時也明白了如何才能保證不同平台下的加密和解密結果的一致性。但是DES作為出現了很長時間的一種密碼編譯演算法,隨著電腦運算能力的加強,DES加密容易被暴力破解,其安全性變得有點低。於是,為了增強資料的安全性,3DES演算法就應運而生了。
3DES,顧名思義,就是對DES密碼編譯演算法的改進,3DES通過對每個資料進行3次DES加密,從而降低被破解的可能性。
如果我們要使用3DES加密,需要以下幾個步驟
①傳入共同約定的密鑰(keyBytes)以及演算法(Algorithm),來構建SecretKey金鑰組象
SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);
②根據演算法執行個體化Cipher對象。它負責加密/解密
Cipher c1 = Cipher.getInstance(Algorithm);
③傳入加密/解密模式以及SecretKey金鑰組象,執行個體化Cipher對象
c1.init(Cipher.ENCRYPT_MODE, deskey);
④傳入位元組數組,調用Cipher.doFinal()方法,實現加密/解密,並返回一個byte位元組數組
c1.doFinal(src);
具體的代碼實現過程如下
package com.qust;import java.io.UnsupportedEncodingException;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;/** * * @ClassName: com.qust.SecretUtils * @Description: 3DES加密解密工具類 * @author zhaokaiqiang * @date 2014-11-13 下午11:28:14 * */public class DES3Utils {// 定義密碼編譯演算法,DESede即3DESprivate static final String Algorithm = "DESede";// 加密金鑰private static final String PASSWORD_CRYPT_KEY = "zhaokaiqiang1992";/** * 加密方法 * * @param src * 來源資料的位元組數組 * @return */public static byte[] encryptMode(byte[] src) {try {// 產生密鑰SecretKey deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);// 執行個體化CipherCipher cipher = Cipher.getInstance(Algorithm);cipher.init(Cipher.ENCRYPT_MODE, deskey);return cipher.doFinal(src);} catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();} catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();} catch (java.lang.Exception e3) {e3.printStackTrace();}return null;}/** * 解密函數 * * @param src * 密文的位元組數組 * @return */public static byte[] decryptMode(byte[] src) {try {SecretKey deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);Cipher c1 = Cipher.getInstance(Algorithm);c1.init(Cipher.DECRYPT_MODE, deskey);return c1.doFinal(src);} catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();} catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();} catch (java.lang.Exception e3) {e3.printStackTrace();}return null;}/** * 根據字串產生密鑰24位的位元組數組 * * @param keyStr * @return * @throws UnsupportedEncodingException */public static byte[] build3DesKey(String keyStr)throws UnsupportedEncodingException {byte[] key = new byte[24];byte[] temp = keyStr.getBytes("UTF-8");if (key.length > temp.length) {System.arraycopy(temp, 0, key, 0, temp.length);} else {System.arraycopy(temp, 0, key, 0, key.length);}return key;}}
測試類別的代碼如下
package com.qust;public class Main {public static void main(String[] args) {String msg = "使用3DES對資料進行加密";System.out.println("【加密前】:" + msg);// 加密byte[] secretArr = DES3Utils.encryptMode(msg.getBytes());System.out.println("【加密後】:" + new String(secretArr));// 解密byte[] myMsgArr = DES3Utils.decryptMode(secretArr);System.out.println("【解密後】:" + new String(myMsgArr));}}
【Android開發經驗】比DES加密更安全的演算法——3DES密碼編譯演算法