发表于: 2017-05-02 21:24:26

2 1403


今天完成的事情:

学习了des算法的加密流程

按照例子编写了des加密类

import javax.crypto.Cipher;
import java.security.Key;
import java.security.Security;

/**
* DES加解密算法 
*/
public class DES {

private static String strDefaultKey "abcDEF123";
   private Cipher encryptCipher null;
   private Cipher decryptCipher null;


   /**
    * 默认构造方法,使用默认密钥 
    @throws Exception
    */
   public DES() throws Exception {
this(strDefaultKey);
   }


/**
    * 指定密钥构造方法 
    @param strKey 指定的密钥 
    @throws Exception
    */
   public DES(String strKey) throws Exception {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
       Key key = getKey(strKey.getBytes());
       encryptCipher = Cipher.getInstance("DES");
       encryptCipher.init(Cipher.ENCRYPT_MODEkey);
       decryptCipher = Cipher.getInstance("DES");
       decryptCipher.init(Cipher.DECRYPT_MODEkey);
   }


/**
    * 加密字符串 
    @param strIn 需加密的字符串 
    @return 加密后的字符串
    @throws Exception
    */
   public String encrypt(String strIn) throws Exception {
return byteArr2HexStr(encrypt(strIn.getBytes()));
   }


/**
    * 加密字节数组 
    @param arrB 需加密的字节数组 
    @return 加密后的字节数组
    @throws Exception
    */
   public byte[] encrypt(byte[] arrB) throws Exception {
return encryptCipher.doFinal(arrB);
   }



/**
    * 解密字符串 
    @param strIn 需解密的字符串 
    @return 解密后的字符串
    @throws Exception
    */
   public String decrypt(String strIn) throws Exception {
return new String(decrypt(hexStr2ByteArr(strIn)));
   }


/**
    * 解密字节数组 
    @param arrB 需解密的字节数组 
    @return 解密后的字节数组
    @throws Exception
    */
   public byte[] decrypt(byte[] arrB) throws Exception {
return decryptCipher.doFinal(arrB);
   }



/**
    * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 
    不足8位时后面补0,超出8位只取前8位 
    @param arrBTmp 构成该字符串的字节数组 
    @return 生成的密钥
    @throws java.lang.Exception
    */
   private Key getKey(byte[] arrBTmp) throws Exception {
byte[] arrB = new byte[8];
       for (int i = 0i < arrBTmp.length && i < arrB.lengthi++) {
arrB[i] = arrBTmp[i];
       }
Key key = new javax.crypto.spec.SecretKeySpec(arrB"DES");
       return key;
   }



/**
    * byte数组转换为表示16进制值的字符串, 
    如:byte[]{8,18}转换为:0813, 
    public static byte[] hexStr2ByteArr(String strIn) 
    * 互为可逆的转换过程 
    @param arrB 需要转换的byte数组 
    @return 转换后的字符串
    @throws Exception 本方法不处理任何异常,所有异常全部抛出 
    */
   public static String byteArr2HexStr(byte[] arrB) throws Exception {
int iLen = arrB.length;
       StringBuffer sb = new StringBuffer(iLen * 2);
       for (int i = 0i < iLeni++) {
int intTmp = arrB[i];
           while (intTmp < 0) {
intTmp = intTmp + 256;
           }
if (intTmp < 16) {
sb.append("0");
           }
sb.append(Integer.toString(intTmp16));
       }
return sb.toString();
   }



/**
    * 将表示16进制值的字符串转换为byte数组, 
    public static String byteArr2HexStr(byte[] arrB) 
    * 互为可逆的转换过程 
    @param strIn 需要转换的字符串 
    @return 转换后的byte数组
    @throws Exception 本方法不处理任何异常,所有异常全部抛出 
    */
   public static byte[] hexStr2ByteArr(String strIn) throws Exception {
byte[] arrB = strIn.getBytes();
       int iLen = arrB.length;
       byte[] arrOut = new byte[iLen / 2];
       for (int i = 0i < iLeni = i + 2) {
String strTmp = new String(arrBi2);
           arrOut[i / 2] = (byte) Integer.parseInt(strTmp16);
       }
return arrOut;
   }


}  


按照例子编写des算法工具类



明天计划的事情:

学习拦截器,尝试使用des对用户id进行加密



遇到的问题:

暂无



收获:

在编写des工具类的过程中了解了des在java中是如何被使用的

DES算法的原理

1.所需参数

key:8个字节共64位的工作密钥

data:8个字节共64位的需要被加密或被解密的数据

mode:DES工作方式,加密或者解密

2.初始置换

DES算法使用64位的密钥key将64位的明文输入块变为64位的密文输出块,并把输出块分为L0、R0两部分,每部分均为32位。

3.加密处理--迭代过程

经过初始置换后,进行16轮完全相同的运算,在运算过程中数据与秘钥结合。

4.逆置换

将初始置换进行16次的迭代,即进行16层的加密变换,这个运算过程我们暂时称为函数f。得到L16和R16,将此作为输入块,进行逆置换得到最终的密文输出块。逆置换是初始置换的逆运算。从初始置换规则中可以看到,原始数据的第1位置换到了第40位,第2位置换到了第8位。则逆置换就是将第40位置换到第1位,第8位置换到第2位。

5.DES解密

加密和解密可以使用相同的算法。加密和解密唯一不同的是秘钥的次序是相反的。就是说如果每一轮的加密秘钥分别是K1、K2、K3...K16,那么解密秘钥就是K16、K15、K14...K1。为每一轮产生秘钥的算法也是循环的。加密是秘钥循环左移,解密是秘钥循环右移。解密秘钥每次移动的位数是:0、1、2、2、2、2、2、2、1、2、2、2、2、2、2、1。



返回列表 返回列表
评论

    分享到