一伙窃、簡述
在尋找DES算法替代品的同時、在AES算法征集以前噪珊,IDEA作者就獨辟蹊徑的提出了這個算法晌缘。這個算法很強,想破解出來按照當前的計算水準需要10的13次方年痢站。
在美國之外提出并發(fā)展磷箕,避開法律限制。這個限制被最多應用在郵件加密阵难。電子郵件加密軟件PGP使用的就是IDEA的商業(yè)版權岳枷。
java6沒提供實現(xiàn)。Bouncy Castle提供了實現(xiàn)
二呜叫、算法相關配置說明
算法 | 密鑰長度 | 密鑰長度默認值 | 工作模式 | 填充方式 | 備注 |
---|---|---|---|---|---|
IDEA | 128 | 128 | ECB | PKCS5Padding/PKCS7Padding/ISO10126Padding/ZeroBytePadding | Bouncy Castle實現(xiàn) |
三嫩舟、算法的應用展示
package com.ca.test;
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.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
/**
* IDEA對稱加密算法,java6不支持這個算法的實現(xiàn)怀偷,bouncycastle支持IDEA對稱加密算法
* 這是一款對稱分組密碼。是目前比較常用的電子郵件加密算法之一
* 我們可以參照這個算法的實現(xiàn)來完成其他算法的實現(xiàn):Rijndael,Serpent,Twofish等
* @author kongqz
* */
public class IDEACoder {
/**
* 密鑰算法
* */
public static final String KEY_ALGORITHM="IDEA";
/**
* 加密/解密算法/工作模式/填充方式
* */
public static final String CIPHER_ALGORITHM="IDEA/ECB/ISO10126Padding";
/**
*
* 生成密鑰播玖,只有bouncycastle支持
* @return byte[] 二進制密鑰
* */
public static byte[] initkey() throws Exception{
//加入bouncyCastle支持
Security.addProvider(new BouncyCastleProvider());
//實例化密鑰生成器
KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM);
//初始化密鑰生成器椎工,IDEA要求密鑰長度為128位
kg.init(128);
//生成密鑰
SecretKey secretKey=kg.generateKey();
//獲取二進制密鑰編碼形式
return secretKey.getEncoded();
}
/**
* 轉(zhuǎn)換密鑰
* @param key 二進制密鑰
* @return Key 密鑰
* */
public static Key toKey(byte[] key) throws Exception{
//實例化DES密鑰
//生成密鑰
SecretKey secretKey=new SecretKeySpec(key,KEY_ALGORITHM);
return secretKey;
}
/**
* 加密數(shù)據(jù)
* @param data 待加密數(shù)據(jù)
* @param key 密鑰
* @return byte[] 加密后的數(shù)據(jù)
* */
public static byte[] encrypt(byte[] data,byte[] key) throws Exception{
//加入bouncyCastle支持
Security.addProvider(new BouncyCastleProvider());
//還原密鑰
Key k=toKey(key);
//實例化
Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
//初始化,設置為加密模式
cipher.init(Cipher.ENCRYPT_MODE, k);
//執(zhí)行操作
return cipher.doFinal(data);
}
/**
* 解密數(shù)據(jù)
* @param data 待解密數(shù)據(jù)
* @param key 密鑰
* @return byte[] 解密后的數(shù)據(jù)
* */
public static byte[] decrypt(byte[] data,byte[] key) throws Exception{
//加入bouncyCastle支持
Security.addProvider(new BouncyCastleProvider());
//還原密鑰
Key k =toKey(key);
Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
//初始化蜀踏,設置為解密模式
cipher.init(Cipher.DECRYPT_MODE, k);
//執(zhí)行操作
return cipher.doFinal(data);
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String str="IDEA";
System.out.println("原文:"+str);
//初始化密鑰
byte[] key=IDEACoder.initkey();
System.out.println("密鑰:"+Base64.encodeBase64String(key));
//加密數(shù)據(jù)
byte[] data=IDEACoder.encrypt(str.getBytes(), key);
System.out.println("加密后:"+Base64.encodeBase64String(data));
//解密數(shù)據(jù)
data=IDEACoder.decrypt(data, key);
System.out.println("解密后:"+new String(data));
}
}
控制臺輸出結(jié)果:
原文:IDEA
密鑰:TIM+ksMQUeUe6LHHBGntag==
加密后:rRHc34j86i4=
解密后:IDEA
四维蒙、總結(jié)
1、我們可以參考這個代碼使用Bouncycastle來實現(xiàn)AES的候選算法 Rijndael果覆,Serpent颅痊,Twofish
2、這個算法使用BouncyCastle的jar包的時候一定注意局待,僅僅那個基礎的jar:bcprov-jdk16-146.jar是不夠滴斑响,需要將那個擴展jar包(bcprov-ext-jdk16-146.jar)也引入項目的build path中.如果你不引用這個ext包,執(zhí)行main函數(shù)的時候就提醒你:java.security.NoSuchAlgorithmException: IDEA KeyGenerator not available