JAVA加解密13-對稱加密算法-IDEA算法(對稱分組密碼-華人學者參與設計的)

一伙窃、簡述
在尋找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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钳榨,一起剝皮案震驚了整個濱河市舰罚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薛耻,老刑警劉巖营罢,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異饼齿,居然都是意外死亡饲漾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門缕溉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來考传,“玉大人,你說我怎么就攤上這事倒淫』锞眨” “怎么了败玉?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵奋单,是天一觀的道長算吩。 經(jīng)常有香客問我,道長壳咕,這世上最難降的妖魔是什么兴枯? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任血淌,我火速辦了婚禮,結(jié)果婚禮上财剖,老公的妹妹穿的比我還像新娘悠夯。我一直安慰自己,他們只是感情好躺坟,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布沦补。 她就那樣靜靜地躺著,像睡著了一般咪橙。 火紅的嫁衣襯著肌膚如雪夕膀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天美侦,我揣著相機與錄音产舞,去河邊找鬼。 笑死菠剩,一個胖子當著我的面吹牛易猫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播具壮,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼准颓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嘴办?” 一聲冷哼從身側(cè)響起瞬场,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涧郊,沒想到半個月后贯被,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡妆艘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年彤灶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片批旺。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡幌陕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汽煮,到底是詐尸還是另有隱情搏熄,我是刑警寧澤棚唆,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站心例,受9級特大地震影響宵凌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜止后,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一瞎惫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧译株,春花似錦瓜喇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匪补,卻和暖如春肃续,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叉袍。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刽酱,地道東北人喳逛。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像棵里,于是被迫代替她去往敵國和親润文。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容