Java加解密艺术之DES对称加密算法

标签: java 解密 艺术 | 发表时间:2012-05-30 13:13 | 作者:jadyer
出处:http://blog.csdn.net
package com.jadyer.util.codec;

import java.security.Key;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

import org.apache.commons.codec.binary.Base64;

/**
 * DES对称加密算法
 * @see =========================================================================================================
 * @see 对称加密算法就是能将数据加解密。加密的时候使用密钥对数据进行加密,解密的时候使用同样的密钥对数据进行解密
 * @see DES是美国国家标准研究所提出的算法。由于加解密的数据安全性和密钥长度成正比,故DES的56位密钥已经形成安全隐患
 * @see 后来针对DES算法进行了改进,有了三重DES算法(也称DESede或Triple-DES)。全名是TDEA:Triple Data Encryption Algorithm
 * @see DESede针对DES算法的密钥长度较短以及迭代次数偏少问题做了相应改进,提高了安全强度
 * @see 不过DESede算法处理速度较慢,密钥计算时间较长,加密效率不高等问题使得对称加密算法的发展不容乐观
 * @see =========================================================================================================
 * @see Java和BouncyCastle针对DES算法的数据加密支持是不同的,主要体现在密钥长度、工作模式以及填充方式上
 * @see Java6只支持56位密钥,而BouncyCastle支持64位密钥,它的官网是http://www.bouncycastle.org/
 * @see 即便是在DESede算法上,BouncyCastle的密钥长度也要比Java的密钥长度长
 * @see =========================================================================================================
 * @see 另外,Java的API中仅仅提供了DES、DESede、PBE三种对称加密算法密钥材料实现类
 * @see =========================================================================================================
 * @see 关于Java加解密的更多算法实现,可以参考这个博客http://blog.csdn.net/kongqz/article/category/800296
 * @see =========================================================================================================
 */
public class DESCodec {
	//算法名称
	public static final String KEY_ALGORITHM = "DES";
	//算法名称/加密模式/填充方式
	//DES共有四种工作模式-->>ECB:电子密码本模式、CBC:加密分组链接模式、CFB:加密反馈模式、OFB:输出反馈模式
	public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";
	
	/**
	 * 生成密钥
	 */
	public static String initkey() throws NoSuchAlgorithmException {
		KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM); //实例化密钥生成器
		kg.init(56);                                               //初始化密钥生成器
		SecretKey secretKey = kg.generateKey();                    //生成密钥
		return Base64.encodeBase64String(secretKey.getEncoded());  //获取二进制密钥编码形式
	}

	/**
	 * 转换密钥
	 */
	private static Key toKey(byte[] key) throws Exception {
		DESKeySpec dks = new DESKeySpec(key);                                      //实例化Des密钥
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM); //实例化密钥工厂
		SecretKey secretKey = keyFactory.generateSecret(dks);                      //生成密钥
		return secretKey;
	}
	
	/**
	 * 加密数据
	 * @param data 待加密数据
	 * @param key  密钥
	 * @return 加密后的数据
	 */
	public static String encrypt(String data, String key) throws Exception {
		Key k = toKey(Base64.decodeBase64(key));                           //还原密钥
		Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);              //实例化Cipher对象,它用于完成实际的加密操作
		cipher.init(Cipher.ENCRYPT_MODE, k);                               //初始化Cipher对象,设置为加密模式
		return Base64.encodeBase64String(cipher.doFinal(data.getBytes())); //执行加密操作。加密后的结果通常都会用Base64编码进行传输
	}
	
	/**
	 * 解密数据
	 * @param data 待解密数据
	 * @param key  密钥
	 * @return 解密后的数据
	 */
	public static String decrypt(String data, String key) throws Exception {
		Key k = toKey(Base64.decodeBase64(key));
		Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
		cipher.init(Cipher.DECRYPT_MODE, k);                           //初始化Cipher对象,设置为解密模式
		return new String(cipher.doFinal(Base64.decodeBase64(data)));  //执行解密操作
	}
	
	public static void main(String[] args) throws Exception {
		String source = "岂向苍天";
		System.out.println("原文: " + source);
		
		String key = initkey();
		System.out.println("密钥: " + key);
		
		String encryptData = encrypt(source, key);
		System.out.println("加密: " + encryptData);
		
		String decryptData = decrypt(encryptData, key);
		System.out.println("解密: " + decryptData);
	}
}
作者:jadyer 发表于2012-5-30 13:13:51 原文链接
阅读:0 评论:0 查看评论

