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

Java 加密解密之对称加密算法AES

    博客分类:
  • Java
阅读更多

Java 加密解密基础

Java byte数组与十六进制字符串互转

Java BASE64加密解密

Java 加密解密之消息摘要算法(MD5 SHA MAC)

Java 加密解密之对称加密算法DES

Java 加密解密之对称加密算法DESede

Java 加密解密之对称加密算法AES

Java 加密解密之对称加密算法PBE

 

Java 加密解密之对称加密算法AES

 

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄选流程。(Rijdael的发音近于 "Rhinedoll"。)

 

AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。

AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。1998年NIST开始AES第一轮分析、测试和征集,共产生了15个候选算法。1999年3月完成了第二轮AES2的分析、测试。2000年10月2日美国政府正式宣布选中比利时密码学家Joan Daemen 和 Vincent Rijmen 提出的一种密码算法RIJNDAEL 作为 AES.   在应用方面,尽管DES在安全上是脆弱的,但由于快速DES芯片的大量生产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES。但是DES迟早要被AES代替。流密码体制较之分组密码在理论上成熟且安全,但未被列入下一代加密标准。   

AES加密数据块和密钥长度可以是128比特、192比特、256比特中的任意一个。

AES加密有很多轮的重复和变换。大致步骤如下:

1、密钥扩展(KeyExpansion),

2、初始轮(Initial Round),

3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,

4、最终轮(Final Round),最终轮没有MixColumns。

 

JDK对DESede算法的支持

密钥长度:128位
工作模式:ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128
填充方式:Nopadding/PKCS5Padding/ISO10126Padding/
 

工作模式和填充方式请参考:      JAVA加密解密基础

十六进制工具类Hex.java,见:   java byte数组与十六进制字符串互转

AES加密解密的java实现:
AESCoder.java

import java.security.Key;
import java.security.NoSuchAlgorithmException;

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

/**
 * AES Coder<br/>
 * secret key length:	128bit, default:	128 bit<br/>
 * mode:	ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128<br/>
 * padding:	Nopadding/PKCS5Padding/ISO10126Padding/
 * @author Aub
 * 
 */
public class AESCoder {
	
	/**
	 * 密钥算法
	*/
	private static final String KEY_ALGORITHM = "AES";
	
	private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
	
	/**
	 * 初始化密钥
	 * 
	 * @return byte[] 密钥 
	 * @throws Exception
	 */
	public static byte[] initSecretKey() {
		//返回生成指定算法的秘密密钥的 KeyGenerator 对象
		KeyGenerator kg = null;
		try {
			kg = KeyGenerator.getInstance(KEY_ALGORITHM);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return new byte[0];
		}
		//初始化此密钥生成器,使其具有确定的密钥大小
		//AES 要求密钥长度为 128
		kg.init(128);
		//生成一个密钥
		SecretKey  secretKey = kg.generateKey();
		return secretKey.getEncoded();
	}
	
	/**
	 * 转换密钥
	 * 
	 * @param key	二进制密钥
	 * @return 密钥
	 */
	private static Key toKey(byte[] key){
		//生成密钥
		return new SecretKeySpec(key, KEY_ALGORITHM);
	}
	
	/**
	 * 加密
	 * 
	 * @param data	待加密数据
	 * @param key	密钥
	 * @return byte[]	加密数据
	 * @throws Exception
	 */
	public static byte[] encrypt(byte[] data,Key key) throws Exception{
		return encrypt(data, key,DEFAULT_CIPHER_ALGORITHM);
	}
	
	/**
	 * 加密
	 * 
	 * @param data	待加密数据
	 * @param key	二进制密钥
	 * @return byte[]	加密数据
	 * @throws Exception
	 */
	public static byte[] encrypt(byte[] data,byte[] key) throws Exception{
		return encrypt(data, key,DEFAULT_CIPHER_ALGORITHM);
	}
	
	
	/**
	 * 加密
	 * 
	 * @param data	待加密数据
	 * @param key	二进制密钥
	 * @param cipherAlgorithm	加密算法/工作模式/填充方式
	 * @return byte[]	加密数据
	 * @throws Exception
	 */
	public static byte[] encrypt(byte[] data,byte[] key,String cipherAlgorithm) throws Exception{
		//还原密钥
		Key k = toKey(key);
		return encrypt(data, k, cipherAlgorithm);
	}
	
