1. 程式人生 > >Java/Android中的DES加密

Java/Android中的DES加密

DES (Data Encrypt Standard資料庫加密標準) 是一種對稱加密演算法,目前在安全方面沒有AES那麼安全,所以逐漸被市場淘汰。一些系統都已經放棄使用DES加密,採用3DES或者AES加密,不過一些過老的系統中還是採用DES加密,所以將程式碼貼出方便以後遇到可以使用。

程式碼:

	/* 定義加密方式, DESede:加密演算法; ECB:工作模式 ; NOPadding:填充方式 */
	private static final String Algorithm = "DESede/ECB/NOPadding";

	/**
	 * 說明 :3DES加密
	 * 
	 * @param keybyte
	 *            金鑰
	 * @return
	 * @key data 明文
	 */
	public static byte[] encryptMode(byte[] data, byte[] keybyte) {
		try {
			// 生成金鑰
			SecretKey deskey = new SecretKeySpec(keybyte, "DESede");
			// 加密
			Cipher c1 = Cipher.getInstance(Algorithm);
			c1.init(Cipher.ENCRYPT_MODE, deskey);
			byte result[] = c1.doFinal(data);
			return result;
		} catch (NoSuchAlgorithmException e1) {
			e1.printStackTrace();
		} catch (javax.crypto.NoSuchPaddingException e2) {
			e2.printStackTrace();
		} catch (Exception e3) {
			e3.printStackTrace();
		}
		return null;
	}

	/**
	 * 說明 :3DES解密
	 * 
	 * @param data
	 *            密文
	 * @param keybyte
	 *            金鑰
	 * @return
	 */

	public static byte[] decryptMode(byte[] data, byte[] keybyte) {
		try {
			// 生成金鑰
			SecretKey deskey = new SecretKeySpec(keybyte, "DESede");
			// 解密
			Cipher c1 = Cipher.getInstance(Algorithm);
			c1.init(Cipher.DECRYPT_MODE, deskey);
			byte[] result = c1.doFinal(data);
			return result;

		} catch (NoSuchAlgorithmException e1) {
			e1.printStackTrace();
		} catch (javax.crypto.NoSuchPaddingException e2) {
			e2.printStackTrace();
		} catch (Exception e3) {
			e3.printStackTrace();
		}
		return null;
	}

大家可以根據需要將byte[]轉換成16進位制或者轉換為Base64格式,如需要加密字串最後將byte[]轉換為Base64格式,不然會出現亂碼;


加密中文字串流程:

1、字串轉換為Byte陣列

2、Byte陣列加密

3、將加密之後的Byte陣列轉換為Base64格式


解密:

1、Base64格式字串轉換為Byte陣列

2、Byte陣列解密

3、將解密後的Byte陣列轉換為String格式


Byte[]16進位制字串

/**
	 * byte陣列轉換為16進位制字串
	 * 
	 * @param bts
	 *            資料來源
	 * @return 16進位制字串
	 */
	public static String bytes2Hex(byte[] bts) {
		String des = "";
		String tmp = null;
		for (int i = 0; i < bts.length; i++) {
			tmp = (Integer.toHexString(bts[i] & 0xFF));
			if (tmp.length() == 1) {
				des += "0";
			}
			des += tmp;
		}
		return des;
	}


16 進位制轉 byte[]

/**
	 * 將16進位制轉換為byte陣列
	 * 
	 * @param hexString
	 *            16進位制字串
	 * @return byte陣列
	 */

	public static byte[] toByte(String hexString) {
		int len = hexString.length() / 2;
		byte[] result = new byte[len];
		for (int i = 0; i < len; i++)
			result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),
					16).byteValue();
		return result;
	}


Byte[] Base64 格式

String encrypedValue = Base64.encodeToString(
        data, Base64.DEFAULT);


Base64 Byte[] 格式

byte[] data= Base64.decode(text, Base64.DEFAULT);


String  byte[] 格式

byte[] data= str.getBytes("UTF8");

Byte[]String格式

String str= new String(data);

生成金鑰方法 :

KeyGenerator kg = KeyGenerator.getInstance("DES");
    Key key = kg.generateKey();
    byte[] keyBytes = ((Key) key).getEncoded();
    String Keystr = DES.bytes2Hex(keyBytes);