7.4.2 实现
AES算法成为DES算法的替代者,其实现也成为其他对称加密算法实现的参考模型。无论是Java 6所支持的对称加密算法(如RC2、RC4和Blowfish等算法),或是通过第三方加密组件提供的对称加密算法(如Bouncy Castle提供的IDEA算法实现),都可以通过对AES算法实现做少许改动完成相应实现。本文以AES算法实现为例,读者朋友也可参照实现其他算法,如RC2、RC4和Blowfish等算法。
有关AES算法的Java 6实现细节如表7-3所示。
关于无政策限制权限文件(Unlimited Strength Jurisdiction Policy Files),请参阅第4章相关内容。
AES算法实现基于DES算法实现做了修改,具体实现如代码清单7-5所示。
代码清单7-5 AES算法实现
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
*AES安全编码组件
*@author梁栋
*@version 1.0
*/
public abstract class AESCoder{
/**
*密钥算法
*/
public static final String KEY_ALGORITHM="AES";
/**
*加密/解密算法/工作模式/填充方式
*Java 6支持PKCS5PADDING填充方式
*Bouncy Castle支持PKCS7Padding填充方式
*/
public static final String CIPHER_ALGORITHM="AES/ECB/PKCS5Padding";
/**
*转换密钥
*@param key二进制密钥
*@return Key密钥
*@throws Exception
*/
private static Key toKey(byte[]key)throws Exception{
//实例化DES密钥材料
SecretKey secretKey=new SecretKeySpec(key, KEY_ALGORITHM);
return secretKey;
}
/**
*解密
*@param data待解密数据
*@param key密钥
*@return byte[]解密数据
*@throws Exception
*/
public static byte[]decrypt(byte[]data, byte[]key)throws Exception{
//还原密钥
Key k=toKey(key);
/*
*实例化
*使用PKCS7Padding填充方式,按如下方式实现
*Cipher.getInstance(CIPHER_ALGORITHM,"BC");
*/
Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
//初始化,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, k);
//执行操作
return cipher.doFinal(data);
}
/**
*加密
*@param data待加密数据
*@param key密钥
*@return byte[]加密数据
*@throws Exception
*/
public static byte[]encrypt(byte[]data, byte[]key)throws Exception{
//还原密钥
Key k=toKey(key);
/*
*实例化
*使用PKCS7Padding填充方式,按如下方式实现
*Cipher.getInstance(CIPHER_ALGORITHM,"BC");
*/
Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
//初始化,设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE, k);
//执行操作
return cipher.doFinal(data);
}
/**
*生成密钥<br>
*@return byte[]二进制密钥
*@throws Exception
*/
public static byte[]initKey()throws Exception{
//实例化
KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM);
//AES要求密钥长度为128位、192位或256位
kg.init(256);
//生成秘密密钥
SecretKey secretKey=kg.generateKey();
//获得密钥的二进制编码形式
return secretKey.getEncoded();
}
}
上述代码实现当通用的,不仅RC2、RC4和Blowfish算法可以使用上述代码方式实现,包括已经实现的DES和DESede算法都可以参照上述代码实现方式,无须考虑密钥材料实现类,只要对算法名称稍作调整即可!
上述代码测试用例与上文提到的DES和DESede算法的测试用例代码差别不大,如代码清单7-6所示。
代码清单7-6 AES算法实现测试用例
import static org.junit.Assert.*;
import org.apache.commons.codec.binary.Base64;
import org.junit.Test;
/**
*AES安全编码组件校验
*@author梁栋
*@version 1.0
*/
public class AESCoderTest{
/**
*测试
*@throws Exception
*/
@Test
public final void test()throws Exception{
String inputStr="AES";
byte[]inputData=inputStr.getBytes();
System.err.println("原文:\t"+inputStr);
//初始化密钥
byte[]key=AESCoder.initKey();
System.err.println("密钥:\t"+Base64.encodeBase64String(key));
//加密
inputData=AESCoder.encrypt(inputData, key);
System.err.println("加密后:\t"+Base64.encodeBase64String(inputData));
//解密
byte[]outputData=AESCoder.decrypt(inputData, key);
String outputStr=new String(outputData);
System.err.println("解密后:\t"+outputStr);
//校验
assertEquals(inputStr, outputStr);
}
}
观察控制台输出的信息,如下所示:
原文:AES
密钥:4qrBlCmeHHyEAyoNRY2djo1HWx8LLCH2NQHG9c0ahi4=
加密后:XhWaN6Am1T3NVSFYs1OMVg==
解密后:AES
读者朋友可以以AES算法实现为参考,完成RC2、RC4和Blowfish等算法的实现。