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

时间:2021-03-11 19:10:56

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

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";