相关 [java 解密 艺术] 推荐:

Java加解密艺术之DES对称加密算法

- - CSDN博客推荐文章
加密的时候使用密钥对数据进行加密,解密的时候使用同样的密钥对数据进行解密 * @see DES是美国国家标准研究所提出的算法. 由于加解密的数据安全性和密钥长度成正比,故DES的56位密钥已经形成安全隐患 * @see 后来针对DES算法进行了改进,有了三重DES算法(也称DESede或Triple-DES).

JAVA实现RSA加密解密

- - CSDN博客推荐文章
提供加密,解密,生成密钥对等方法. RSA加密原理概述   :. RSA的安全性依赖于大数的分解,公钥和私钥都是两个大素数(大于100的十进制位)的函数. 据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积   .  1.选择两个大素数 p,q ,计算 n=p*q;   .  2.随机选择加密密钥 e ,要求 e 和 (p-1)*(q-1)互质   .

译文:解密Java内存溢出之持久代

- - 研发管理 - ITeye博客
       垃圾回收是Java程序员了解最少的一部分. 他们认为Java虚拟机接管了垃圾回收,因此没必要去担心内存的申请,分配等问题. 但是随着应用越来越复杂,垃圾回收也越来越复杂,一旦垃圾回收变的复杂,应用的性能将会大打折扣. 所以,Java程序员了解垃圾回收的机制并且知道怎样解决“内存溢出”问题会有很大的益处.

java 实现文件内容的加密和解密

- - 编程语言 - ITeye博客
转载: http://xiaoxiaokuang.iteye.com/blog/1440031. getKey(str);//生成密匙. * 文件file进行加密并保存目标文件destFile中. * @param file 要加密的文件 如c:/test/srcFile.txt. * @param destFile 加密后存放的文件名 如c:/加密后文件.txt.

Java 进行 RSA 加解密时不得不考虑到的那些事儿

- - zzm
加密的系统不要具备解密的功能,否则 RSA 可能不太合适. 加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无法破解的密文数据. 否则的话,你就要考虑你的场景是否有必要用 RSA 了. 可以通过修改生成密钥的长度来调整密文长度. 生成密文的长度等于密钥长度.

Java中的锁(Locks in Java)

- - 并发编程网 - ifeve.com
原文链接 作者:Jakob Jenkov 译者:申章 校对:丁一. 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂. 因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字( 译者注:这说的是Java 5之前的情况).

Java PaaS 对决

- 呆瓜 - IBM developerWorks 中国 : 文档库
本文为 Java 开发人员比较了三种主要的 Platform as a Service (PaaS) 产品:Google App Engine for Java、Amazon Elastic Beanstalk 和 CloudBees RUN@Cloud. 它分析了每种服务独特的技术方法、优点以及缺点,而且还讨论了常见的解决方法.

Java浮点数

- d0ngd0ng - 译言-电脑/网络/数码科技
Thomas Wang, 2000年3月. Java浮点数的定义大体上遵守了二进制浮点运算标准(即IEEE 754标准). IEEE 754标准提供了浮点数无穷,负无穷,负零和非数字(Not a number,简称NaN)的定义. 在Java开发方面,这些东西经常被多数程序员混淆. 在本文中,我们将讨论计算这些特殊的浮点数相关的结果.

Qt——转战Java?

- - 博客 - 伯乐在线
编者按:事实上,在跨平台开发方面,Qt仍是最好的工具之一,无可厚非,但Qt目前没有得到任何主流移动操作系统的正式支持. 诺基亚的未来计划,定位非常模糊,这也是令很多第三方开发者感到失望,因此将导致诺基亚屡遭失败的原因. Qt的主要开发者之一Mirko Boehm在博客上强烈讽刺Nokia裁了Qt部门的决定,称其为“绝望之举”,而非“策略变更”.

java 验证码

- - ITeye博客
// 创建字体,字体的大小应该根据图片的高度来定. // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到. // randomCode用于保存随机产生的验证码,以便用户登录后进行验证. // 随机产生codeCount数字的验证码. // 得到随机产生的验证码数字. // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同.