网上发现很多加密解密的代码都有若干错误,发几个能用的java加密解密工具类

DES加密:已经被破解的,但安全性还算ok,比较流行的一种加密方式。

  1 package com.cmit.testing.utils.des;
  2 
  3 import javax.crypto.Cipher;
  4 import javax.crypto.SecretKey;
  5 import javax.crypto.SecretKeyFactory;
  6 import javax.crypto.spec.DESKeySpec;
  7 import javax.crypto.spec.IvParameterSpec;
  8 
  9 
 10 public class Des {
 11 
 12 
 13     /**
 14      * 加密
 15      * @param data
 16      * @param sKey
 17      * @return
 18      */
 19     public static byte[] encrypt(byte[] data, String sKey) {
 20         try {
 21             byte[] key = sKey.getBytes();
 22             // 初始化向量
 23             IvParameterSpec iv = new IvParameterSpec(key);
 24             DESKeySpec desKey = new DESKeySpec(key);
 25             // 创建一个密匙工厂,然后用它把DESKeySpec转换成securekey
 26             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
 27             SecretKey securekey = keyFactory.generateSecret(desKey);
 28             // Cipher对象实际完成加密操作
 29             Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
 30             // 用密匙初始化Cipher对象
 31             cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);
 32             // 现在,获取数据并加密
 33             // 正式执行加密操作
 34             return cipher.doFinal(data);
 35         } catch (Throwable e) {
 36             e.printStackTrace();
 37         }
 38         return null;
 39     }
 40 
 41     /**
 42      * 解密
 43      * @param src
 44      * @param sKey
 45      * @return
 46      * @throws Exception
 47      */
 48     public static byte[] decrypt(byte[] src, String sKey) throws Exception {
 49         byte[] key = sKey.getBytes();
 50         // 初始化向量
 51         IvParameterSpec iv = new IvParameterSpec(key);
 52         // 创建一个DESKeySpec对象
 53         DESKeySpec desKey = new DESKeySpec(key);
 54         // 创建一个密匙工厂
 55         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
 56         // 将DESKeySpec对象转换成SecretKey对象
 57         SecretKey securekey = keyFactory.generateSecret(desKey);
 58         // Cipher对象实际完成解密操作
 59         Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
 60         // 用密匙初始化Cipher对象
 61         cipher.init(Cipher.DECRYPT_MODE, securekey, iv);
 62         // 真正开始解密操作
 63         return cipher.doFinal(src);
 64     }
 65 
 66     /**
 67      * 将二进制转换成16进制
 68      *
 69      * @param buf
 70      * @return
 71      */
 72     public static String parseByte2HexStr(byte buf[]) {
 73         StringBuffer sb = new StringBuffer();
 74         for (int i = 0; i < buf.length; i++) {
 75             String hex = Integer.toHexString(buf[i] & 0xFF);
 76             if (hex.length() == 1) {
 77                 hex = '0' + hex;
 78             }
 79             sb.append(hex.toUpperCase());
 80         }
 81         return sb.toString();
 82     }
 83 
 84     /**
 85      * 将16进制转换为二进制
 86      *
 87      * @param hexStr
 88      * @return
 89      */
 90     public static byte[] parseHexStr2Byte(String hexStr) {
 91         if (hexStr.length() < 1) return null;
 92         byte[] result = new byte[hexStr.length() / 2];
 93         for (int i = 0; i < hexStr.length() / 2; i++) {
 94             int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
 95             int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
 96             result[i] = (byte) (high * 16 + low);
 97         }
 98         return result;
 99     }
