3DES加密

本文介紹了3DES加密特性,加密特點,3DES是對稱加密悔常,用一個密鑰對內(nèi)容進行加密怀吻,必須使用相同的密鑰進行解密, 密鑰必須配置瞬浓,而且長度為24位,不足24位蓬坡,用0位進行補全猿棉,本文也順帶介紹了其它加密算法磅叛,最后使用java語句實現(xiàn)了3DES加解密
眾多的加密手段大致可以分為單項加密和雙向加密。單項加密指通過對數(shù)據(jù)進行摘要計算生成密文萨赁,密文不可逆推還原弊琴,比如有MD5、SHA等杖爽;雙向加密則相反敲董,指可以把密文逆推還原成明文,其中雙向加密又分為對稱加密和非對稱加密慰安。對稱加密是指數(shù)據(jù)使用者必須擁有同樣的密鑰才可以進行加密解密腋寨,就像大家共同約定了一組暗號一樣,對稱加密的手段有DES化焕、3DES精置、AES、IDEA锣杂、RC4、RC5等番宁;而非對稱加密相對于對稱加密而言元莫,無需擁有同一組密鑰,它是一種“信息公開的密鑰交換協(xié)議”蝶押。非對稱加密需要公開密鑰和私有密鑰兩組密鑰踱蠢,公開密鑰和私有密鑰是配對起來的,也就是說使用公開密鑰進行數(shù)據(jù)加密棋电,只有對應的私有密鑰才能進行解密茎截。此類的加密手段有RSA、DSA等赶盔。

初識3DES

3DES企锌,中文名“三重數(shù)據(jù)加密算法”, 也稱為3DESede或TripleDES,是三重數(shù)據(jù)加密于未,且可以逆推的一種算法方案撕攒。

1975年美國IBM公司成功研究并發(fā)布了DES加密算法,但DES密碼長度容易被暴力破解烘浦,通過對DES算法進行改進抖坪,針對每個數(shù)據(jù)塊進行        三次DES加密须喂,也就是3DES加密算法家夺。

但由于3DES的算法是公開的,所以算法本身沒什么秘密可言槽驶,主要依靠唯一密鑰來確保數(shù)據(jù)加密解密的安全握侧。

有人可能會問蚯瞧,那3DES到底安不安全呢嘿期?!目前為止状知,還沒有人能破解3DES秽五,所以你要是能破解它,都足以震驚整個信息安全界了……

原理

使用 3 條 56 位的密鑰對數(shù)據(jù)進行三次加密饥悴。3DES(即 Triple DES)是 DES 向 AES 過渡的加密算法(NIST 將 3-DES 指定為過渡的加密標準)坦喘。

其具體實現(xiàn)如下:設 Ek() 和 Dk() 代表 DES 算法的加密和解密過程,K 代表 DES 算法使用的密鑰西设,P 代表明文瓣铣,C 代表密文,這樣:

3DES 加密過程為:C = Ek3 ( Dk2 ( Ek1 ( P ) ) )

3DES 解密過程為:P = Dk1 ( EK2 ( Dk3 ( C ) ) )

Java使用3DES加密解密的流程

①傳入共同約定的密鑰(keyBytes)以及算法(Algorithm)贷揽,來構(gòu)建SecretKey密鑰對象

    SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);       keyBytes必須是24字節(jié)

②根據(jù)算法實例化Cipher對象棠笑。它負責加密/解密

    Cipher c1 = Cipher.getInstance(Algorithm);    

③傳入加密/解密模式以及SecretKey密鑰對象,實例化Cipher對象

    c1.init(Cipher.ENCRYPT_MODE, deskey);    

④傳入字節(jié)數(shù)組禽绪,調(diào)用Cipher.doFinal()方法蓖救,實現(xiàn)加密/解密,并返回一個byte字節(jié)數(shù)組

    c1.doFinal(src);

24位解密串(必須是24位)

3DES的密鑰必須是24位的byte數(shù)組

 隨便拿一個String.getBytes()是不行的印屁,會報如下錯誤

    java.security.InvalidKeyException: Invalid key length: 59 bytes

解決方法有很多

  ①按密鑰固定長度重新定義字符串循捺;

  ②先把字符串用Base64或者MD5加密,然后截取固定長度的字符轉(zhuǎn)成byte數(shù)組雄人;

  ③字符串轉(zhuǎn)成Byte數(shù)組从橘,針對該數(shù)組進行修改,若長度過長則只截取一部分础钠,若長度不夠則補零

JAVA代碼實現(xiàn)

/**

  • SecretUtils {3DES加密解密的工具類 }

  • @author William

  • @date 2013-04-19
    */
    public class SecretUtils {

    //定義加密算法恰力,有DES、DESede(即3DES)旗吁、Blowfish
    private static final String Algorithm = "DESede";
    private static final String PASSWORD_CRYPT_KEY = "2012PinganVitality075522628888ForShenZhenBelter075561869839";

/**
 * 加密方法
 * @param src 源數(shù)據(jù)的字節(jié)數(shù)組
 * @return 
 */
public static byte[] encryptMode(byte[] src) {
    try {
         SecretKey deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);    //生成密鑰
         Cipher c1 = Cipher.getInstance(Algorithm);    //實例化負責加密/解密的Cipher工具類
         c1.init(Cipher.ENCRYPT_MODE, deskey);    //初始化為加密模式
         return c1.doFinal(src);
     } catch (java.security.NoSuchAlgorithmException e1) {
         e1.printStackTrace();
     } catch (javax.crypto.NoSuchPaddingException e2) {
         e2.printStackTrace();
     } catch (java.lang.Exception e3) {
         e3.printStackTrace();
     }
     return null;
 }
 
 
