1、AES:高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
工具类代码如下:
1 import java.security.SecureRandom;
2 import javax.crypto.Cipher;
3 import javax.crypto.KeyGenerator;
4 import javax.crypto.spec.SecretKeySpec;
5 import com.asiainfo.lop.utils.string.StringUtil;
6 public class AES {
7 /**
8 * AES加密
9 * @param content 待加密的内容
10 * @param encryptKey 加密密钥
11 * @return 加密后的byte[]
12 * @throws Exception
13 */
14 public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {
15 KeyGenerator kgen = KeyGenerator.getInstance("AES");
16 kgen.init(128, new SecureRandom(encryptKey.getBytes()));
17
18 Cipher cipher = Cipher.getInstance("AES");
19 cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES"));
20
21 return cipher.doFinal(content.getBytes("utf-8"));
22 }
23
24 /**
25 * AES加密为base 64 code
26 * @param content 待加密的内容
27 * @param encryptKey 加密密钥
28 * @return 加密后的base 64 code
29 * @throws Exception
30 */
31 public static String encrypt(String content, String encryptKey) throws Exception {
32 AES aes = new AES();
33 return aes.byte2hex((aesEncryptToBytes(content, encryptKey)));
34 }
35
36 /**
37 * AES解密
38 * @param encryptBytes 待解密的byte[]
39 * @param decryptKey 解密密钥
40 * @return 解密后的String
41 * @throws Exception
42 */
43 public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception {
44 KeyGenerator kgen = KeyGenerator.getInstance("AES");
45 kgen.init(128, new SecureRandom(decryptKey.getBytes()));
46
47 Cipher cipher = Cipher.getInstance("AES");
48 cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES"));
49 byte[] decryptBytes = cipher.doFinal(encryptBytes);
50 return new String(decryptBytes);
51 }
52
53 /**
54 * 将base 64 code AES解密
55 * @param encryptStr 待解密的base 64 code
56 * @param decryptKey 解密密钥
57 * @return 解密后的string
58 * @throws Exception
59 */
60 public static String decrypt(String encryptStr, String decryptKey) throws Exception {
61 AES aes = new AES();
62 return StringUtil.isEmpty(encryptStr) ? null : aesDecryptByBytes(aes.hex2byte(encryptStr), decryptKey);
63 }
64
65 private String byte2hex(byte[] b) {
66 String hs = "";
67 String stmp = "";
68 for (int i = 0; i < b.length; i++) {
69 stmp = Integer.toHexString(b[i] & 0xFF);
70 if (stmp.length() == 1) {
71 hs += "0" + stmp;
72 } else {
73 hs += stmp;
74 }
75 }
76 return hs.toUpperCase();
77 }
78
79 private byte[] hex2byte(String hex) throws IllegalArgumentException {
80 if (hex.length() % 2 != 0) {
81 System.out.println("hex:" + hex + "\nlength:" + hex.length());
82 throw new IllegalArgumentException();
83 }
84 char[] arr = hex.toCharArray();
85 byte[] b = new byte[hex.length() / 2];
86 for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) {
87 String swap = "" + arr[i++] + arr[i];
88 int byteint = Integer.parseInt(swap, 16) & 0xFF;
89 b[j] = new Integer(byteint).byteValue();
90 }
91 return b;
92 }
93
94
95 public static void main(String[] args) throws Exception {
96 String content = "我爱你";
97 System.out.println("加密前:" + content);
98
99 String key = "123456";
100 System.out.println("加密密钥和解密密钥:" + key);
101
102 String encrypt = encrypt(content, key);
103 System.out.println("加密后:" + encrypt);
104
105 String decrypt = decrypt(encrypt, key);
106 System.out.println("解密后:" + decrypt);
107 }
108 }
2、BASE64
工具类代码如下:
1 /**
2 *
3 * <p>
4 * Title: Base64.java
5 * </p>
6 * <p>
7 * Description: 字符串加密解密
8 * </p>
9 * @version 1.0
10 *
11 */
12
13 @SuppressWarnings("restriction")
14 public final class BASE64 {
15 /**
16 *
17 * 加密字符串
18 *
19 * @param s
20 * @return String
21 *
22 */
23 public static String encrypt(String s) {
24 if (s == null)
25 return null;
26 return (new sun.misc.BASE64Encoder()).encode(s.getBytes());
27 }
28
29 /**
30 *
31 * 解密字符串
32 *
33 * @param s
34 * @return String
35 *
36 */
37 public static String decrypt(String s) {
38 if (s == null)
39 return null;
40 sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
41 try {
42 byte[] b = decoder.decodeBuffer(s);
43 return new String(b);
44 } catch (Exception e) {
45 return null;
46 }
47 }
48
49 public static void main(String[] aa) {
50 String pwd1 = "Wangbt777";
51 System.out.println(encrypt(pwd1)); // 加密
52
53 String pwd2 = "V2FuZ2J0Nzc3";
54 System.out.println(decrypt(pwd2)); // 解密
55 }
56 }
3、DES:算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组, 密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。DESede又称Triple-DES即三重DES加密算法,加强了DES的安全性,但速度稍慢,它是一种对称加密算法,加密解密都是用同一个密钥。本文介绍使用Java自带的API实现DEDede加密解密。
工具类代码如下:
1 import java.security.Security;
2 import javax.crypto.Cipher;
3 import javax.crypto.KeyGenerator;
4 import javax.crypto.SecretKey;
5 import javax.crypto.spec.SecretKeySpec;
6
7 /**
8 *
9 * <p>
10 * Title: DES.java
11 * </p>
12 * <p>
13 * Description: 字符串加密类,支持算法DES、DESede、Blowfish
14 * </p>
15 *
16 * @author
17 * @version 1.0
18 *
19 */
20 @SuppressWarnings({ "static-access", "restriction" })
21 public class DES {
22 public static int _DES = 1;
23 public static int _DESede = 2;
24 public static int _Blowfish = 3;
25 // Cipher负责完成加密或解密工作
26 private Cipher p_Cipher;
27 // SecretKey 负责保存对称密钥
28 private SecretKey p_Key;
29 private String p_Algorithm;
30 private static DES _instance;
31 private static String hexKey = "B5584A5D9B61C23BE52CA1168C9110894C4FE9ABC8E9F251";// 密钥
32
33 private void selectAlgorithm(int al) {
34 switch (al) {
35 default:
36 case 1:
37 this.p_Algorithm = "DES";
38 break;
39 case 2:
40 this.p_Algorithm = "DESede";
41 break;
42 case 3:
43 this.p_Algorithm = "Blowfish";
44 break;
45 }
46 }
47
48 /**
49 * 构造函数
50 *
51 * @param algorithm
52 * 加密算法类型,取值为1,2,3其中一个,对应为DES,DESede,Blowfish
53 * @throws Exception
54 */
55 public DES(int algorithm) throws Exception {
56 this.selectAlgorithm(algorithm);
57 Security.addProvider(new com.sun.crypto.provider.SunJCE());
58 this.p_Cipher = Cipher.getInstance(this.p_Algorithm);
59 }
60
61 @SuppressWarnings("unused")
62 private byte[] getKey() {
63 return this.checkKey().getEncoded();
64 }
65
66 private SecretKey checkKey() {
67 try {
68 if (this.p_Key == null) {
69 KeyGenerator keygen = KeyGenerator.getInstance(this.p_Algorithm);
70 /*
71 * SecureRandom sr = new SecureRandom(key.getBytes());
72 * keygen.init(168, sr);
73 */
74 this.p_Key = keygen.generateKey();
75 }
76 } catch (Exception nsae) {
77 }
78 return this.p_Key;
79 }
80
81 private void setKey(byte[] enckey) {
82 this.p_Key = new SecretKeySpec(enckey, this.p_Algorithm);
83 }
84
85 private byte[] encode(byte[] data) throws Exception {
86 this.p_Cipher.init(Cipher.ENCRYPT_MODE, this.checkKey());
87 return this.p_Cipher.doFinal(data);
88 }
89
90 private byte[] decode(byte[] encdata, byte[] enckey) throws Exception {
91 this.setKey(enckey);
92 this.p_Cipher.init(Cipher.DECRYPT_MODE, this.p_Key);
93 return this.p_Cipher.doFinal(encdata);
94 }
95
96 private String byte2hex(byte[] b) {
97 String hs = "";
98 String stmp = "";
99 for (int i = 0; i < b.length; i++) {
100 stmp = Integer.toHexString(b[i] & 0xFF);
101 if (stmp.length() == 1) {
102 hs += "0" + stmp;
103 } else {
104 hs += stmp;
105 }
106 }
107 return hs.toUpperCase();
108 }
109
110 private byte[] hex2byte(String hex) throws IllegalArgumentException {
111 if (hex.length() % 2 != 0) {
112 System.out.println("hex:" + hex + "\nlength:" + hex.length());
113 throw new IllegalArgumentException();
114 }
115 char[] arr = hex.toCharArray();
116 byte[] b = new byte[hex.length() / 2];
117 for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) {
118 String swap = "" + arr[i++] + arr[i];
119 int byteint = Integer.parseInt(swap, 16) & 0xFF;
120 b[j] = new Integer(byteint).byteValue();
121 }
122 return b;
123 }
124
125 /**
126 * 加密字符串
127 *
128 * @param s
129 * 待加密的字符串
130 * @return String 加密后的字符串
131 * @throws Exception
132 *
133 */
134 public static String encrypt(String s) throws Exception {
135 // byte[] key; //密钥文件(byte)
136 if (null == _instance) {
137 _instance = new DES(DES._DESede);
138 }
139 // key = _instance.getKey();
140 _instance.setKey(_instance.hex2byte(_instance.hexKey));
141 // String hexkey = _instance.byte2hex(key); //生成十六进制密钥
142 byte[] enc = _instance.encode(s.getBytes()); // 生成加密文件(byte)
143 String hexenc = _instance.byte2hex(enc);
144 return hexenc;
145 }
146
147 /**
148 * 解密字符串
149 *
150 * @param s
151 * 待解密的字符串
152 * @return String 解密后的字符串
153 * @throws Exception
154 *
155 *
156 */
157 public static String decrypt(String s) throws Exception {
158 if (null == _instance) {
159 _instance = new DES(DES._DESede);
160 }
161 return new String(_instance.decode(_instance.hex2byte(s), _instance.hex2byte(_instance.hexKey)));
162 }
163
164 public static void main(String[] args) throws Exception {
165 String pwd = "admin";
166 System.out.println(DES.encrypt(pwd));
167 }
168 }
4、RSA:公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
工具类代码如下:
1 import java.security.InvalidKeyException;
2 import java.security.KeyPair;
3 import java.security.KeyPairGenerator;
4 import java.security.NoSuchAlgorithmException;
5 import java.security.interfaces.RSAPrivateKey;
6 import java.security.interfaces.RSAPublicKey;
7 import javax.crypto.BadPaddingException;
8 import javax.crypto.Cipher;
9 import javax.crypto.IllegalBlockSizeException;
10 import javax.crypto.NoSuchPaddingException;
11 public class RSA {
12
13 /**
14 *
15 * @param publicKey
16 * @param srcBytes
17 * @return
18 * @throws NoSuchAlgorithmException
19 * @throws NoSuchPaddingException
20 * @throws InvalidKeyException
21 * @throws IllegalBlockSizeException
22 * @throws BadPaddingException
23 */
24 public static byte[] encrypt(RSAPublicKey publicKey,byte[] srcBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException{
25 if(publicKey!=null){
26 //Cipher负责完成加密或解密工作,基于RSA
27 Cipher cipher = Cipher.getInstance("RSA");
28 //根据公钥,对Cipher对象进行初始化
29 cipher.init(Cipher.ENCRYPT_MODE, publicKey);
30 byte[] resultBytes = cipher.doFinal(srcBytes);
31 return resultBytes;
32 }
33 return null;
34 }
35
36 /**
37 * 解密
38 * @param privateKey
39 * @param srcBytes
40 * @return
41 * @throws NoSuchAlgorithmException
42 * @throws NoSuchPaddingException
43 * @throws InvalidKeyException
44 * @throws IllegalBlockSizeException
45 * @throws BadPaddingException
46 */
47 public static byte[] decrypt(RSAPrivateKey privateKey,byte[] srcBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException{
48 if(privateKey!=null){
49 //Cipher负责完成加密或解密工作,基于RSA
50 Cipher cipher = Cipher.getInstance("RSA");
51 //根据公钥,对Cipher对象进行初始化
52 cipher.init(Cipher.DECRYPT_MODE, privateKey);
53 byte[] resultBytes = cipher.doFinal(srcBytes);
54 return resultBytes;
55 }
56 return null;
57 }
58
59 /**
60 *
61 * @return
62 * @throws NoSuchAlgorithmException
63 */
64 public static KeyPair getKeyPair() throws NoSuchAlgorithmException{
65 //KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
66 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
67 //初始化密钥对生成器,密钥大小为1024位
68 keyPairGen.initialize(1024);
69 //生成一个密钥对,保存在keyPair中
70 KeyPair keyPair = keyPairGen.generateKeyPair();
71 return keyPair;
72 }
73
74
75 /**
76 * @param args
77 * @throws NoSuchAlgorithmException
78 * @throws BadPaddingException
79 * @throws IllegalBlockSizeException
80 * @throws NoSuchPaddingException
81 * @throws InvalidKeyException
82 */
83 public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
84 String msg = "郭XX-精品相声";
85 KeyPair keyPair = getKeyPair();
86 //得到私钥
87 RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();
88 //得到公钥
89 RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic();
90
91 //用公钥加密
92 byte[] srcBytes = msg.getBytes();
93 byte[] resultBytes = encrypt(publicKey, srcBytes);
94
95 //用私钥解密
96 byte[] decBytes = decrypt(privateKey, resultBytes);
97
98 System.out.println("明文是:" + msg);
99 System.out.println("加密后是:" + new String(resultBytes));
100 System.out.println("解密后是:" + new String(decBytes));
101 }
102 }