3DES加解密算法



3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。

3DES(即Triple DES)是DES向AES过渡的 加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的 密钥,M代表明文,C代表密文,这样:
3DES加密过程为:C=Ek3(Dk2(Ek1(M)))
3DES解密过程为:M=Dk1(EK2(Dk3(C)))
具体的java代码如下:
进行3DES加密解密并返回Base64字符串
[java]  view plain  copy
  1. /** 
  2.  *字符串 DESede(3DES) 加密 
  3.  */  
  4. public class DesUtil{  
  5.     private static final String Algorithm = "DESede"// 定义 加密算法,可用 DES,DESede,Blowfish  
  6.     private static final String hexString="0123456789ABCDEF";  
  7.     /** 
  8.      * 
  9.      * @param keybyte  加密密钥,长度为24字节 
  10.      * @param src     字节数组(根据给定的字节数组构造一个密钥。 ) 
  11.      * @return 
  12.      */  
  13.     public static byte[] encryptMode(byte[] keybyte, byte[] src) {  
  14.         try {  
  15.             // 根据给定的字节数组和算法构造一个密钥  
  16.             SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);  
  17.             // 加密  
  18.             Cipher c1 = Cipher.getInstance(Algorithm);  
  19.             c1.init(Cipher.ENCRYPT_MODE, deskey);  
  20.             return c1.doFinal(src);  
  21.         } catch (java.security.NoSuchAlgorithmException e1) {  
  22.             e1.printStackTrace();  
  23.         } catch (javax.crypto.NoSuchPaddingException e2) {  
  24.             e2.printStackTrace();  
  25.         } catch (Exception e3) {  
  26.             e3.printStackTrace();  
  27.         }  
  28.         return null;  
  29.     }  
  30.   
  31.     /** 
  32.      * 
  33.      * @param keybyte 密钥 
  34.      * @param src       需要解密的数据 
  35.      * @return 
  36.      */  
  37.     public static byte[] decryptMode(byte[] keybyte, byte[] src) {  
  38.         try {  
  39.             // 生成密钥  
  40.             SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);  
  41.             // 解密  
  42.             Cipher c1 = Cipher.getInstance(Algorithm);  
  43.             c1.init(Cipher.DECRYPT_MODE, deskey);  
  44.             return c1.doFinal(src);  
  45.         } catch (java.security.NoSuchAlgorithmException e1) {  
  46.             e1.printStackTrace();  
  47.         } catch (javax.crypto.NoSuchPaddingException e2) {  
  48.             e2.printStackTrace();  
  49.         } catch (Exception e3) {  
  50.             e3.printStackTrace();  
  51.         }  
  52.         return null;  
  53.     }  
  54.   
  55.     /** 
  56.      * 字符串转为16进制 
  57.      * @param str 
  58.      * @return 
  59.      */  
  60.     public static String encode(String str)  
  61.     {  
  62.         //根据默认编码获取字节数组  
  63.         byte[] bytes=str.getBytes();  
  64.         StringBuilder sb=new StringBuilder(bytes.length*2);  
  65.   
  66.         //将字节数组中每个字节拆解成2位16进制整数  
  67.         for(int i=0;i<bytes.length;i++)  
  68.         {  
  69.             sb.append(hexString.charAt((bytes[i]&0xf0)>>4));  
  70.             sb.append(hexString.charAt((bytes[i]&0x0f)>>0));  
  71.         }  
  72.         return sb.toString();  
  73.     }  
  74.     /** 
  75.      * 
  76.      * @param bytes 
  77.      * @return 
  78.      * 将16进制数字解码成字符串,适用于所有字符(包括中文) 
  79.      */  
  80.     public static String decode(String bytes)  
  81.     {  
  82.         ByteArrayOutputStream baos=new ByteArrayOutputStream(bytes.length()/2);  
  83.         //将每2位16进制整数组装成一个字节  
  84.         for(int i=0;i<bytes.length();i+=2)  
  85.             baos.write((hexString.indexOf(bytes.charAt(i))<<4 |hexString.indexOf(bytes.charAt(i+1))));  
  86.         return new String(baos.toByteArray());  
  87.     }  
  88.   
  89.     // 转换成十六进制字符串  
  90.     public static String byte2hex(byte[] b) {  
  91.         String hs = "";  
  92.         String stmp = "";  
  93.         for (int n = 0; n < b.length; n++) {  
  94.             stmp = (Integer.toHexString(b[n] & 0XFF));  
  95.             if (stmp.length() == 1)  
  96.                 hs = hs + "0" + stmp;  
  97.             else  
  98.                 hs = hs + stmp;  
  99.             if (n < b.length - 1)  
  100.                 hs = hs + ":";  
  101.         }  
  102.         return hs.toUpperCase();  
  103.     }  
  104.   
  105.   
  106. }  
可以写相应的测试类进行测试
加密:
[java]  view plain  copy
  1. final byte[] keyBytes= Constant.DESKEY.getBytes();//密钥串(调用配置文件中的密钥串,自己也可以直接写再getBytes())  
  2. byte[] contentBytes = DesUtil.encryptMode(keyBytes, content.getBytes());//加密之后的路径  
  3. encrypt= Base64.encodeBase64String(contentBytes);//返回Base64的字符串  
解密:
[java]  view plain  copy
  1. byte[] bytes = decoder.decodeBuffer(sign);//通过BASE64Decoder将加密的字符串转化为byte[]  
  2. byte[] dSign = DesUtil.decryptMode(keyBytes, bytes);//解密  
  3. String signString = new String(dSign, "utf-8");//设置编码,防止乱码  

