Java DES加密工具

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工具代码
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/159http://baike.baidu.com/link?url=YfORHQKbUB_XdE3sbT9LLQ5oCPf_tnK6s7SjO3V82Kh6LzMiZN248D0ztFZAfKbe6ToTJEMcCVU7MhlEx9wKLa

你可能感兴趣的:(java,加密,算法)