Android传输数据时Des加密解密详解
一、DES加密算法
DES是一种“对称加密算法”。对称加密算法:加密和解密使用相同密钥的算法。DES使用56位密钥。
动态密钥:长度不能小于8位字节。因为DES固定格式为128bits,即8bytes。
二、DES加密算法实例
注:加密之后要进行Base64编码之后进行传输
解密之前要进行Base64解码之后进行解密
1. 设置常量
private final static String HEX = "0123456789ABCDEF"; /** DES是加密方式 CBC是工作模式 PKCS5Padding是填充模式*/ private final static String TRANSFORMATION = "DES/CBC/PKCS5Padding"; /** 初始化向量参数,AES 为16bytes. DES 为8bytes.*/ private final static String IVPARAMETERSPEC = "01020304"; /** DES是加密方式*/ private final static String ALGORITHM = "DES"; /** SHA1PRNG 强随机种子算法, 要区别4.2以上版本的调用方法*/ private static final String SHA1PRNG = "SHA1PRNG"; |
2. 动态生成密钥:加密和解密使用同一个密钥
//二进制转字符 public static String byte2String(byte[] byt) { if (byt == null) return ""; StringBuffer result = new StringBuffer(2 * byt.length); for (int i = 0; i < byt.length; i++) { appendHex(result, byt[i]); } return result.toString(); } private static void appendHex(StringBuffer sb, byte b) { sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f)); } /** * 生成随机数,可以当做动态的密钥 加密和解密的密钥必须一致,不然将不能解密 */ public static String generateKey() { try { SecureRandom secureRandom = SecureRandom.getInstance(SHA1PRNG); byte[] bytesKey = new byte[20]; secureRandom.nextBytes(bytesKey); String strKey = byte2String(bytesKey); return strKey; } catch (Exception e) { e.printStackTrace(); } return null; } |
3. 处理密钥Key的两种方式
1) 处理密钥方式一 // 对密钥进行处理 private static Key disposeKey(String key) throws Exception { DESKeySpec dks = new DESKeySpec(key.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); return keyFactory.generateSecret(dks); } 2) 处理密钥方式二 // 对密钥进行处理 private static Key getRawKey(String key) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM); //for Android SecureRandom sr = null; // 在4.2以上版本中,SecureRandom获取方式发生了改变 if (android.os.Build.VERSION.SDK_INT >= 17) { sr = SecureRandom.getInstance(SHA1PRNG, "Crypto"); } else { sr = SecureRandom.getInstance(SHA1PRNG); } //for Java // secureRandom = SecureRandom.getInstance(SHA1PRNG); sr.setSeed(key.getBytes()); kgen.init(64, sr); //DES固定格式为64bits,即8bytes。 SecretKey skey = kgen.generateKey(); byte[] raw = skey.getEncoded(); return new SecretKeySpec(raw, ALGORITHM); } |
4. 加密实现
/** * DES算法,加密 * * @param data 待加密字符串 * @param key 加密私钥 * @return 加密后的字节数组,一般结合Base64编码使用 */ public static String encode(String key, String data) { return encode(key, data.getBytes()); } /** * DES算法,加密 * * @param data 待加密字符串 * @param key 加密私钥 * @return 加密后的字节数组,一般结合Base64编码使用 */ public static String encode(String key, byte[] data) { try { Cipher cipher = Cipher.getInstance(TRANSFORMATION); IvParameterSpec iv = new IvParameterSpec(IVPARAMETERSPEC.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, disposeKey(key), iv); byte[] bytes = cipher.doFinal(data); return Base64.encodeToString(bytes, Base64.DEFAULT); } catch (Exception e) { return null; } } |
5. 解密实现
/** * 获取编码后的值 * * @param key 解密私钥 * @param data 待解密字符串 * @return 解密之后字符串 */ public static String decode(String key, String data) { return decode(key, Base64.decode(data, Base64.DEFAULT)); } /** * DES算法,解密 * * @param key 解密私钥 * @paramdata 待解密字节数组 * @return 解密后的字符串 */ public static String decode(String key, byte[] data) { try { Cipher cipher = Cipher.getInstance(TRANSFORMATION); IvParameterSpec iv = new IvParameterSpec(IVPARAMETERSPEC.getBytes()); cipher.init(Cipher.DECRYPT_MODE, disposeKey(key), iv); byte[] original = cipher.doFinal(data); String originalStr = new String(original); return originalStr; } catch (Exception e) { return null; } } |
6. 加密解密方式实现
//生成DES密钥 String strKey = generateKey(); //DES加密 String strEncode = encode(strKey,"Lking"); Log.e("Lking","DES加密---->"+strEncode); String strDecode = decode(strKey,strEncode); Log.e("Lking","DES解密---->"+strDecode); |