`
s_jiangwei2011
  • 浏览: 19167 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java实现AES对称加密算法

    博客分类:
  • Java
阅读更多

详见代码中注释:

package com.support;

import java.io.UnsupportedEncodingException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.lang.StringUtils;

/**
 * AES对称加密
 * 
 * @author Sun Jiangwei
 * 
 */
public class AESEncryptor {
	/** 算法名称 */
	private static final String KEY_ALGORITHM = "AES";
	/** 算法名称/加密模式/填充方式 */
	private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";

	/** UC的密钥 */
	public static final String KEY_FOR_UC = "dw2e3F30E7BA8@3C";

	/**
	 * 生成随机密钥<br/>
	 * 安全性较高,但密钥需要保存
	 * 
	 * @param key
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws UnsupportedEncodingException
	 */
	@Deprecated
	public static Key toRandomKey(String key) throws NoSuchAlgorithmException, UnsupportedEncodingException {
		// 返回生成指定算法的秘密密钥的 KeyGenerator对象
		KeyGenerator kgen = KeyGenerator.getInstance(KEY_ALGORITHM);
		// 初始化此密钥生成器,使其具有确定的密钥大小(AES 要求密钥长度为 128)
		kgen.init(128, new SecureRandom(key.getBytes("UTF-8")));
		// 生成一个密钥
		SecretKey secretKey = kgen.generateKey();
		// 构造密钥
		byte[] enCodeFormat = secretKey.getEncoded();
		return new SecretKeySpec(enCodeFormat, KEY_ALGORITHM);
	}

	/**
	 * 生成一个固定密钥
	 * 
	 * @param password 长度必须是16的倍数
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	private static Key toKey(String password) throws UnsupportedEncodingException {
		return new SecretKeySpec(password.getBytes("UTF-8"), KEY_ALGORITHM);
	}

	/**
	 * 将二进制转换成十六进制
	 * 
	 * @param buf
	 * @return
	 */
	private 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();
	}

	/**
	 * 将十六进制转换为二进制
	 * 
	 * @param hexStr
	 * @return
	 */
	private 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;
	}

	/**
	 * 加密
	 * 
	 * @param content
	 *            需要加密的内容
	 * @param password
	 *            加密密码
	 * @return
	 * @throws Exception
	 */
	public static String encrypt(String content, String password) {
		if (StringUtils.isBlank(content)) {
			return "";
		}
		try {
			// 生成密钥
			Key key = toKey(password);
			// 将String转换为二进制
			byte[] byteContent = content.getBytes("UTF-8");
			// 创建密码器
			Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
			// 初始化为加密模式
			cipher.init(Cipher.ENCRYPT_MODE, key);
			// 执行加密加密
			byte[] result = cipher.doFinal(byteContent);

			return parseByte2HexStr(result);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return "";
	}

	/**
	 * 解密
	 * 
	 * @param content
	 *            待解密内容
	 * @param password
	 *            解密密钥
	 * @return
	 * @throws Exception
	 */
	public static String decrypt(String content, String password) {
		if (StringUtils.isBlank(content)) {
			return "";
		}

		try {
			// 将十六进制转换为二进制
			byte[] contentHex = parseHexStr2Byte(content);

			// 生成密钥
			Key key = toKey(password);
			// 创建密码器
			Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
			// 初始化解码模式
			cipher.init(Cipher.DECRYPT_MODE, key);
			// 解密
			byte[] result = cipher.doFinal(contentHex);

			return new String(result, "UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
		}

		return "";
	}

	public static void main(String[] args) throws Exception {
		String content = "TGT-1-XDm5ultp4XEgb69cDebwRFWKPwEeAF300DF0odckQniqHlJN";

		// 加密
		System.out.println("加密前:" + content);
		String encryptResultStr = encrypt(content, KEY_FOR_UC);
		System.out.println("加密后:" + encryptResultStr);
		// 解密
		System.out.println("解密后:" + decrypt(encryptResultStr, KEY_FOR_UC));
	}
}

 针对方法toRandomKey说明如下:

(1)本例encrypt、decrypt方法中的Key key = toKey(password);,不能替换为Key key=toRandomKey(password),因为不能保证两次调用产生相同的Key(即使在main方法测试时通过的)。

(2)如果想使用随机密钥,修改encrypt、decrypt的参数String password为Key key即可。调用encrypt、decrypt的业务确保两次传入的Key相同。

 

 

 

 

分享到:
评论

相关推荐

    Java实现的对称加密算法AES定义与用法详解

    "Java实现的对称加密算法AES定义与用法详解" 对称加密算法AES是当前使用最多的加密算法之一,其主要特点是高级的、安全的、快速的和灵活的。下面我们将详细介绍Java实现的对称加密算法AES的定义、特点、用法及使用...

    JAVA实现AES加密算法代码.doc

    JAVA 实现 AES 加密算法代码 JAVA 实现 AES 加密算法代码是指使用 JAVA 语言来实现高级加密标准(Advanced Encryption Standard,AES)的加密算法。AES 已经变成目前对称加密中最流行算法之一,能够使用 128、192 ...

    Java实现AES加密和解密算法

    因此,通常会结合密钥管理策略,如使用密钥派生函数(KDFs)或密钥协商协议,以及使用非对称加密(如RSA)来安全地交换AES密钥。 总之,Java中的AES加密和解密涉及到密钥生成、密码器的使用以及数据的转换。在实现...

    AES加密算法(java)实现

    AES高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种...本软件是用java语言开发,实现了AES算法对文件的加密和解密,并在界面上加了进度条,来提示用户加密解密的进度。如果不足之处,欢迎留言。

    常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES.pdf

    对称加密算法包括了多种算法,本文主要介绍DES、3DES和AES这三种常见的对称加密算法,并对它们进行Java实现的总结。 首先,对称加密算法的一个关键优势在于其算法公开、计算量小、加密速度快、加密效率高,但它们也...

    Java AES对称加密解密算法

    Java AES对称加密解密算法

    JAVA实现AES加密算法.rar

    AES,全称Advanced Encryption Standard,即高级加密标准,是一种广泛应用于现代计算机安全领域的对称加密算法。它在2001年由NIST(美国国家标准与技术研究所)采纳为新的联邦信息处理标准(FIPS),取代了之前的DES...

    rsa与aes混合加密java实现

    RSA是一种非对称加密算法,而AES是一种对称加密算法,它们各有优势,结合使用可以提供更强大的安全保障。 **RSA算法** RSA(Rivest-Shamir-Adleman)是1977年由Ron Rivest、Adi Shamir和Leonard Adleman提出的非...

    AES加密算法的JAVA实现

    AES,全称为“Advanced Encryption Standard”,即高级加密标准,是目前广泛使用的对称加密算法。它在2001年由NIST(美国国家标准与技术研究所)正式采纳,取代了之前的DES(数据加密标准)成为新的标准。AES具有较...

    java加密算法:Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法

    java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...

    RSA与AES混合加密算法的实现(java版)

    RSA是一种非对称加密算法,而AES是一种对称加密算法。两者的结合利用了它们各自的优势,为数据加密提供了一种安全而高效的方法。 RSA(Rivest-Shamir-Adleman)算法基于数论中的大数因子分解难题,它有两个密钥:...

    java实现的AES加密算法完整实例

    AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,它基于块加密,使用相同的密钥进行加密和解密。在Java中,AES加密通常通过Java Cryptography Extension (JCE)库来实现。以下是对给定的`AESCrypt...

    AES/DES 对称加密算法

    DES、AES对称加密算法,之前从网上找的,但是在MAC上运行发现每次加密出来的结果都不一样,后来查了一些博客,最后确认是SecureRandom的随机算法问题,需要设置setSeed.

    JAVA实现AES加密和解密

    在Java编程环境中,AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,它以其高效性和安全性而被广泛应用。本文将详细介绍如何使用Java实现AES的加密和解密过程,特别是针对16位长度的秘钥,并解决...

    java实现AES可逆加密算法

    在 Java 中实现 AES 可逆加密算法是一个非常实用的技术, AES(Advanced Encryption Standard)是一种对称加密算法,使用同一个密钥进行加密和解密。下面我们将详细介绍 Java 实现 AES 可逆加密算法的步骤和相关知识...

    AES加密算法(java实现).zip_aes java_cmM0 解密_java aes加密 demo_js aes加密算法_

    AES,全称Advanced Encryption Standard,即高级加密标准,是一种广泛应用于现代网络安全的对称加密算法。它是基于块密码,每个块大小为128位,使用128、192或256位的密钥进行加密。AES在Java中的实现通常包括加密和...

    对称加密算法分析及用Java实现.zip

    本资料包“对称加密算法分析及用Java实现.zip”包含了关于这一主题的详细内容,特别是如何使用Java编程语言来实现对称加密算法。 对称加密算法的核心特点是加密和解密使用相同的密钥,这简化了密钥管理,但也带来了...

    VB6-AES加密算法源码.rar

    AES是一种广泛使用的对称加密算法,为数据提供高强度的安全保护。该源码经过验证,无错误,可以直接在VB6环境下运行,这对于开发者来说是一个宝贵的资源,可以快速集成到自己的项目中。 AES加密算法最初由比利时...

    aes对称加密vue版本demo

    **AES对称加密** AES(Advanced Encryption Standard),即高级加密标准,是目前广泛使用的对称加密算法之一。它以其高效、安全的特点,在数据保护、网络安全等领域有着广泛应用。AES的加密过程基于替换和置换操作...

Global site tag (gtag.js) - Google Analytics