在实际coding中会常常遇到往数据库存入密码时加密。URL传參时的加密。由此简单封装了下java中的AES加密算法。

0、import类

import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; import org.apache.axis.encoding.Base64; //非必须

1、加密接口

    /**
* 加密
* @param content 待加密内容
* @param password 加密密钥
* @return
*/
public static byte[] encrypt(String content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(byteContent);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

2、解密接口

    /**解密
* @param content 待解密内容
* @param password 解密密钥
* @return
*/
public static byte[] decrypt(byte[] content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

3、编解码函数(非必须)

    //编码函数
public static String encode(String content, String key) throws Exception {
byte[] encrypt = encrypt(content, key);
return Base64.encode(encrypt);
}
//解码函数
public static String decode(String encode, String key) throws Exception {
byte[] encrypt = Base64.decode(encode);
byte[] content = decrypt(encrypt, key);
return new String(content);
}

4、測试

    //0-正常使用
public static void main(String[] args) throws Exception{
String content = "holybin";
String password = "12345678"; System.out.println("加密前1:" + content);
byte[] encryptResult1 = encrypt(content, password); //普通加密
byte[] decryptResult1 = decrypt(encryptResult1,password); //普通解密
System.out.println("解密后1:" + new String(decryptResult1)); System.out.println("\n加密前2:" + content);
String encryptResult2 = encode(content, password); //先编码再加密
System.out.println("加密后2:" + encryptResult2);
String decryptResult2 = decode(encryptResult2, password); //先解码再解密
System.out.println("解密后2:" + decryptResult2);
}

结果例如以下:

5、问题与思考

(1)普通加密后将得到的byte数组直接转化为字符串用于输出,或者普通解密时从字符串转换为byte数组用于传參会发生什么?

    //1-先測试加密
public static void main(String[] args) throws Exception{
String content = "holybin";
String password = "12345678"; System.out.println("加密前1:" + content);
byte[] encryptResult1 = encrypt(content, password); //普通加密
System.out.println("加密后1:" + encryptResult1);
System.out.println("加密后1:" + new String(encryptResult1));
byte[] decryptResult1 = decrypt(encryptResult1,password); //普通解密
System.out.println("解密后1:" + new String(decryptResult1));
}

结果1:



这里将加密后的byte数组直接转化成String输出。出现乱码。

    //2-再測试解密
public static void main(String[] args) throws Exception{
String content = "holybin";
String password = "12345678"; System.out.println("加密前1:" + content);
byte[] encryptResult1 = encrypt(content, password); //普通加密
String strEncryptResult1 = new String(encryptResult1,"UTF-8");
//System.out.println("加密后1:" + strEncryptResult1);
byte[] decryptResult1 = decrypt(strEncryptResult1.getBytes("UTF-8"),password); //普通解密
System.out.println("解密后1:" + new String(decryptResult1));
}

结果2:

这里从加密后的String提取bytes数组用于解密,出现报错

原因:主要是由于加密后的byte数组是不能强制转换成字符串的,加密过的字符串也不能直接提取bytes数组用于解密,解决方法有两个:一是像上面測试的样例一样先加密再编码,或先解码再解密(參考:4、測试)。二是採用十六进制和二进制的相互转化函数(參考:以下的第(2)点)。

(2)十六进制和二进制相互转化函数

    // 二进制转十六进制
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();
} // 十六进制转二进制
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;
}

使用演示样例:

    // 3-測试转化函数
public static void main(String[] args) throws Exception {
String content = "holybin";
String password = "12345678";
//加密
System.out.println("加密前1:" + content);
byte[] encryptResult = encrypt(content, password); // 普通加密
String strEncryptResult = parseByte2HexStr(encryptResult);
System.out.println("加密后1:" + strEncryptResult);
//解密
byte[] byteDecryptResult = parseHexStr2Byte(strEncryptResult);
byte[] decryptResult = decrypt(byteDecryptResult, password); // 普通解密
System.out.println("解密后1:" + new String(decryptResult));
}

结果:

測试代码:EncrptDecrypt.java

