java AES加密、解密

CreationTime--2018年7月14日10点06分

Author:Marydon

1.准备工作

  updateTime--2018年8月10日15点28分

  updateTime--2018年10月24日10点46分

import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.log4j.Logger;
import dzkjk.web.tools.ByteUtils; /**
* AES加密算法工具类
* @explain 可逆算法:加密、解密
* AES/ECB/PKCS5Padding
* @author Marydon
* @creationTime 2018年7月7日下午2:17:43
* @version 3.0
* @since 2.0
* @email marydon20170307@163.com
*/
public class AESUtils { private static Logger log = Logger.getLogger(AESUtils.class);
// 定义字符集
private static final String ENCODING = "UTF-8"; /**
* 根据提供的密钥生成AES专用密钥
* @explain
* @param password
* 可以是中文、英文、16进制字符串
* @return AES密钥
* @throws Exception
*/
public static byte[] generateKey(String password) throws Exception {
byte[] keyByteArray = null;
// 创建AES的Key生产者
KeyGenerator kgen = KeyGenerator.getInstance("AES");
// 利用用户密码作为随机数初始化
// 128位的key生产者
// 加密没关系,SecureRandom是生成安全随机数序列,password.getBytes()是种子,只要种子相同,序列就一样,所以解密只要有password就行
/*
* 只适用windows
* kgen.init(128, new SecureRandom(password.getBytes(ENCODING)));
*/ // 指定强随机数的生成方式
// 兼容linux
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(password.getBytes(ENCODING));
kgen.init(128, random);// 只能是128位 // 根据用户密码,生成一个密钥
SecretKey secretKey = kgen.generateKey();
// 返回基本编码格式的密钥,如果此密钥不支持编码,则返回null。
keyByteArray = secretKey.getEncoded();
return keyByteArray;
}
}   

2.AES加密

/**
* AES加密字符串
* @param content
* 需要被加密的字符串
* @param password
* 加密需要的密码
* @return 16进制的密文(密文的长度随着待加密字符串的长度变化而变化,至少32位)
*/
public static String encrypt(String content, String password) {
String cipherHexString = "";// 返回字符串
try {
// 转换为AES专用密钥
byte[] keyBytes = generateKey(password); SecretKeySpec sks = new SecretKeySpec(keyBytes, "AES");
// 将待加密字符串转二进制
byte[] clearTextBytes = content.getBytes(ENCODING);
// 创建密码器
Cipher cipher = Cipher.getInstance("AES");
// 初始化为加密模式的密码器
cipher.init(Cipher.ENCRYPT_MODE, sks);
// 加密结果
byte[] cipherTextBytes = cipher.doFinal(clearTextBytes);
// byte[]-->hexString
cipherHexString = ByteUtils.toHexString(cipherTextBytes);
} catch (Exception e) {
e.printStackTrace();
log.error("AES加密失败:" + e.getMessage());
}
log.info("AES加密结果:" + cipherHexString);
return cipherHexString;
}

3.AES解密

/**
* 解密AES加密过的字符串
* @param content
* 16进制密文
* @param password
* 加密时的密码
* @return 明文
*/
public static String decrypt(String hexString, String password) {
String clearText = "";
try {
// 转换为AES专用密钥
byte[] keyBytes = generateKey(password); SecretKeySpec sks = new SecretKeySpec(keyBytes, "AES");
// 创建密码器
Cipher cipher = Cipher.getInstance("AES");
// 初始化为解密模式的密码器
cipher.init(Cipher.DECRYPT_MODE, sks);
// hexString-->byte[]
// 将16进制密文转换成二进制
byte[] cipherTextBytes = ByteUtils.fromHexString(hexString);
// 解密结果
byte[] clearTextBytes = cipher.doFinal(cipherTextBytes);
// byte[]-->String
clearText = new String(clearTextBytes, ENCODING);
} catch (Exception e) {
e.printStackTrace();
log.error("AES解密失败:" + e.getMessage());
}
log.info("AES解密结果:" + clearText);
return clearText;
}

4.测试