100 }
View Code
 1 package com.cmit.testing.utils.des;
 2 
 3 import java.nio.charset.Charset;
 4 
 5 
 6 public class DesUtil {
 7 
 8     /**
 9      * 加密
10      * @param srcStr
11      * @param charset
12      * @param sKey
13      * @return
14      */
15     public static String encrypt(String srcStr, Charset charset, String sKey) {
16         byte[] src = srcStr.getBytes(charset);
17         byte[] buf = Des.encrypt(src, sKey);
18         return Des.parseByte2HexStr(buf);
19     }
20 
21     /**
22      * 解密
23      *
24      * @param hexStr
25      * @param sKey
26      * @return
27      * @throws Exception
28      */
29     public static String decrypt(String hexStr, Charset charset, String sKey) throws Exception {
30         byte[] src = Des.parseHexStr2Byte(hexStr);
31         byte[] buf = Des.decrypt(src, sKey);
32         return new String(buf, charset);
33     }
34 
35     private static final String  SKEY    = "abcdefgh";
36     private static final Charset CHARSET = Charset.forName("gb2312");
37 
38     public static void main(String[] args) {
39         // 待加密内容
40         String str = "dda@1313";
41         String encryptResult = DesUtil.encrypt(str, CHARSET, SKEY);
42         System.out.println(encryptResult);
43         // 直接将如上内容解密
44         String decryResult = "";
45         try {
46             decryResult = DesUtil.decrypt(encryptResult, CHARSET, SKEY);
47         } catch (Exception e1) {
48             e1.printStackTrace();
49         }
50         System.out.println(decryResult);
51     }
52 }
View Code

AES:较为流行,安全性良好

  1 package com.cmit.testing;
  2 
  3 import java.io.IOException;
  4 import java.io.UnsupportedEncodingException;
  5 import java.security.InvalidKeyException;
  6 import java.security.NoSuchAlgorithmException;
  7 import java.security.SecureRandom;
  8 import java.util.Base64;
  9 import java.util.Scanner;
 10 
 11 import javax.crypto.BadPaddingException;
 12 import javax.crypto.Cipher;
 13 import javax.crypto.IllegalBlockSizeException;
 14 import javax.crypto.KeyGenerator;
 15 import javax.crypto.NoSuchPaddingException;
 16 import javax.crypto.SecretKey;
 17 import javax.crypto.spec.SecretKeySpec;
 18 
 19 import sun.misc.BASE64Decoder;
 20 import sun.misc.BASE64Encoder;
 21 
 22 /*
 23  * AES对称加密和解密
 24  */
 25 public class SymmetricEncoder {
 26 
 27     static String  encodeRules="hhhhhh";
 28     /*
 29      * 加密
 30      * 1.构造密钥生成器
 31      * 2.根据ecnodeRules规则初始化密钥生成器
 32      * 3.产生密钥
 33      * 4.创建和初始化密码器
 34      * 5.内容加密
 35      * 6.返回字符串
 36      */
 37     public static String AESEncode(String content){
 38         try {
 39             //1.构造密钥生成器,指定为AES算法,不区分大小写
 40             KeyGenerator keygen=KeyGenerator.getInstance("AES");
 41             //2.根据ecnodeRules规则初始化密钥生成器
 42             //生成一个128位的随机源,根据传入的字节数组
 43             keygen.init(128, new SecureRandom(encodeRules.getBytes()));
 44             //3.产生原始对称密钥
 45             SecretKey original_key=keygen.generateKey();
 46             //4.获得原始对称密钥的字节数组
 47             byte [] raw=original_key.getEncoded();
 48             //5.根据字节数组生成AES密钥
 49             SecretKey key=new SecretKeySpec(raw, "AES");
 50             //6.根据指定算法AES自成密码器
 51             Cipher cipher=Cipher.getInstance("AES");
 52             //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
 53             cipher.init(Cipher.ENCRYPT_MODE, key);
 54             //8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
 55             byte [] byte_encode=content.getBytes("utf-8");
 56             //9.根据密码器的初始化方式--加密:将数据加密
 57             byte [] byte_AES=cipher.doFinal(byte_encode);
 58             //10.将加密后的数据转换为字符串
 59             //这里用Base64Encoder中会找不到包
 60             //解决办法:
 61             //在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。
 62             String AES_encode=new String(new BASE64Encoder().encode(byte_AES));
 63             //11.将字符串返回
 64             return AES_encode;
 65         } catch (NoSuchAlgorithmException e) {
 66             e.printStackTrace();
 67         } catch (NoSuchPaddingException e) {
 68             e.printStackTrace();
 69         } catch (InvalidKeyException e) {
 70             e.printStackTrace();
 71         } catch (IllegalBlockSizeException e) {
 72             e.printStackTrace();
 73         } catch (BadPaddingException e) {
 74             e.printStackTrace();
 75         } catch (UnsupportedEncodingException e) {
 76             e.printStackTrace();
 77         }
 78 
 79         //如果有错就返加nulll
 80         return null;
 81     }
 82     /*
 83      * 解密
 84      * 解密过程:
 85      * 1.同加密1-4步
 86      * 2.将加密后的字符串反纺成byte[]数组
 87      * 3.将加密内容解密
 88      */
 89     public static String AESDncode(String content){
 90         try {
 91             //1.构造密钥生成器,指定为AES算法,不区分大小写
 92             KeyGenerator keygen=KeyGenerator.getInstance("AES");
 93             //2.根据ecnodeRules规则初始化密钥生成器
 94             //生成一个128位的随机源,根据传入的字节数组
 95             keygen.init(128, new SecureRandom(encodeRules.getBytes()));
 96             //3.产生原始对称密钥
 97             SecretKey original_key=keygen.generateKey();
 98             //4.获得原始对称密钥的字节数组
 99             byte [] raw=original_key.getEncoded();
100             //5.根据字节数组生成AES密钥
101             SecretKey key=new SecretKeySpec(raw, "AES");
102             //6.根据指定算法AES自成密码器
103             Cipher cipher=Cipher.getInstance("AES");
104             //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
105             cipher.init(Cipher.DECRYPT_MODE, key);
106             //8.将加密并编码后的内容解码成字节数组
107             byte [] byte_content= new BASE64Decoder().decodeBuffer(content);
108             /*
109              * 解密
110              */
111             byte [] byte_decode=cipher.doFinal(byte_content);
112             String AES_decode=new String(byte_decode,"utf-8");
113             return AES_decode;
114         } catch (NoSuchAlgorithmException e) {
115             e.printStackTrace();
116         } catch (NoSuchPaddingException e) {
117             e.printStackTrace();
118         } catch (InvalidKeyException e) {
119             e.printStackTrace();
120         } catch (IOException e) {
121             e.printStackTrace();
122         } catch (IllegalBlockSizeException e) {
123             e.printStackTrace();
124         } catch (BadPaddingException e) {
125             e.printStackTrace();
126         }
127 
128         //如果有错就返加nulll
129         return null;
130     }
131 
132     public static void main(String[] args) {
133         SymmetricEncoder se=new SymmetricEncoder();
134         String content="abc@123";
135         /*
136          * 加密
137          */
138         String s = se.AESEncode(content);
139         System.out.println("根据输入的规则"+encodeRules+"加密后的密文是:"+s);
140 
141         /*
142          * 解密
143          */
144         System.out.println("根据输入的规则"+encodeRules+"解密后的明文是:"+se.AESDncode(s));
145     }
146 
147 }
View Code