/**
 * 解密函數(shù)
 * @param src 密文的字節(jié)數(shù)組
 * @return
 */
public static byte[] decryptMode(byte[] src) {      
    try {
        SecretKey deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);
        Cipher c1 = Cipher.getInstance(Algorithm);
        c1.init(Cipher.DECRYPT_MODE, deskey);    //初始化為解密模式
        return c1.doFinal(src);
    } catch (java.security.NoSuchAlgorithmException e1) {
        e1.printStackTrace();
    } catch (javax.crypto.NoSuchPaddingException e2) {
        e2.printStackTrace();
    } catch (java.lang.Exception e3) {
        e3.printStackTrace();
    }
    return null;
 }
 
 
/*
 * 根據(jù)字符串生成密鑰字節(jié)數(shù)組 
 * @param keyStr 密鑰字符串
 * @return 
 * @throws UnsupportedEncodingException
 */
public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException{
    byte[] key = new byte[24];    //聲明一個24位的字節(jié)數(shù)組踩萎,默認里面都是0
    byte[] temp = keyStr.getBytes("UTF-8");    //將字符串轉(zhuǎn)成字節(jié)數(shù)組
     
    /*
     * 執(zhí)行數(shù)組拷貝
     * System.arraycopy(源數(shù)組,從源數(shù)組哪里開始拷貝很钓,目標數(shù)組驻民,拷貝多少位)
     */
    if(key.length > temp.length){
        //如果temp不夠24位,則拷貝temp數(shù)組整個長度的內(nèi)容到key數(shù)組中
        System.arraycopy(temp, 0, key, 0, temp.length);
    }else{
        //如果temp大于24位履怯,則拷貝temp數(shù)組24個長度的內(nèi)容到key數(shù)組中
        System.arraycopy(temp, 0, key, 0, key.length);
    }
    return key;
} 

}

測試代碼

public class Main {

/**
 * @param args
 */
public static void main(String[] args) {
    String msg = "3DES加密解密案例";
    System.out.println("【加密前】:" + msg);
     
    //加密
    byte[] secretArr = SecretUtils.encryptMode(msg.getBytes());    
    System.out.println("【加密后】:" + new String(secretArr));
     
    //解密
    byte[] myMsgArr = SecretUtils.decryptMode(secretArr);  
    System.out.println("【解密后】:" + new String(myMsgArr));
}

}

參考資料


3DES在線測試工具:http://www.seacha.com/tools/3des.php

本文demo下載:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=300

?

JAVA代碼實現(xiàn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末回还,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叹洲,更是在濱河造成了極大的恐慌柠硕,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蝗柔,居然都是意外死亡闻葵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門癣丧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來槽畔,“玉大人,你說我怎么就攤上這事胁编∠峋” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵嬉橙,是天一觀的道長早直。 經(jīng)常有香客問我,道長市框,這世上最難降的妖魔是什么霞扬? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮枫振,結(jié)果婚禮上喻圃,老公的妹妹穿的比我還像新娘。我一直安慰自己粪滤,他們只是感情好级及,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著额衙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怕吴。 梳的紋絲不亂的頭發(fā)上窍侧,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音转绷,去河邊找鬼伟件。 笑死,一個胖子當著我的面吹牛议经,可吹牛的內(nèi)容都是我干的斧账。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼煞肾,長吁一口氣:“原來是場噩夢啊……” “哼咧织!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起籍救,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤习绢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闪萄,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡梧却,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了败去。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片放航。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖圆裕,靈堂內(nèi)的尸體忽然破棺而出广鳍,到底是詐尸還是另有隱情,我是刑警寧澤葫辐,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布搜锰,位于F島的核電站,受9級特大地震影響耿战,放射性物質(zhì)發(fā)生泄漏蛋叼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一剂陡、第九天 我趴在偏房一處隱蔽的房頂上張望狈涮。 院中可真熱鬧,春花似錦鸭栖、人聲如沸歌馍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽松却。三九已至,卻和暖如春溅话,著一層夾襖步出監(jiān)牢的瞬間晓锻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工飞几, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砚哆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓屑墨,卻偏偏與公主長得像躁锁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卵史,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

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

  • 本文主要介紹移動端的加解密算法的分類战转、其優(yōu)缺點特性及應用,幫助讀者由淺入深地了解和選擇加解密算法以躯。文中會包含算法的...
    蘋果粉閱讀 11,505評論 5 29
  • DES 數(shù)據(jù)加密標準(英語:Data Encryption Standard匣吊,縮寫為 DES)是一種對稱密鑰加密塊...
    Y2136閱讀 11,295評論 3 9
  • 這篇文章主要講述在Mobile BI(移動商務智能)開發(fā)過程中,在網(wǎng)絡通信、數(shù)據(jù)存儲色鸳、登錄驗證這幾個方面涉及的加密...
    雨_樹閱讀 2,427評論 0 6
  • 概述 之前一直對加密相關(guān)的算法知之甚少社痛,只知道類似DES、RSA等加密算法能對數(shù)據(jù)傳輸進行加密命雀,且各種加密算法各有...
    Henryzhu閱讀 3,019評論 0 14
  • 孩子到底在好奇什么1歲 突如其來的表情吏砂,突然出現(xiàn)的聲音撵儿,鮮艷的顏色 1歲專注力時間不長 2歲早教班 一同學和二同學...
    MaryCeeport閱讀 317評論 0 0