关闭

Java对称加密算法DES[以及其他对称加密算法]

标签: 加密解密
684人阅读 评论(0) 收藏 举报
分类:

对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。

DES算法简介

DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

Java实现

package com.zzj.encryption;

import java.math.BigInteger;

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

/**
 * 对称加密DES算法
 * @author Administrator
 *
 */
public class DESTest {
	/** 算法名称 **/
	static final String ALGORITHM = "DES";
	/** 算法名称/加密模式/填充方式   **/
	static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";
	
	/** 密钥,getBytes的长度必须大于等于8 **/
	static final String SECRET_KEY = "!@#$%^&*";
	
	public static void main(String[] args) throws Exception {
		String data = "我是程序猿!";
		//加密
		String hex = encryption(data);
		System.out.println(hex);
		
		System.out.println("-----------------------------------------");
		// 解密
		String origin = decryption(hex);
		System.out.println(origin);
	}

	/**
	 * 加密,返回16进制的字符串
	 * @param data
	 * @return
	 * @throws Exception
	 */
	private static String encryption(String data) throws Exception{
		// 创建密钥
		DESKeySpec desKeySpec = new DESKeySpec(SECRET_KEY.getBytes("UTF-8"));
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
		SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
		// 加密
		Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
		cipher.init(Cipher.ENCRYPT_MODE, secretKey);
		byte[] bs = cipher.doFinal(data.getBytes("UTF-8"));
		// 编码成16进制字符串
		BigInteger bi = new BigInteger(1, bs);
		return bi.toString(16);
	}
	
	/**
	 * 解密
	 * @param hex
	 * @return
	 * @throws Exception
	 */
	private static String decryption(String hex) throws Exception {
		// 解码16进制字符串
		BigInteger bi = new BigInteger(hex, 16);
		byte[] bs = bi.toByteArray();// 该数组包含此 BigInteger 的二进制补码表示形式。
		byte[] originBs = new byte[bs.length - 1];
		byte[] target = bs;
		if (bs[0] == 0) {
			System.out.println("去补码...");
			System.arraycopy(bs, 1, originBs, 0, originBs.length); // 去掉补码
			target = originBs;
		}
		// 创建密钥
		DESKeySpec desKeySpec = new DESKeySpec(SECRET_KEY.getBytes("UTF-8"));
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
		SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
		// 解密
		Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
		cipher.init(Cipher.DECRYPT_MODE, secretKey);
		byte[] decryptionBs = cipher.doFinal(target);
		return new String(decryptionBs, "UTF-8");
	}
}
结果:

33433fde064c18210cefaeae2bc795619b5fc001aeaef528
-----------------------------------------
我是程序猿!

DES是美国国家标准研究所提出的算法。des的56位的密钥已经形成安全隐患,在1998年之后就很少被采用。

其他对称加密算法

三重DES---DESede

DESede是由DES对称加密算法改进后的一种对称加密算法。使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。

不过desede算法处理速度较慢,密钥计算时间较长,加密效率不高问题使得对称加密算法的发展不容乐观。

public static final String KEY_ALGORITHM = "DESede";  

public static final String CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding";  

AES算法

DES的不安全性以及DESede算法的低效,催生了这个AES算法(advanced Encryption Standard)。这个算法比DES要快,安全性高。密钥建立时间短、灵敏性好、内存需求低,在各个领域应用广泛。

目前,AES通常用于移动通信系统以及一些软件的安全外壳。还有一些无线路由器中也是用AES算法构建加密协议。

public static final String KEY_ALGORITHM = "AES";  

public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1053340次
    • 积分:10708
    • 等级:
    • 排名:第1570名
    • 原创:284篇
    • 转载:140篇
    • 译文:1篇
    • 评论:100条
    最新评论