1、DES算法的原理
DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用
循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。
2、DES算法的安全性
2.1.安全性比较高的一种算法,目前只有一种方法可以破解该算法,那就是穷举法.
2.2.采用64位密钥技术,实际只有56位有效,8位用来校验的.譬如,有这样的一台
PC机器,
它能每秒计算一百万次,那么256位空间它要穷举的时间为2285年.所以这种算法还是比较安全的一种算法.
该算法被用来解决使用 DES 技术的 56 位时密钥日益减弱的强度,其方法是:使用两个独立密钥对明文运
行 DES 算法三次,从而得到 112 位有效密钥强度。有时称为 DESede(表示加密、解密和加密这三个阶段)。
3、DESJava工具代码
class="java">package com.kvt.lbs.utils;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class EncryptDES
{
/** 指定加密算法为DESede */
private static String ALGORITHM = "DESede";
/** 指定密钥存放文件 */
private static String KEYFile = "KeyFile";
/**
* 生成密钥
*/
private static void generateKey() throws Exception
{
/** DES算法要求有一个可信任的随机数源 */
SecureRandom sr = new SecureRandom();
/** 为DES算法创建一个KeyGenerator对象 */
KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM);
/** 利用上面的随机数据源初始化这个KeyGenerator对象 */
kg.init(sr);
/** 生成密匙 */
SecretKey key = kg.generateKey();
/** 用对象流将生成的密钥写入文件 */
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(KEYFile));
oos.writeObject(key);
/** 清空缓存,关闭文件输出流 */
oos.close();
}
/**
* 加密方法
*
* source 源数据
*/
public static String encrypt(String source) throws Exception
{
generateKey();
/** 将文件中的SecretKey对象读出 */
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(KEYFile));
SecretKey key = (SecretKey) ois.readObject();
/** 得到Cipher对象来实现对源数据的DES加密 */
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] b = source.getBytes();
/** 执行加密操作 */
byte[] b1 = cipher.doFinal(b);
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(b1);
}
/**
* 解密密钥 cryptograph:密文
*/
public static String decrypt(String cryptograph) throws Exception
{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(KEYFile));
SecretKey key = (SecretKey) ois.readObject();
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key);
BASE64Decoder decoder = new BASE64Decoder();
byte[] b1 = decoder.decodeBuffer(cryptograph);
byte[] b = cipher.doFinal(b1);
return new String(b);
}
public static void main(String[] args) throws Exception
{
// 要加密的字符串
String source = "Hello World!";
// 生成的密文
String cryptograph = encrypt(source);
System.out.println(cryptograph);
// 解密密文
String target = decrypt(cryptograph);
System.out.println(target);
}
}
说明:资料来自于http://blog.chiefleo.me/archives/159,http://baike.baidu.com/link?url=YfORHQKbUB_XdE3sbT9LLQ5oCPf_tnK6s7SjO3V82Kh6LzMiZN248D0ztFZAfKbe6ToTJEMcCVU7MhlEx9wKLa