3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。

3DES(即Triple DES)是DES向AES过渡的 加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的 密钥,M代表明文,C代表密文,这样:
3DES加密过程为:C=Ek3(Dk2(Ek1(M)))
3DES解密过程为:M=Dk1(EK2(Dk3(C)))
具体的java代码如下:
进行3DES加密解密并返回Base64字符串
[java]  view plain  copy
  1. /** 
  2.  *字符串 DESede(3DES) 加密 
  3.  */  
  4. public class DesUtil{  
  5.     private static final String Algorithm = "DESede"// 定义 加密算法,可用 DES,DESede,Blowfish  
  6.     private static final String hexString="0123456789ABCDEF";  
  7.     /** 
  8.      * 
  9.      * @param keybyte  加密密钥,长度为24字节 
  10.      * @param src     字节数组(根据给定的字节数组构造一个密钥。 ) 
  11.      * @return 
  12.      */  
  13.     public static byte[] encryptMode(byte[] keybyte, byte[] src) {  
  14.         try {  
  15.             // 根据给定的字节数组和算法构造一个密钥  
  16.             SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);  
  17.             // 加密  
  18.             Cipher c1 = Cipher.getInstance(Algorithm);  
  19.             c1.init(Cipher.ENCRYPT_MODE, deskey);  
  20.             return c1.doFinal(src);  
  21.         } catch (java.security.NoSuchAlgorithmException e1) {  
  22.             e1.printStackTrace();  
  23.         } catch (javax.crypto.NoSuchPaddingException e2) {  
  24.             e2.printStackTrace();  
  25.         } catch (Exception e3) {  
  26.             e3.printStackTrace();  
  27.         }  
  28.         return null;  
  29.     }  
  30.   
  31.     /** 
  32.      * 
  33.      * @param keybyte 密钥 
  34.      * @param src       需要解密的数据 
  35.      * @return 
  36.      */  
  37.     public static byte[] decryptMode(byte[] keybyte, byte[] src) {  
  38.         try {  
  39.             // 生成密钥  
  40.             SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);  
  41.             // 解密  
  42.             Cipher c1 = Cipher.getInstance(Algorithm);  
  43.             c1.init(Cipher.DECRYPT_MODE, deskey);  
  44.             return c1.doFinal(src);  
  45.         } catch (java.security.NoSuchAlgorithmException e1) {  
  46.             e1.printStackTrace();  
  47.         } catch (javax.crypto.NoSuchPaddingException e2) {  
  48.             e2.printStackTrace();  
  49.         } catch (Exception e3) {  
  50.             e3.printStackTrace();  
  51.         }  
  52.         return null;  
  53.     }  
  54.   
  55.     /** 
  56.      * 字符串转为16进制 
  57.      * @param str 
  58.      * @return 
  59.      */  
  60.     public static String encode(String str)  
  61.     {  
  62.         //根据默认编码获取字节数组  
  63.         byte[] bytes=str.getBytes();  
  64.         StringBuilder sb=new StringBuilder(bytes.length*2);  
  65.   
  66.         //将字节数组中每个字节拆解成2位16进制整数  
  67.         for(int i=0;i<bytes.length;i++)  
  68.         {  
  69.             sb.append(hexString.charAt((bytes[i]&0xf0)>>4));  
  70.             sb.append(hexString.charAt((bytes[i]&0x0f)>>0));  
  71.         }  
  72.         return sb.toString();  
  73.     }  
  74.     /** 
  75.      * 
  76.      * @param bytes 
  77.      * @return 
  78.      * 将16进制数字解码成字符串,适用于所有字符(包括中文) 
  79.      */  
  80.     public static String decode(String bytes)  
  81.     {  
  82.         ByteArrayOutputStream baos=new ByteArrayOutputStream(bytes.length()/2);  
  83.         //将每2位16进制整数组装成一个字节  
  84.         for(int i=0;i<bytes.length();i+=2)  
  85.             baos.write((hexString.indexOf(bytes.charAt(i))<<4 |hexString.indexOf(bytes.charAt(i+1))));  
  86.         return new String(baos.toByteArray());  
  87.     }  
  88.   
  89.     // 转换成十六进制字符串  
  90.     public static String byte2hex(byte[] b) {  
  91.         String hs = "";  
  92.         String stmp = "";  
  93.         for (int n = 0; n < b.length; n++) {  
  94.             stmp = (Integer.toHexString(b[n] & 0XFF));  
  95.             if (stmp.length() == 1)  
  96.                 hs = hs + "0" + stmp;  
  97.             else  
  98.                 hs = hs + stmp;  
  99.             if (n < b.length - 1)  
  100.                 hs = hs + ":";  
  101.         }  
  102.         return hs.toUpperCase();  
  103.     }  
  104.   
  105.   
  106. }  
可以写相应的测试类进行测试
加密:
[java]  view plain  copy
  1. final byte[] keyBytes= Constant.DESKEY.getBytes();//密钥串(调用配置文件中的密钥串,自己也可以直接写再getBytes())  
  2. byte[] contentBytes = DesUtil.encryptMode(keyBytes, content.getBytes());//加密之后的路径  
  3. encrypt= Base64.encodeBase64String(contentBytes);//返回Base64的字符串  
解密:
[java]  view plain  copy
  1. byte[] bytes = decoder.decodeBuffer(sign);//通过BASE64Decoder将加密的字符串转化为byte[]  
  2. byte[] dSign = DesUtil.decryptMode(keyBytes, bytes);//解密  
  3. String signString = new String(dSign, "utf-8");//设置编码,防止乱码  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值