首页 > 系统相关 >java AES加密、解密(兼容windows和linux)

java AES加密、解密(兼容windows和linux)

时间:2023-03-01 17:31:24浏览次数:48  
标签:AES 加密 String windows 解密 linux byte password

 

1.准备工作

  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 [email protected]
*/
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 hexString
* 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)_JAVAUTILS


作者:​​Marydon​​



标签:AES,加密,String,windows,解密,linux,byte,password
From: https://blog.51cto.com/u_15964717/6093956

相关文章

  • linux UEFI引导重新安装系统grub启动项
    系统无法启动,重新安装系统grubV80-20220613UEFI引导重新安装系统grub启动项挂载系统镜像iso,进入磁盘分区页面时,进行如下操作:ctlr+alt+F2cat/proc/partitionsfdis......
  • linux下查看磁盘分区的文件系统格式
    linux下查看磁盘分区的文件系统格式df-T只可以查看已经挂载的分区和文件系统类型。FilesystemType1K-blocksUsedAvailableUse%Mountedon/dev/sda1ext420642......
  • jmeter性能测试实例2解析--linux环境
    压测准备本地开发环境⽣成脚本,上传压测机器 (修改参数化文件路径、请求地址)内⽹环境,⾮GUI下压测停⽌其他⽆关资源进程压测机和被压测机器隔离(避免资源争夺:内存、CPU、......
  • jmeter性能测试实例2解析-Linux环境
    压测准备本地开发环境⽣成脚本,上传压测机器(修改参数化文件路径、请求地址)内⽹环境,⾮GUI下压测停⽌其他⽆关资源进程压测机和被压测机器隔离(避免资源争夺:内存、CPU、......
  • windows的发展史
    Windows一直是世界创新的舞台,成就全球企业及个人在数字时代的改变。在Windows上,许多用户第一次打开网页,写下人生第一封电子邮件,也初次体验了PC游戏的快感。它也是全球......
  • Linux下如何排查CPU及内存占用过多
    CPU使用top命令,然后按shift+p按照CPU排序,找到占用CPU过高的进程pid。使用top-H-ppid命令,找到进程中消耗资源最高的线程ppid。使用echo‘obase=16;ppid’|bc或者p......
  • Linux如何查看实时滚动日志
    Linux有多种方法可以查看实时滚动日志。最常用的方法是使用tail命令,它可以显示一个文件的最后几行,并且可以跟踪文件的变化。例如,你可以输入tail-f/var/log/syslog来查看......
  • linux基本功之date命令实战
    前言在日常工作中,我们经常会用到date命令来判断任务执行的时间,或者使用date命令去实现时间段内的工作任务,今天我们一起来探讨下date命令一、date简介date英[deɪt]日期,时......
  • linux的cgroups详解
    引子最近在研究k8s,学习到容器的一些知识。了解到docker的核心原理:利用linuxnamespace隔离资源;利用cgroups限制资源的使用;利用chroot改变进程的根目录到指定的目录;我来......
  • 在Linux下写一个简单的驱动程序
    本文首先描述了一个可以实际测试运行的驱动实例,然后由此去讨论Linux下驱动模板的要素,以及Linux上应用程序到驱动的执行过程。相信这样由浅入深、由具体实例到抽象理论......