	/**
	 * 加密
	 * 
	 * @param data	待加密数据
	 * @param key	密钥
	 * @param cipherAlgorithm	加密算法/工作模式/填充方式
	 * @return byte[]	加密数据
	 * @throws Exception
	 */
	public static byte[] encrypt(byte[] data,Key key,String cipherAlgorithm) throws Exception{
		//实例化
		Cipher cipher = Cipher.getInstance(cipherAlgorithm);
		//使用密钥初始化,设置为加密模式
		cipher.init(Cipher.ENCRYPT_MODE, key);
		//执行操作
		return cipher.doFinal(data);
	}
	
	
	
	/**
	 * 解密
	 * 
	 * @param data	待解密数据
	 * @param key	二进制密钥
	 * @return byte[]	解密数据
	 * @throws Exception
	 */
	public static byte[] decrypt(byte[] data,byte[] key) throws Exception{
		return decrypt(data, key,DEFAULT_CIPHER_ALGORITHM);
	}
	
	/**
	 * 解密
	 * 
	 * @param data	待解密数据
	 * @param key	密钥
	 * @return byte[]	解密数据
	 * @throws Exception
	 */
	public static byte[] decrypt(byte[] data,Key key) throws Exception{
		return decrypt(data, key,DEFAULT_CIPHER_ALGORITHM);
	}
	
	/**
	 * 解密
	 * 
	 * @param data	待解密数据
	 * @param key	二进制密钥
	 * @param cipherAlgorithm	加密算法/工作模式/填充方式
	 * @return byte[]	解密数据
	 * @throws Exception
	 */
	public static byte[] decrypt(byte[] data,byte[] key,String cipherAlgorithm) throws Exception{
		//还原密钥
		Key k = toKey(key);
		return decrypt(data, k, cipherAlgorithm);
	}

	/**
	 * 解密
	 * 
	 * @param data	待解密数据
	 * @param key	密钥
	 * @param cipherAlgorithm	加密算法/工作模式/填充方式
	 * @return byte[]	解密数据
	 * @throws Exception
	 */
	public static byte[] decrypt(byte[] data,Key key,String cipherAlgorithm) throws Exception{
		//实例化
		Cipher cipher = Cipher.getInstance(cipherAlgorithm);
		//使用密钥初始化,设置为解密模式
		cipher.init(Cipher.DECRYPT_MODE, key);
		//执行操作
		return cipher.doFinal(data);
	}
	
	private static String  showByteArray(byte[] data){
		if(null == data){
			return null;
		}
		StringBuilder sb = new StringBuilder("{");
		for(byte b:data){
			sb.append(b).append(",");
		}
		sb.deleteCharAt(sb.length()-1);
		sb.append("}");
		return sb.toString();
	}
	
	public static void main(String[] args) throws Exception {
		byte[] key = initSecretKey();
		System.out.println("key:"+showByteArray(key));
		
		Key k = toKey(key);
		
		String data ="AES数据";
		System.out.println("加密前数据: string:"+data);
		System.out.println("加密前数据: byte[]:"+showByteArray(data.getBytes()));
		System.out.println();
		byte[] encryptData = encrypt(data.getBytes(), k);
		System.out.println("加密后数据: byte[]:"+showByteArray(encryptData));
		System.out.println("加密后数据: hexStr:"+Hex.encodeHexStr(encryptData));
		System.out.println();
		byte[] decryptData = decrypt(encryptData, k);
		System.out.println("解密后数据: byte[]:"+showByteArray(decryptData));
		System.out.println("解密后数据: string:"+new String(decryptData));
		
	}
}

  参考《java加密与解密的艺术》

 

分享到:
评论
5 楼 冲杯茶喝 2014-01-20  
aubdiy 写道
冲杯茶喝 写道
//实例化 
        Cipher cipher = Cipher.getInstance(cipherAlgorithm); 
        //使用密钥初始化,设置为解密模式 
        cipher.init(Cipher.DECRYPT_MODE, key); 
Cipher对象可否复用??

我之前测试时 是可以服用的 建议你再测测


复用我测试过可以,但是不是线程安全的呢
4 楼 aubdiy 2014-01-16  
冲杯茶喝 写道
//实例化 
        Cipher cipher = Cipher.getInstance(cipherAlgorithm); 
        //使用密钥初始化,设置为解密模式 
        cipher.init(Cipher.DECRYPT_MODE, key); 
Cipher对象可否复用??

我之前测试时 是可以服用的 建议你再测测
3 楼 冲杯茶喝 2014-01-16  
//实例化 
        Cipher cipher = Cipher.getInstance(cipherAlgorithm); 
        //使用密钥初始化,设置为解密模式 
        cipher.init(Cipher.DECRYPT_MODE, key); 
