请看代码。

  1 package jdbc.pro.lin;
2
3 import java.security.InvalidAlgorithmParameterException;
4 import java.security.InvalidKeyException;
5 import java.security.NoSuchAlgorithmException;
6
7 import javax.crypto.BadPaddingException;
8 import javax.crypto.Cipher;
9 import javax.crypto.IllegalBlockSizeException;
10 import javax.crypto.KeyGenerator;
11 import javax.crypto.NoSuchPaddingException;
12 import javax.crypto.SecretKey;
13 import javax.crypto.spec.IvParameterSpec;
14 import javax.crypto.spec.SecretKeySpec;
15
16 import org.apache.commons.codec.binary.Base64;
17
18 public class MyAES {
19 /**
20 * 注意key和加密用到的字符串是不一样的 加密还要指定填充的加密模式和填充模式 AES密钥可以是128或者256,加密模式包括ECB, CBC等
21 * ECB模式是分组的模式,CBC是分块加密后,每块与前一块的加密结果异或后再加密 第一块加密的明文是与IV变量进行异或
22 */
23 public static final String KEY_ALGORITHM = "AES";
24 public static final String ECB_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
25 public static final String CBC_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
26 public static final String PLAIN_TEXT = "MANUTD is the greatest club in the world";
27
28 /**
29 * IV(Initialization Value)是一个初始值,对于CBC模式来说,它必须是随机选取并且需要保密的
30 * 而且它的长度和密码分组相同(比如:对于AES 128为128位,即长度为16的byte类型数组)
31 *
32 */
33 public static final byte[] IVPARAMETERS = new byte[] { 1, 2, 3, 4, 5, 6, 7,
34 8, 9, 10, 11, 12, 13, 14, 15, 16 };
35
36 public static void main(String[] arg) {
37 byte[] secretBytes = generateAESSecretKey();
38 SecretKey key = restoreSecretKey(secretBytes);
39 byte[] encodedText = AesEcbEncode(PLAIN_TEXT.getBytes(), key);
40
41 System.out.println("AES ECB encoded with Base64: " + Base64.encodeBase64String(encodedText));
42 System.out.println("AES ECB decoded: "
43 + AesEcbDecode(encodedText, key));
44
45
46
47 encodedText = AesCbcEncode(PLAIN_TEXT.getBytes(), key, IVPARAMETERS);
48
49
50 System.out.println("AES CBC encoded with Base64: " + Base64.encodeBase64String(encodedText));
51 System.out.println("AES CBC decoded: "
52 + AesCbcDecode(encodedText, key,
53 IVPARAMETERS));
54 }
55
56 /**
57 * 使用ECB模式进行加密。 加密过程三步走: 1. 传入算法,实例化一个加解密器 2. 传入加密模式和密钥,初始化一个加密器 3.
58 * 调用doFinal方法加密
59 *
60 * @param plainText
61 * @return
62 */
63 public static byte[] AesEcbEncode(byte[] plainText, SecretKey key) {
64
65 try {
66
67 Cipher cipher = Cipher.getInstance(ECB_CIPHER_ALGORITHM);
68 cipher.init(Cipher.ENCRYPT_MODE, key);
69 return cipher.doFinal(plainText);
70 } catch (NoSuchAlgorithmException | NoSuchPaddingException
71 | InvalidKeyException | IllegalBlockSizeException
72 | BadPaddingException e) {
73 // TODO Auto-generated catch block
74 e.printStackTrace();
75 }
76 return null;
77 }
78
79 /**
80 * 使用ECB解密,三步走,不说了
81 *
82 * @param decodedText
83 * @param key
84 * @return
85 */
86 public static String AesEcbDecode(byte[] decodedText, SecretKey key) {
87 try {
88 Cipher cipher = Cipher.getInstance(ECB_CIPHER_ALGORITHM);
89 cipher.init(Cipher.DECRYPT_MODE, key);
90 return new String(cipher.doFinal(decodedText));
91 } catch (NoSuchAlgorithmException | NoSuchPaddingException
92 | InvalidKeyException | IllegalBlockSizeException
93 | BadPaddingException e) {
94 // TODO Auto-generated catch block
95 e.printStackTrace();
96 }
97 return null;
98
99 }
100
101 /**
102 * CBC加密,三步走,只是在初始化时加了一个初始变量
103 *
104 * @param plainText
105 * @param key
106 * @param IVParameter
107 * @return
108 */
109 public static byte[] AesCbcEncode(byte[] plainText, SecretKey key,
110 byte[] IVParameter) {
111 try {
112 IvParameterSpec ivParameterSpec = new IvParameterSpec(IVParameter);
113
114 Cipher cipher = Cipher.getInstance(CBC_CIPHER_ALGORITHM);
115 cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec);
116 return cipher.doFinal(plainText);
117
118 } catch (NoSuchAlgorithmException | NoSuchPaddingException
119 | InvalidKeyException | InvalidAlgorithmParameterException
120 | IllegalBlockSizeException | BadPaddingException e) {
121 // TODO Auto-generated catch block
122 e.printStackTrace();
123 }
124 return null;
125 }
126
127 /**
128 * CBC 解密
129 *
130 * @param decodedText
131 * @param key
132 * @param IVParameter
133 * @return
134 */
135 public static String AesCbcDecode(byte[] decodedText, SecretKey key,
136 byte[] IVParameter) {
137 IvParameterSpec ivParameterSpec = new IvParameterSpec(IVParameter);
138
139 try {
140 Cipher cipher = Cipher.getInstance(CBC_CIPHER_ALGORITHM);
141 cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec);
142 return new String(cipher.doFinal(decodedText));
143 } catch (NoSuchAlgorithmException | NoSuchPaddingException
144 | InvalidKeyException | InvalidAlgorithmParameterException
145 | IllegalBlockSizeException | BadPaddingException e) {
146 // TODO Auto-generated catch block
147 e.printStackTrace();
148 }
149
150 return null;
151
152 }
153
154 /**
155 * 1.创建一个KeyGenerator 2.调用KeyGenerator.generateKey方法
156 * 由于某些原因,这里只能是128,如果设置为256会报异常,原因在下面文字说明
157 *
158 * @return
159 */
160 public static byte[] generateAESSecretKey() {
161 KeyGenerator keyGenerator;
162 try {
163 keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
164 // keyGenerator.init(256);
165 return keyGenerator.generateKey().getEncoded();
166 } catch (NoSuchAlgorithmException e) {
167 // TODO Auto-generated catch block
168 e.printStackTrace();
169 }
170 return null;
171 }
172
173 /**
174 * 还原密钥
175 *
176 * @param secretBytes
177 * @return
178 */
179 public static SecretKey restoreSecretKey(byte[] secretBytes) {
180 SecretKey secretKey = new SecretKeySpec(secretBytes, KEY_ALGORITHM);
181 return secretKey;
182 }
183 }

