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. 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(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);
- Android传输数据时Des加密解密详解
- Android传输数据时MD5加密解密详解
- Android传输数据时Aes加密解密详解
- Android传输数据时Rsa加密解密详解
- 使用3DES加密与解密实习Android端和后台的数据加密传输
- android(java) DES加密、解密详解
- DES加密、解密详解
- DES加密解密详解
- Android DES加密解密
- android des 加密解密
- Android DES加密解密
- android DES加密解密
- Android--DES加密解密
- Android传输数据时加密详解
- Android传输数据时加密详解
- Android传输数据时加密详解
- Java DES加密解密详解
- Android DES加密解密算法
- Qt 信号-槽的同步与异步处理
- 关于安装eclipse之后打开问题
- js:限制输入值类型
- 各种编码格式(非常经典)
- android shape类型资源文件
- Android传输数据时Des加密解密详解
- SSM框架原理,作用及使用方法
- 如何测试报表的查询条件
- C++ 中通过GetAdaptersInfo获取网卡配置和Ip地址信息
- 总结反思-贪吃蛇的移动
- 雅虎前端优化35条军规
- text1
- vue.js-window系统的环境搭建
- 如何使用shell脚本快速排序和去重文件数据