java aes128加密解密_java AES 128 位加密解密算法
最近在做app后台的服务器,使用到AES加密解密算法,无奈网上的都不符合要求,于是自己借鉴着写了一个AES加密解密工具。
密钥长度问题
默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误
Invalid AES key length
你需要下载一个支持更长密钥的包。这个包叫做 JavaCryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6,可以从这里下载,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
下载之后,解压后,可以看到其中包含两个包:
local_policy.jar
US_export_policy.jar
看一下你的 JRE 环境,将 JRE 环境中 lib\lib\security 中的同名包替换掉。
废话不多说,上代码
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
* 算法工具
* @author Babylon 214750838@qq.com
* @date 2014-8-15 上午8:41:49
*/
public class AlgorithmUtil {
public final static String ENCODING = "UTF-8";
/**将二进制转换成16进制
* @param buf
* @return
*/
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
/**将16进制转换为二进制
* @param hexStr
* @return
*/
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length()/2];
for (int i = 0;i< hexStr.length()/2; i++) {
int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
/**
* 生成密钥
* 自动生成base64 编码后的AES128位密钥
* @throws NoSuchAlgorithmException
* @throws UnsupportedEncodingException
*/
public static String getAESKey() throws Exception {
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(128);//要生成多少位,只需要修改这里即可128, 192或256
SecretKey sk = kg.generateKey();
byte[] b = sk.getEncoded();
return parseByte2HexStr(b);
}
/**
* AES 加密
* @param base64Key base64编码后的 AES key
* @param text 待加密的字符串
* @return 加密后的byte[] 数组
* @throws Exception
*/
public static byte[] getAESEncode(String base64Key, String text) throws Exception{
byte[] key = parseHexStr2Byte(base64Key);
SecretKeySpec sKeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, sKeySpec);
byte[] bjiamihou = cipher.doFinal(text.getBytes(ENCODING));
return bjiamihou;
}
/**
* AES解密
* @param base64Key base64编码后的 AES key
* @param text 待解密的字符串
* @return 解密后的byte[] 数组
* @throws Exception
*/
public static byte[] getAESDecode(String base64Key, byte[] text) throws Exception{
byte[] key = parseHexStr2Byte(base64Key);
SecretKeySpec sKeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, sKeySpec);
byte[] bjiemihou = cipher.doFinal(text);
return bjiemihou;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
1011
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import com.util.AlgorithmUtil;
/**
* 算法测试
*
* @author babylon
* 2016年5月16日
*/
public class AlgorithmTest {
public static void main(String[] args) {
try {
String hexKey = new AlgorithmUtil().getAESKey();
System.out.println("16进制秘钥:"+hexKey);
byte[] encoded = AlgorithmUtil.getAESEncode(hexKey, "我要把你嘿嘿嘿");
// 注意,这里的encoded是不能强转成string类型字符串的
byte[] decoded = AlgorithmUtil.getAESDecode(hexKey, encoded);
System.out.println(new String(decoded, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
261
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
java aes128加密解密_java AES 128 位加密解密算法相关推荐
- php aes 128位加密,php实现AES 128位加密的相关操作技巧分享
php实现AES 128位加密的相关操作技巧是什么?这篇文章主要介绍了PHP实现的AES 128位加密算法,结合实例形式分析了AES 128位加密的相关概念.原理及php实现AES 128位加密的相关 ...
- AES 128位CBC加密解密(不使用固定IV)
安全检查时要求账号和密码加密后才能存到数据库中,要求加密算法如下: 1)分组密码算法:AES(密钥长度在128位及以上)(GCM或CBC模式) 2)流密码算法:AES(密钥长度在128位及以上)(OF ...
- Go Nodejs Java Aes 128 ECB加密解密结果保持一致
在多语言的生产环境下,常常是由一种语言进行加密而由另一种语言来进行解密,因此有必要保持各种语言之间加密解密算法的一致性.下面列出了Go,Nodejs,Java 的 Aes-128-Ecb的加密解密算法 ...
- [译] 最佳安全实践:在 Java 和 Android 中使用 AES 进行对称加密
原文地址:Security Best Practices: Symmetric Encryption with AES in Java and Android 最佳安全实践:在 Java 和 Andr ...
- SSL证书中的128位加密和256位加密有何区别?
大家在申请SSL证书的时候最先关注的应该是价格问题,其次才是品牌.类型.服务等等,对于SSL加密估计很少有朋友会去仔细查看或者辨别.下面就带大家来了解一下SSL证书中的128位加密和256位加密的区别 ...
- 128位加密SSL证书
SGC超真SSL(SGC ZhenSSL)属于 SGC Enabled High Assurance SSL, 是 WoSign 的增强型 SSL证书产品,支持 SGC 强制128位加密技术,即使用户 ...
- java des加密解密_Java实现的DES加密解密工具类实例
本文实例讲述了Java实现的DES加密解密工具类.分享给大家供大家参考,具体如下: 一个工具类,很常用,不做深入研究了,那来可直接用 DesUtil.java package lsy; import ...
- 使用openssl进行AES 128 CTR 加密、解密
参考文章 https://blog.csdn.net/yasi_xi/article/details/13997337 对称加密如非对称加密 AES128-CTR方式,属于对称加密的一种. 这里有一篇 ...
- (SGC强制最低128位加密,公钥支持ECC加密算法的SSL证书)
Pro SSL证书,验证企业域名所有权和企业身份信息,采用SGC(服务器门控)技术强制128位以上至256位加密,属于企业OV验证级专业版(Pro) SSL证书:即使用户使用低版本浏览器(比如浏览 ...
最新文章
- linux C 多线程编程
- 可长点心吧-sort
- JAVA通信编程(五)——串口通讯的补充说明
- SpringBootAdmin安全配置
- python字典的应用实验报告_Python字典应用的一个例子
- react native开发的新闻客户端
- 云计算示范项目_上海市经济和信息化委员会关于征集2020年上海市云计算应用示范项目的通知...
- 记录——《C Primer Plus (第五版)》第九章编程练习第六题
- makefile懒人版(单个文件编译)
- Android集成百度地图
- 测试操作数据库mysql数据库吗_软件测试-MySQL(六:数据库函数)
- Cisco Equipment Configuration SSH login
- java生成word带多级标题,word自动生成多级标题的方法
- 程序员思维训练500题(附带答案)
- 网页游戏用的什么编程语言
- c++使用librdkafka kerberos认证
- Android手游辅助开发从入门到精通
- 解决word2016复制粘贴后一直未响应
- CPU工作方式、多核心、超线程技术详解[转贴]
- 了解arXiv,及arXiv的注册详细操作。
热门文章
- Linux删除swapfile
- os安全漏洞手动修复方案
- PDF文档转TXT怎么转?你不知道的几种方法
- 5G和WIFI6,还傻傻的分不清吗?(3)-ielab
- 拜占庭将军问题与区块链共识算法PBFT
- C#已知三点求圆方程算法
- 九月5G你选谁?瀑布屏外加透明全景屏来袭,OPPO5G手机配置大曝光
- TIA Portal V16.0(博途/博图)安装教程(TIA Step7TIA WinCC Professional)
- 家庭自动炒菜机设计(论文+CAD图纸+SolidWorks三维+ppt+驱动控制子程序)
- 广州的海运集装箱码头分布