您的位置:首页 > 编程语言 > Java开发

java实现DES数据加密与解密

2016-03-20 17:32 507 查看
DES加密原理

DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。 解密反之。

接下来是我做测试的代码:

DES数据加密清单:

[java] view
plain copy

print?

/**

* DES算法密钥

*/

private static final byte[] DES_KEY = { 21, 1, -110, 82, -32, -85, -128, -65 };

/**

* 数据加密,算法(DES)

*

* @param data

* 要进行加密的数据

* @return 加密后的数据

*/

public static String encryptBasedDes(String data) {

String encryptedData = null;

try {

// DES算法要求有一个可信任的随机数源

SecureRandom sr = new SecureRandom();

DESKeySpec deskey = new DESKeySpec(DES_KEY);

// 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

SecretKey key = keyFactory.generateSecret(deskey);

// 加密对象

Cipher cipher = Cipher.getInstance("DES");

cipher.init(Cipher.ENCRYPT_MODE, key, sr);

// 加密,并把字节数组编码成字符串

encryptedData = new sun.misc.BASE64Encoder().encode(cipher.doFinal(data.getBytes()));

} catch (Exception e) {

// log.error("加密错误,错误信息:", e);

throw new RuntimeException("加密错误,错误信息:", e);

}

return encryptedData;

}

DES数据解密清单:

[java] view
plain copy

print?

/**

* 数据解密,算法(DES)

*

* @param cryptData

* 加密数据

* @return 解密后的数据

*/

public static String decryptBasedDes(String cryptData) {

String decryptedData = null;

try {

// DES算法要求有一个可信任的随机数源

SecureRandom sr = new SecureRandom();

DESKeySpec deskey = new DESKeySpec(DES_KEY);

// 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

SecretKey key = keyFactory.generateSecret(deskey);

// 解密对象

Cipher cipher = Cipher.getInstance("DES");

cipher.init(Cipher.DECRYPT_MODE, key, sr);

// 把字符串解码为字节数组,并解密

decryptedData = new String(cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(cryptData)));

} catch (Exception e) {

// log.error("解密错误,错误信息:", e);

throw new RuntimeException("解密错误,错误信息:", e);

}

return decryptedData;

}

测试清单:

[java] view
plain copy

print?

public static void main(String[] args) {

// TODO Auto-generated method stub

String str="0123456789abcdefg";

// DES数据加密

String s1=encryptBasedDes(str);

System.out.println(s1);

// DES数据解密

String s2=decryptBasedDes(s1);

System.err.println(s2);

}

输出结果:

[java] view
plain copy

print?

eUhQ+Ko1BJh5j4ok/VKL/LrUgmg0n8vV

0123456789abcdefg
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: