7.4.2 实现

AES算法成为DES算法的替代者,其实现也成为其他对称加密算法实现的参考模型。无论是Java 6所支持的对称加密算法(如RC2、RC4和Blowfish等算法),或是通过第三方加密组件提供的对称加密算法(如Bouncy Castle提供的IDEA算法实现),都可以通过对AES算法实现做少许改动完成相应实现。本文以AES算法实现为例,读者朋友也可参照实现其他算法,如RC2、RC4和Blowfish等算法。

有关AES算法的Java 6实现细节如表7-3所示。

figure_0241_0056

关于无政策限制权限文件(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等算法的实现。