用Java进行AES256-ECB-PKCS7Padding加密

大家可以先看主要的代码:

 

import java.security.Security;

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

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class Encrypt {

	public static boolean initialized = false;
	
	public static final String ALGORITHM = "AES/ECB/PKCS7Padding";
	
	/**
	 * @param  String str  要被加密的字符串
	 * @param  byte[] key  加/解密要用的长度为32的字节数组(256位)密钥
	 * @return byte[]  加密后的字节数组
	 */
	public static byte[] Aes256Encode(String str, byte[] key){
		initialize();
		byte[] result = null;
		try{
			Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");
			SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); //生成加密解密需要的Key
			cipher.init(Cipher.ENCRYPT_MODE, keySpec);
			result = cipher.doFinal(str.getBytes("UTF-8"));
		}catch(Exception e){
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * @param  byte[] bytes  要被解密的字节数组
	 * @param  byte[] key    加/解密要用的长度为32的字节数组(256位)密钥
	 * @return String  解密后的字符串
	 */
	public static String Aes256Decode(byte[] bytes, byte[] key){
		initialize();
		String result = null;
		try{
			Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");
			SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); //生成加密解密需要的Key
			cipher.init(Cipher.DECRYPT_MODE, keySpec);
			byte[] decoded = cipher.doFinal(bytes);
			result = new String(decoded, "UTF-8");
		}catch(Exception e){
			e.printStackTrace();
		}
		return result;
	}
	
	public static void initialize(){
		if (initialized) return;
		Security.addProvider(new BouncyCastleProvider());
		initialized = true;
	}
}

 

 

 

可以看到,代码开头要先import Java Cryptography Extension (JCE)中的两个类——加/解密类Cipher和密钥类SecretKeySpec,以及BouncyCastle的一个开源加/解密类库中的加/解密算法提供者类BouncyCastleProvider。

Android的Java运行环境中包含了"AES/ECB/PKCS7Padding"算法,但一般的JRE(如Oracle JRE、OpenJRE)里面只有"AES/ECB/PKCS5Padding"算法,没有"AES/ECB/PKCS7Padding"算法。故我们需要引入BouncyCastle的库,并给Cipher.getInstance方法传入参数"BC"来指定Java使用这个库里的加/解密算法。BouncyCastle的加/解密类库在Maven仓库中的位置:org.bouncycastlebcprov-jdk15on,其Jar包的下载地址:http://www.bouncycastle.org/latest_releases.html

在这段代码可以运行之前,还有一个问题需要解决。Java本身限制密钥的长度最多128位,而AES256需要的密钥长度是256位,因此需要到Java官网上下载一个Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files。在Java SE的下载页面下面的Additional Resources那里会有下载链接。下载后打开压缩包,里面有两个jar文件。把这两个jar文件解压到JRE目录下的lib/security文件夹,覆盖原来的文件。这样Java就不再限制密钥的长度了。

你可能感兴趣的:(算法与数据结构)