1
package
org.acooly.studio.encrypt;
2
3 import java.security.Key;
4
5 import javax.crypto.Cipher;
6 import javax.crypto.KeyGenerator;
7 import javax.crypto.SecretKey;
8 import javax.crypto.spec.IvParameterSpec;
9 import javax.crypto.spec.SecretKeySpec;
10
11 import org.apache.commons.logging.Log;
12 import org.apache.commons.logging.LogFactory;
13
14 /**
15 * 对称加密JAVA算法演示(JAVA-SUN API实现)
16 *
17 *
18 * @author pu.zhang
19 *
20 */
21 public class SymmetricEncryption {
22
23 private Log logger = LogFactory.getLog(SymmetricEncryption. class );
24
25 public static void main(String[] args) throws Exception {
26
27 SymmetricEncryption symmetricEncryption = new SymmetricEncryption();
28
29 // DES
30 symmetricEncryption.DESEncryption();
31 // 3DES
32 symmetricEncryption.tripleDESEncryption();
33
34 }
35
36 /**
37 * DES加/解密演示
38 *
39 * @throws Exception
40 */
41 void DESEncryption() throws Exception {
42
43 // 明文
44 byte [] plainText = " I am plain text! " .getBytes();
45
46 logger.info( " 明文: " + formatedHexString(plainText));
47 // 通过KeyGenerator形成一个key
48 KeyGenerator keyGenerator = KeyGenerator.getInstance( " DES " );
49 Key key = keyGenerator.generateKey();
50 logger.info( " KEY: " + formatedHexString(key.getEncoded()));
51
52 // 获得一个私钥加密类Cipher,CBC是加密方式,PKCS5Padding是填充方法
53 // CBC加密方式:把明文分为左右两部分LP和RP
54 String transformation = " DES/CBC/PKCS5Padding " ; // algorithm/mode/padding
55 Cipher cipher = Cipher.getInstance(transformation);
56
57 // CBC方式的初始化向量
58 byte [] iv = " iamaniv. " .getBytes();
59 IvParameterSpec ivparam = new IvParameterSpec(iv);
60 // 加密
61 cipher.init(Cipher.ENCRYPT_MODE, key, ivparam);
62 byte [] cipherText = cipher.doFinal(plainText);
63 logger.info( " 加密后密文: " + formatedHexString(cipherText));
64
65 // 解密
66
67 cipher.init(Cipher.DECRYPT_MODE, key, ivparam);
68 byte [] newPlainText = cipher.doFinal(cipherText);
69 logger.info( " 解密后明文: " + formatedHexString(newPlainText));
70 }
71
72 /**
73 * DES加/解密演示
74 *
75 * @throws Exception
76 */
77 void tripleDESEncryption() throws Exception {
78 // 24字节密钥key,3倍DES密钥长度
79 byte [] tripleKey = " 123456789012345678901234 " .getBytes();
80 logger.info( " tripleKey: " + formatedHexString(tripleKey));
81 // 明文
82 byte [] plainText = " I am plain text! " .getBytes();
83 logger.info( " 初始的明文: " + formatedHexString(plainText));
84
85 // 算法
86 String algorithm = " DESede " ;
87
88 // 生成密钥
89 SecretKey secretKey = new SecretKeySpec(tripleKey, algorithm);
90
91 String transformation = " DESede/CBC/PKCS5Padding " ;
92 Cipher cipher = Cipher.getInstance(transformation);
93 // CBC方式的初始化向量
94 byte [] iv = " iamaniv. " .getBytes();
95 IvParameterSpec ivparam = new IvParameterSpec(iv);
96
97 // 加密
98 cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivparam);
99 byte [] encriptText = cipher.doFinal(plainText);
100 logger.info( " 加密的密文: " + formatedHexString(encriptText));
101
102 // 解密码
103 cipher.init(Cipher.DECRYPT_MODE, secretKey, ivparam);
104 byte [] newPlainText = cipher.doFinal(encriptText);
105 logger.info( " 解密的明文: " + formatedHexString(newPlainText));
106 }
107
108
109 /**
110 * 转换byte数组为16进制的字符串显示方式
111 * @param b
112 * @return
113 */
114 String formatedHexString( byte [] b) {
115 String hs = "" ;
116 String stmp = "" ;
117
118 for ( int n = 0 ; n < b.length; n ++ ) {
119 stmp = (java.lang.Integer.toHexString(b[n] & 0XFF ));
120 if (stmp.length() == 1 )
121 hs = hs + " 0 " + stmp;
122 else
123 hs = hs + stmp;
124 if (n < b.length - 1 )
125 hs = hs + " " ;
126 }
127 return hs.toUpperCase();
128 }
129
130 }
131
2
3 import java.security.Key;
4
5 import javax.crypto.Cipher;
6 import javax.crypto.KeyGenerator;
7 import javax.crypto.SecretKey;
8 import javax.crypto.spec.IvParameterSpec;
9 import javax.crypto.spec.SecretKeySpec;
10
11 import org.apache.commons.logging.Log;
12 import org.apache.commons.logging.LogFactory;
13
14 /**
15 * 对称加密JAVA算法演示(JAVA-SUN API实现)
16 *
17 *
18 * @author pu.zhang
19 *
20 */
21 public class SymmetricEncryption {
22
23 private Log logger = LogFactory.getLog(SymmetricEncryption. class );
24
25 public static void main(String[] args) throws Exception {
26
27 SymmetricEncryption symmetricEncryption = new SymmetricEncryption();
28
29 // DES
30 symmetricEncryption.DESEncryption();
31 // 3DES
32 symmetricEncryption.tripleDESEncryption();
33
34 }
35
36 /**
37 * DES加/解密演示
38 *
39 * @throws Exception
40 */
41 void DESEncryption() throws Exception {
42
43 // 明文
44 byte [] plainText = " I am plain text! " .getBytes();
45
46 logger.info( " 明文: " + formatedHexString(plainText));
47 // 通过KeyGenerator形成一个key
48 KeyGenerator keyGenerator = KeyGenerator.getInstance( " DES " );
49 Key key = keyGenerator.generateKey();
50 logger.info( " KEY: " + formatedHexString(key.getEncoded()));
51
52 // 获得一个私钥加密类Cipher,CBC是加密方式,PKCS5Padding是填充方法
53 // CBC加密方式:把明文分为左右两部分LP和RP
54 String transformation = " DES/CBC/PKCS5Padding " ; // algorithm/mode/padding
55 Cipher cipher = Cipher.getInstance(transformation);
56
57 // CBC方式的初始化向量
58 byte [] iv = " iamaniv. " .getBytes();
59 IvParameterSpec ivparam = new IvParameterSpec(iv);
60 // 加密
61 cipher.init(Cipher.ENCRYPT_MODE, key, ivparam);
62 byte [] cipherText = cipher.doFinal(plainText);
63 logger.info( " 加密后密文: " + formatedHexString(cipherText));
64
65 // 解密
66
67 cipher.init(Cipher.DECRYPT_MODE, key, ivparam);
68 byte [] newPlainText = cipher.doFinal(cipherText);
69 logger.info( " 解密后明文: " + formatedHexString(newPlainText));
70 }
71
72 /**
73 * DES加/解密演示
74 *
75 * @throws Exception
76 */
77 void tripleDESEncryption() throws Exception {
78 // 24字节密钥key,3倍DES密钥长度
79 byte [] tripleKey = " 123456789012345678901234 " .getBytes();
80 logger.info( " tripleKey: " + formatedHexString(tripleKey));
81 // 明文
82 byte [] plainText = " I am plain text! " .getBytes();
83 logger.info( " 初始的明文: " + formatedHexString(plainText));
84
85 // 算法
86 String algorithm = " DESede " ;
87
88 // 生成密钥
89 SecretKey secretKey = new SecretKeySpec(tripleKey, algorithm);
90
91 String transformation = " DESede/CBC/PKCS5Padding " ;
92 Cipher cipher = Cipher.getInstance(transformation);
93 // CBC方式的初始化向量
94 byte [] iv = " iamaniv. " .getBytes();
95 IvParameterSpec ivparam = new IvParameterSpec(iv);
96
97 // 加密
98 cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivparam);
99 byte [] encriptText = cipher.doFinal(plainText);
100 logger.info( " 加密的密文: " + formatedHexString(encriptText));
101
102 // 解密码
103 cipher.init(Cipher.DECRYPT_MODE, secretKey, ivparam);
104 byte [] newPlainText = cipher.doFinal(encriptText);
105 logger.info( " 解密的明文: " + formatedHexString(newPlainText));
106 }
107
108
109 /**
110 * 转换byte数组为16进制的字符串显示方式
111 * @param b
112 * @return
113 */
114 String formatedHexString( byte [] b) {
115 String hs = "" ;
116 String stmp = "" ;
117
118 for ( int n = 0 ; n < b.length; n ++ ) {
119 stmp = (java.lang.Integer.toHexString(b[n] & 0XFF ));
120 if (stmp.length() == 1 )
121 hs = hs + " 0 " + stmp;
122 else
123 hs = hs + stmp;
124 if (n < b.length - 1 )
125 hs = hs + " " ;
126 }
127 return hs.toUpperCase();
128 }
129
130 }
131