Android传输数据时Des加密解密详解

来源:互联网 发布:网络管理培训班 编辑:程序博客网 时间:2024/06/07 19:32

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. DES8bytes.*/
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(inti = 0; i < byt.length; i++) {
        appendHex(result, byt[i]);
    }
    returnresult.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);
        returnstrKey;
    } 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);

 

原创粉丝点击