7.5.2 实现
Java 6没有提供IDEA算法的相应实现,若需要使用该算法我们可以通过Bouncy Castle来完成。Bouncy Castle不仅提供了IDEA算法实现,包括其他Java 6未能支持的对称加密算法也可通过Bouncy Castele实现,如AES候选算法Rijndael、Serpent和Twofish等。本文以IDEA算法实现为例,读者朋友可参照其他算法的实现,如Rijndael、Serpent和Twofish等。
有关IDEA算法的Bouncy Castle实现细节如表7-4所示。
IDEA算法的实现需要通过Bouncy Castle来完成,参考如下代码:
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
//省略
//加入BouncyCastleProvider支持
Security.addProvider(new BouncyCastleProvider());
本节代码实现对于其他Bouncy Castle支持的算法实现有代表性意义,实现如代码清单7-7所示。
代码清单7-7 IDEA算法实现
import java.security.Key;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
/**
*IDEA安全编码组件
*@author梁栋
*@version 1.0
*@since 1.0
*/
public abstract class IDEACoder{
/**
*密钥算法
*/
public static final String KEY_ALGORITHM="IDEA";
/**
*加密/解密算法/工作模式/填充方式
*/
public static final String CIPHER_ALGORITHM="IDEA/ECB/ISO10126Padding";
/**
*转换密钥
*@param key二进制密钥
*@return Key密钥
*@throws Exception
*/
private static Key toKey(byte[]key)throws Exception{
//生成秘密密钥
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{
//加入BouncyCastleProvider支持
Security.addProvider(new BouncyCastleProvider());
//还原密钥
Key k=toKey(key);
//实例化
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{
//加入BouncyCastleProvider支持
Security.addProvider(new BouncyCastleProvider());
//还原密钥
Key k=toKey(key);
//实例化
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{
//加入BouncyCastleProvider支持
Security.addProvider(new BouncyCastleProvider());
//实例化
KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM);
//初始化
kg.init(128);
//生成秘密密钥
SecretKey secretKey=kg.generateKey();
//获得密钥的二进制编码形式
return secretKey.getEncoded();
}
}
IDEA算法本身也可以通过Bouncy Castle的API来实现,甚至包括其他Java 6未能支持的算法也可以通过Bouncy Castle的API来实现,包括Serpent和Twofish等。但是,如果这样做就跳出了JCE框架,增加了学习难度。既然JCE框架给我们提供了便捷灵活的第三方加密算法调用方式,我们为什么不能加以运用呢?
对于上述代码的测试如代码清单7-8所示。
代码清单7-8 IDEA算法实现测试用例
import static org.junit.Assert.*;
import org.apache.commons.codec.binary.Base64;
import org.junit.Test;
/**
*IDEA安全编码组件校验
*@author梁栋
*@version 1.0
*/
public class IDEACoderTest{
/**
*测试
*@throws Exception
*/
@Test
public final void test()throws Exception{
String inputStr="IDEA";
byte[]inputData=inputStr.getBytes();
System.err.println("原文:\t"+inputStr);
//初始化密钥
byte[]key=IDEACoder.initKey();
System.err.println("密钥:\t"+Base64.encodeBase64String(key));
//加密
inputData=IDEACoder.encrypt(inputData, key);
System.err.println("加密后:\t"+Base64.encodeBase64String(inputData));
//解密
byte[]outputData=IDEACoder.decrypt(inputData, key);
String outputStr=new String(outputData);
System.err.println("解密后:\t"+outputStr);
//校验
assertEquals(inputStr, outputStr);
}
}
控制台输出信息如下所示:
原文:IDEA
密钥:W1a1IFCKIbXKdnejfT5b2A==
加密后:er43StU2Txk=
解密后:IDEA