Cipher对象可否复用??
2 楼 aubdiy 2012-11-10  
pandonix 写道
java是不是原生并不支持pkcs7?
Exception in thread "main" java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding

对,java原生的jdk中目前还不支持pkcs7,你可以使用第三方的实现
1 楼 pandonix 2012-11-09  
java是不是原生并不支持pkcs7?
Exception in thread "main" java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding

相关推荐

    Java 加密解密之对称加密算法AES.docx

    ### Java 加密解密之对称加密算法AES #### 高级加密标准(AES) AES是一种广泛使用的对称加密算法,被美国联邦政府采纳作为官方的加密标准来替代早期的DES算法。它由比利时密码学家Joan Daemen和Vincent Rijmen...

    Java 加密解密之对称加密算法AES.pdf

    本文主要关注的是Java中的对称加密算法——AES(Advanced Encryption Standard),它是现代密码学中的一个关键标准,用于替换旧的DES算法。AES是由比利时密码学家Joan Daemen和Vincent Rijmen设计的Rijndael加密法,...

    Java实现AES加密和解密算法

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

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

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

    Java_加密解密之对称加密算法DES

    Java 加密解密之对称加密算法 DES Java 加密解密之对称加密算法 DES 是一种常用的对称加密算法,广泛应用于保护金融数据的安全中。它的全称是 Data Encryption Algorithm(DEA),最早由 IBM 开发,并曾拥有专利权...

    qt5AES加密,ES加密/解密算法是一种可逆的对称加密算法,这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推

    AES是一种广泛使用的对称加密算法,以其高效和安全性著称。"ES加密/解密算法"可能是描述错误,通常指的是AES算法在Elasticsearch(ES)中的应用,因为标签提到了"Elasticsearch",而且在安全领域,Elasticsearch也会...

    Java AES对称加密解密算法

    Java AES对称加密解密算法

    c/c++与java互通 AES加密解密

    AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,提供了强效的数据保护。本话题主要探讨如何在C/C++和Java之间使用基本的字符串和数组操作实现AES加密解密,而不依赖任何额外...

    MFC实现AES非对称加密解密算法

    AES是一种对称加密算法,使用相同的密钥进行加密和解密。它基于一系列固定的替换和置换操作,包括字节混淆和字组代换,以创建难以破解的密文。AES支持不同大小的密钥,如128位、192位和256位,其中256位的安全性最高...

    JAVA实现AES加密和解密

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

    AES加密算法(java)实现

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

    c AES, c++ AES, java AES, 互通, 加密解密

    3. 加密:在C/C++和Java中实现AES加密算法,处理输入的明文数据。 4. 解密:在另一端实现AES解密算法,还原加密后的数据。 5. 检验:解密后,对比原文以验证互通性。 文件名"aes"可能包含的是示例代码或者测试数据...

    Java 加密解密之对称加密算法DES.doc

    Java中的DES(Data Encryption Standard)是对称加密算法的一种,它基于IBM的研究工作,并在1977年被美国政府采纳为标准。DES算法使用56位的密钥和额外的8位奇偶校验位来处理64位的数据块。由于其结构特性,它采用...

    AES实现前端JS和后端java加密解密

    AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,它为数据提供了强大的安全性。在本文中,我们将深入探讨如何在前端JavaScript和后端Java中实现AES的加密与解密。 前端JavaScript实现AES加密: ...

    C#实现AES加密解密算法

    2. **AES**:一种对称加密算法,被广泛认为是目前最安全的加密方式之一。 3. **密钥**:用于加密或解密数据的一串字符。 4. **初始化向量(IV)**:在某些加密模式下,除了密钥之外还需要一个初始化向量来增加加密的...

    java的AES加密解密

    Java中的AES(Advanced Encryption Standard)加密解密是信息安全领域中常用的一种对称加密技术。AES在数据保护、网络通信和存储安全中发挥着重要作用。它以其高效性和安全性,被广泛应用于各种软件开发中。本篇将...

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

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

    C++/java/C#语言的AES加密解密

    AES是一种广泛使用的对称加密算法,它在信息安全领域中扮演着重要的角色,用于保护数据的隐私和安全。 在描述中,提到了“纯C++代码开发,没调用API库”,这意味着这个实现是完全自包含的,没有依赖外部的加密库,...

    AES-128加密解密源码及算法详解。

    AES(Advanced Encryption Standard,高级加密标准)是一种广泛应用于现代数据保护的对称加密算法,它在信息安全领域扮演着至关重要的角色。AES-128是AES的一种变体,使用128位的密钥进行加密,提供了一种高效且安全...

Global site tag (gtag.js) - Google Analytics