public static void main(String[] args) {
String json = "{\"name\":\"Marydon\",\"website\":\"http://www.cnblogs.com/Marydon20170307\"}";
String password = "测试";
// 加密
String encrypt = encrypt(json, password);
// 解密
String decrypt = decrypt(encrypt, password);
}

 

 

java AES加密、解密(兼容windows和linux)的更多相关文章

  1. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  2. C# 实现 JAVA AES加密解密[原创]

    以下是网上普遍能收到的JAVA AES加密解密方法. 因为里面用到了KeyGenerator 和 SecureRandom,但是.NET 里面没有这2个类.无法使用安全随机数生成KEY. 我们在接收J ...

  3. Java AES加密解密工具 -- GUI 、在线传输文件

    原理 对于任意长度的明文,AES首先对其进行分组,每组的长度为128位.分组之后将分别对每个128位的明文分组进行加密. 对于每个128位长度的明文分组的加密过程如下:     (1)将128位AES ...

  4. C#与Java AES 加密解密

    参考文档:https://www.cnblogs.com/xbzhu/p/7064642.html 前几天对接Java接口,需要C#加密参数,Java解密.奈何网上找了一堆大同小异的加解密方法都跟Ja ...

  5. JAVA AES加密解密

    import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java ...

  6. java AES 加密解密工具(Advanced Encryption Standard)发现明文相同但每次重启服务后密文就会不同于是有了改进

    1.通用方法 package com.qlkj.hzd.commom.utils; import javax.crypto.*; import java.io.UnsupportedEncodingE ...

  7. Java实现AES加密(window机器和linux机器) 注意window机器 和linux机器算法稍有不同

    一)什么是AES? 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用. ...

  8. paip兼容windows与linux的java类根目录路径的方法

    paip兼容windows与linux的java类根目录路径的方法 1.只有 pathx.class.getResource("")或者pathx.class.getResourc ...

  9. C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

随机推荐

  1. Leetcode刷题记录:编码并解码短网址

    题目要求 编写一个类,提供两个方法.一个可以将普通的网址编码成短网址,一个可以将短网址还原为普通网址. 参考题解 # 使用随机函数,生成短网址,保存在dict中,避免重复 import random ...

  2. cat、tac、rev、nl命令

    当日志文件log.log很长,但又要按内容从后往前查看时,可以使用如下命令: tac log.log | more cat     由第一行开始显示内容,并将所有内容输出    tac     从最后 ...

  3. 相关性系数及其python实现

    参考文献: 1.python 皮尔森相关系数 https://www.cnblogs.com/lxnz/p/7098954.html 2.统计学之三大相关性系数(pearson.spearman.ke ...

  4. Windows平台Mysql使表名区分大小写

    my.ini 里面的mysqld部分   加入 lower_case_table_names=2 [mysqld] lower_case_table_names=2 port= 3306   注: 1 ...

  5. codevs 2190 有理逼近

    2190 有理逼近  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold   题目描述 Description 对于一个素数P,我们可以用一系列有理分数(分子.分母都是 ...

  6. go语言之进阶篇普通变量的方法集

    1.普通变量的方法集 示例: package main import "fmt" type Person struct { name string //名字 sex byte // ...

  7. 如何: 重命名在 IIS 6.0 中的虚拟目录

    警告如果错误地为编辑元数据库,您会导致严重的问题,甚至可能需要重新安装使用元数据库的任何产品. Microsoft 不能保证可以解决问题,如果您错误地编辑元数据库产生.编辑元数据库需要您自担风险. 注 ...

  8. Flask Restful服务简单实现

    官网:http://flask.pocoo.org/docs/1.0/quickstart/#routing 1.安装 windows下:pip3 install Flask 具体参照:windows ...

  9. Android -- DecorView

    DecorView 开发中,通常都是在onCreate()中调用setContentView(R.layout.custom_layout)来实现想要的页面布局.页面都是依附在窗口之上的,而Decor ...

  10. Centos下安装apahce的configure: error: APR not found. Please read the documentation解决办法

    今天从Apache官网上http://httpd.apache.org/下载httpd web服务器,由于我的虚拟机上之前安装过,我先yum remove httpd进行卸载,然后重新安装.我采用的是 ...