因为某些国家的进口管制限制,Java发布的运行环境包中的加解密有一定的限制。比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件。

 
 官方网站提供了JCE无限制权限策略文件的下载:

JDK6的下载地址:
  http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

JDK7的下载地址:
  http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。

如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security下覆盖原来文件,记得先备份。

如果安装了JDK,将两个jar文件也放到%JDK_HOME%\jre\lib\security下。

 
PS:我也没试过,不行别找我。
 
KeyFactory最常用的操作就是通过密钥规范获得对应的密钥。像DES 3DES都是通过这样获得的,而AES只要一般的密钥规范就可以了,因此不需要KeyFactory.
原:http://www.cnblogs.com/SirSmith/p/4987064.html
 

JDK自带方法实现AES对称加密的更多相关文章

  1. JDK自带方法实现RSA非对称加密

    package jdbc.pro.lin; import java.security.InvalidKeyException; import java.security.Key; import jav ...

  2. 正确使用AES对称加密

    正确使用AES对称加密 经常我看到项目中有人使用了对称加密算法,用来加密客户或项目传输中的部分数据.但我注意到开发 人员由于不熟悉原理,或者简单复制网上的代码示例,有导致代码存在安全风险. 我经常遇到 ...

  3. AES对称加密和解密

    package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...

  4. AES对称加密

    import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.Secre ...

  5. java的AES对称加密和解密,有偏移量

    import java.math.BigDecimal; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; i ...

  6. AES对称加密和解密(转)

    AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...

  7. JAVA中AES对称加密和解密

    AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...

  8. AES对称加密解密类

    import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...

  9. JDK自带方法实现消息摘要运算

    啊,有点小注释,懒得介绍了,就贴个代码吧,大意理解就可以了. package jdbc.pro.lin; import java.security.InvalidKeyException; impor ...

随机推荐

  1. Hadoop实战第一篇

    前言:  都说现在是草根为尊的时代,近年来hadoop及spark技术在国内越来越流行.而且渐渐现成为企业的新宠.在DT时代全面来临之前,能提早接触大数据的技术必然能先人一步.本文作为Hadoop系列 ...

  2. 随机验证码生成(python实现)

    需求:生成随机不重复验证码. 代码: #!/usr/bin/env python # encoding: utf-8 """ @author: 侠之大者kamil @fi ...

  3. dede的安装和配置

    dede的cms通常是,dede作为后台,前台可以自己换一套模版(后台貌似也跟着换掉,或者不换) 安装时候会检查目录读写权限,以及数据库配置 安装后,还需要登录到后台: 配置网站根网址 清除缓存 数据 ...

  4. 一次愚蠢的NOIP模拟赛

    找礼物[find.pas/find.c/find.cpp] [问题描述] 新年到了,突然间,就在那美丽的一霎那,你好友和你(K个人)的周围满是礼物,你发扬你帅气的风格,让你的好友先拿,但是每个人只能拿 ...

  5. cmd 利用IE打开网页

    "C:\Program Files\Internet Explorer\iexplore.exe" "http://dmsite.chinacloudsites.cn/r ...

  6. C# .NET 使用第三方类库DotNetZip解压/压缩Zip文件

    dotNetZip on CodePlex: http://dotnetzip.codeplex.com/ 详细的可以看源代码……总之感觉比SharpZipLib好用.而且DotNetZip支持VB, ...

  7. 禁止apache显示目录索引的常见方法(apache禁止列目录)

    禁止Apache显示目录索引,禁止Apache显示目录结构列表,禁止Apache浏览目录,这是网上提问比较多的,其实都是一个意思.下面说下禁止禁止Apache显示目录索引的常见的3种方法. 要实现禁止 ...

  8. iOS 采用个推时,未收到推送消息,测试DeviceToken无效

    一般在调试时我们使用任何boundleID,即为*的profile文件 但在使用推送后进行调试,除了创建和上传APN证书,还需要重新生成 (1)特定程序的BoundleID (2)包含Push Not ...

  9. Java过滤器与SpringMVC拦截器之间的关系与区别

    今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了不少的东西,以前一直以为拦截器就是过滤器实现的,现在想想还真是一种错误啊,而且看的比较粗浅,没有一个全局而又细致的认识,由于已至深 ...

  10. 加州大学伯克利分校Stat2.2x Probability 概率初步学习笔记: Section 5 The accuracy of simple random samples

    Stat2.2x Probability(概率)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...