异或加密:很普通的加密,可以和前端代码混用,其实就是很多用于不展示明文,实际上能很轻易破解

 1 package com.cmit.testing.utils;
 2 
 3 public class XORUtl {
 4     public static final int KEY = 7;
 5 
 6     public static void main(String[] args) {
 7         String account = "lwj";
 8         String password = "1234";
 9         String secretKey= XORUtl.encry(account+"@"+password);
10         System.out.println("原始 的字符串为:" + account+"@"+password);
11         System.out.println("原始 的字符串为:" +"sbtsGFdc&576?");
12         System.out.println("加密后 的字符串为:" + secretKey);
13         System.out.println("解密后 的字符串为:" + XORUtl.decryPwd("sbtsGFdc&576?"));
14         String[] split = XORUtl.decryPwd(secretKey).split("@");
15         System.out.println(split[0]);
16         System.out.println(split[1]);
17     }
18 
19     /**
20      * 加密
21      *
22      * @param str
23      * @return
24      */
25     public static String encry(String str) {
26         StringBuilder str2 = new StringBuilder();
27         //加密过程
28         for (int i = 0; i < str.length(); i++) {
29             char c = (char) (str.charAt(i) ^ KEY);
30             str2.append(c);
31         }
32         return str2.toString();
33     }
34 
35     /**
36      * 解密
37      *
38      * @param str
39      * @return
40      */
41     public static String decryPwd(String str) {
42         StringBuilder str3 = new StringBuilder();
43         //解密过程
44         for (int i = 0; i < str.length(); i++) {
45             char c = (char) (str.charAt(i) ^ KEY);
46             str3.append(c);
47         }
48         return str3.toString();
49     }
50 }
View Code
原文地址:https://www.cnblogs.com/best-lwj/p/9771700.html