java封装AES加密算法的更多相关文章

  1. PHP android ios相互兼容的AES加密算法

    APP项目用户密码传输一直没有用HTTPS,考虑到用户的隐私暂时先用AES对密码加密,以后也可以用于手机端与服务端加密交互. PHP的免费版phpAES项目,手机端解码各种不对. 好不容易找了PHP ...

  2. 【转】PHP android ios相互兼容的AES加密算法

    APP项目用户密码传输一直没有用HTTPS,考虑到用户的隐私暂时先用AES对密码加密,以后也可以用于手机端与服务端加密交互. PHP的免费版phpAES项目,手机端解码各种不对. 好不容易找了PHP ...

  3. 【java编程】加密算法-对称加密及AES加密算法

    转载:https://www.jianshu.com/p/3840b344b27c?utm_campaign=maleskine&utm_content=note&utm_medium ...

  4. AES 加密算法的原理详解

    AES 加密算法的原理详解 本教程摘选自 https://blog.csdn.net/qq_28205153/article/details/55798628 的原理部分. AES简介 高级加密标准( ...

  5. AES加密算法C++实现

    我从网上下载了一套AES加密算法的C++实现,代码如下: (1)aes.h #ifndef SRC_UTILS_AES_H #define SRC_UTILS_AES_H class AES { pu ...

  6. [Java 实现AES加密解密]

    今天同学请教我这个问题,被坑了次…… 实现的功能是2个Java类:一个读取源文件生成加密文件,另一个类读取加密文件来解密. 整个过程其实很简单,java有AES的工具包,设好秘钥,设好输入内容,就得到 ...

  7. Android AES加密算法及事实上现

    昨天老大叫我看看android加密算法.于是网上找了找,找到了AES加密算法.(当然还有MD5,BASE64什么的http://snowolf.iteye.com/blog/379860这篇文章列举了 ...

  8. JAVA实现AES的加密和解密算法

    原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import ja ...

  9. iOS,Android,.NET通用AES加密算法

    原文:iOS,Android,.NET通用AES加密算法 这两天为移动App开发API,结果实现加密验证时碰到一大坑.这里不得不吐槽下又臭又硬的iOS,Windows Server无法解密出正确的结果 ...

随机推荐

  1. 网络流模板(模板题:POJ1273)

    模板题:POJ1273 EK: #include <queue> #include <cstdio> #include <cstring> #include < ...

  2. 魅族和三星Galaxy 5.0webView 问题Android Crash Report - Native crash at /system/lib/libc.so caused by webvi

    解决办法是当前activity 销毁的时候 webView.destroy(); hine: ConnectedState (when=-2ms what= arg1=!CMD_RSSI_POLL : ...

  3. Spring boot -环境搭建 ,初步接触(1)

    1. Eclipse 创建 maven project  项目目录如下: 2. pom.xml  配置文件 <project xmlns="http://maven.apache.or ...

  4. js---通过代码学习

    1:本例演示 getElementsByTagName 方法. 2:本例演示 getElementsByTagName 方法 3:注意:

  5. 复习java基础第六天(IO)

    一:File 类 • 输入:读取外部数据(磁盘.光盘等存储设备的数据)到程序(内存)中.  • 输出:将程序(内存)数据输出到磁盘.光盘等存储设备中 • Java 的 IO 流主要包括输入.输出两种 ...

  6. SQL SERVER2012 安装

  7. 三维重建7:Visual SLAM算法笔记

    VSLAM研究了几十年,新的东西不是很多,三维重建的VSLAM方法可以用一篇文章总结一下. 此文是一个好的视觉SLAM综述,对视觉SLAM总结比较全面,是SLAM那本书的很好的补充.介绍了基于滤波器的 ...

  8. token session cookie

    token 登录握手与身份验证: cookie.session 记录会话状态 兼有 token的功能: cookie session 功能更强大. 所有这些都是为了便捷和密码安全考虑.

  9. Steal 偷天换日 题解(From luoguBlog)

    树形+背包 奇奇怪怪的dp. 考试的时候费了半天劲把题读完后思路基本正解, 然而也不知道为什么脑子鬼畜了一下打了个非递归建树? 而且链式前向星建边? 岔路口和藏品都搞成节点? 自己给自己找麻烦Orz. ...

  10. vmware Horizon 7 与远程桌面(mstsc)兼容性问题解决办法

    关于Horizon 7 Agent与远程桌面(mstsc)兼容性问题解决办法 在Horizon 7环境中,在桌面模板安装了Horizon Agent后,就无法直接通过微软的远程桌面(mstsc)工具连 ...