package com.cnse.pwdProtected.demo; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.Security; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import com.sun.crypto.provider.SunJCE; /** * @author kxw * java des的简单实现 * @info des生成56为秘钥+8为奇偶校验位 共64位 *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次迭代运算后,获得L1六、R16,将此做为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即获得密文输出。 */ public class DesDemo { // KeyGenerator 提供对称密钥生成器的功能,支持各类算法 private KeyGenerator keyGenerator; // SecretKey 负责保存对称密钥 private SecretKey secretKey; // Cipher负责完成加密或解密工做 private Cipher cipher; // 该字节数组负责保存加密的结果 private byte[] desStrByte; //构造器初始化 public DesDemo() throws Exception { Security.addProvider(new SunJCE()); // 实例化支持DES算法的密钥生成器(算法名称命名需按规定,不然抛出异常) keyGenerator = KeyGenerator.getInstance("DES"); // 生成密钥 secretKey = keyGenerator.generateKey(); // 生成Cipher对象,指定其支持的DES算法 cipher = Cipher.getInstance("DES"); } /** * main test */ public static void main(String[] args) throws Exception { DesDemo des = new DesDemo(); String msg = "123456"; System.out.println("明文是:" + msg); byte[] encontent = des.desEncoder(msg); byte[] decontent = des.desDecoder(encontent); System.out.println("加密后:" + new String(encontent)); System.out.println("解密后:" + new String(decontent)); } /** * 对字符串加密 */ public byte[] desEncoder(String generalStr) throws Exception { // 根据密钥,对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式 cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] src = generalStr.getBytes(); // 加密,结果保存进cipherByte desStrByte = cipher.doFinal(src); return desStrByte; } /** * 对字符串解密 */ public byte[] desDecoder(byte[] buff) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException { // 根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示加密模式 cipher.init(Cipher.DECRYPT_MODE, secretKey); desStrByte = cipher.doFinal(buff); return desStrByte; } }