//README
DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其算法主要分为两步: 1)初始置换
其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长3
2位,其置换规则为将输入的第58位换到第一位,第50位换到第2位…依此类推,
最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位
,R0是右32位,例:设置换前的输入值为D1D2D3
D64,则经过初始置换后的结果为:L0=D58D50……D8;R0=D57D49……D7。 2)逆置换
经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。
//code代码
package com.security.des;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
/**
* @author God
* @info des生成56为秘钥+8为奇偶校验位 共64位
*/
public class DES {
// KeyGenerator 提供对称密钥生成器的功能,支持各种算法
private KeyGenerator keyGenerator;
// SecretKey 负责保存对称密钥
private SecretKey secretKey;
// Cipher负责完成加密或解密工作
private Cipher cipher;
// 该字节数组负责保存加密的结果
private byte[] cipherBytes;
// 明文结果
private byte[] clearBytes;
//算法常量
private static final String ALGORITHM="DES";
//初始化
public DES() throws NoSuchAlgorithmException, NoSuchPaddingException {
//可以添加新的加密算法
//Security.addProvider(new SunJCE());
// 实例化支持DES算法的密钥生成器(算法名称命名需按规定,否则抛出异常)
keyGenerator = KeyGenerator.getInstance(ALGORITHM);
// 生成密钥 也可以吧秘钥写到文件中保存
secretKey = keyGenerator.generateKey();
// 生成Cipher对象,指定其支持的DES算法
cipher = Cipher.getInstance(ALGORITHM);
}
/**
* 对字符串加密
*/
public byte[] DesEncode(String clearText) {
try {
// 根据密钥,对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 加密,结果保存进cipherByte
cipherBytes = cipher.doFinal(clearText.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
return cipherBytes;
}
/**
* 对字符串解密
*/
public byte[] DesDecode(byte[] cipherBytes) {
try {
// 根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示加密模式
cipher.init(Cipher.DECRYPT_MODE, secretKey);
clearBytes = cipher.doFinal(cipherBytes);
} catch (Exception e) {
e.printStackTrace();
}
return clearBytes;
}
/**
* test
*/
public static void main(String[] args) throws Exception {
DES des = new DES();
String msg = "老司机开车了";
System.out.println("明文是:" + msg);
byte[] encontent = des.DesEncode(msg);
byte[] decontent = des.DesDecode(encontent);
System.out.println("加密后:" + new String(encontent));
System.out.println("解密后:" + new String(decontent));
}
}
//运行结果