DES加密與3DES加密

DES

數(shù)據(jù)加密標(biāo)準(zhǔn)(英語(yǔ):Data Encryption Standard赔蒲,縮寫(xiě)為 DES)是一種對(duì)稱密鑰加密塊密碼算法弯淘,1976年被美國(guó)聯(lián)邦政府的國(guó)家標(biāo)準(zhǔn)局確定為聯(lián)邦資料處理標(biāo)準(zhǔn)(FIPS)循衰,隨后在國(guó)際上廣泛流傳開(kāi)來(lái)意狠。它基于使用56位密鑰的對(duì)稱算法乡恕。這個(gè)算法因?yàn)榘恍C(jī)密設(shè)計(jì)元素嘶卧,相對(duì)短的密鑰長(zhǎng)度以及懷疑內(nèi)含美國(guó)國(guó)家安全局(NSA)的后門(mén)而在開(kāi)始時(shí)有爭(zhēng)議童本,DES因此受到了強(qiáng)烈的學(xué)院派式的審查,并以此推動(dòng)了現(xiàn)代的塊密碼及其密碼分析的發(fā)展脸候。

DES現(xiàn)在已經(jīng)不是一種安全的加密方法穷娱,主要因?yàn)樗褂玫?6位密鑰過(guò)短。1999年1月运沦,distributed.net與電子前哨基金會(huì)合作泵额,在22小時(shí)15分鐘內(nèi)即公開(kāi)破解了一個(gè)DES密鑰。也有一些分析報(bào)告提出了該算法的理論上的弱點(diǎn)携添,雖然在實(shí)際中難以應(yīng)用嫁盲。為了提供實(shí)用所需的安全性,可以使用DES的派生算法3DES來(lái)進(jìn)行加密烈掠,雖然3DES也存在理論上的攻擊方法羞秤。在2001年,DES作為一個(gè)標(biāo)準(zhǔn)已經(jīng)被高級(jí)加密標(biāo)準(zhǔn)(AES)所替換左敌。另外瘾蛋,DES已經(jīng)不再作為國(guó)家標(biāo)準(zhǔn)科技協(xié)會(huì)(前國(guó)家標(biāo)準(zhǔn)局)的一個(gè)標(biāo)準(zhǔn)。

在某些文獻(xiàn)中矫限,作為算法的DES被稱為DEA(Data Encryption Algorithm哺哼,數(shù)據(jù)加密算法)佩抹,以與作為標(biāo)準(zhǔn)的DES區(qū)分開(kāi)來(lái)。在發(fā)音時(shí)取董,DES可以作為縮寫(xiě)按字母拼出來(lái)(/?di??i???s/)棍苹,或作為一個(gè)詞念成/?d?z/。
DES算法的入口參數(shù)有三個(gè):Key茵汰、Data枢里、Mode。其中Key為7個(gè)字節(jié)共56位,是DES算法的工作密鑰;Data為8個(gè)字節(jié)64位,是要被加密或被解密的數(shù)據(jù);Mode為DES的工作方式,有兩種:加密或解密蹂午。

3DES

密碼學(xué)中坡垫,三重?cái)?shù)據(jù)加密算法(英語(yǔ):Triple Data Encryption Algorithm,縮寫(xiě)為T(mén)DEA画侣,Triple DEA)冰悠,或稱3DES(Triple DES),是一種對(duì)稱密鑰加密塊密碼配乱,相當(dāng)于是對(duì)每個(gè)數(shù)據(jù)塊應(yīng)用三次數(shù)據(jù)加密標(biāo)準(zhǔn)(DES)算法溉卓。由于計(jì)算機(jī)運(yùn)算能力的增強(qiáng),原版DES密碼的密鑰長(zhǎng)度變得容易被暴力破解搬泥;3DES即是設(shè)計(jì)用來(lái)提供一種相對(duì)簡(jiǎn)單的方法桑寨,即通過(guò)增加DES的密鑰長(zhǎng)度來(lái)避免類(lèi)似的攻擊,而不是設(shè)計(jì)一種全新的塊密碼算法忿檩。

DES有兩種加密運(yùn)算模式

  • CBC
    需要初始化向量IV尉尾,來(lái)加密第一塊C0.
    有點(diǎn)就是比ECB好
    缺點(diǎn)不利于并行計(jì)算、誤差會(huì)迭代燥透,還需要初始向量
  • ECB
    優(yōu)點(diǎn)就是簡(jiǎn)單沙咏,可以并行計(jì)算,不會(huì)迭代誤差
    缺點(diǎn)就是隱藏不了模式

填充模式

  • ZeroBytePadding
    所有需要填充的地方都以0填充班套。
  • PKCS7Padding java默認(rèn)沒(méi)有該填充方法
    填充的內(nèi)容是需要填充的字節(jié)數(shù)肢藐。如果最后一個(gè)數(shù)據(jù)塊長(zhǎng)度為len,每個(gè)塊的長(zhǎng)度為k吱韭,則要填充的內(nèi)容為:
       01 -- if lth mod k = k-1
       02 -- if lth mod k = k-2
       k k ..k k -- if lth mod k = 0
    需要注意的是吆豹,如果最后一個(gè)數(shù)據(jù)塊的長(zhǎng)度len恰好等于k,則需要在后面再添加一個(gè)完整的padding塊理盆,kk...kk痘煤。下面的例子是每8byte為一塊,最后一塊有8byte猿规,需要填充8byte的\x08衷快。
      ... | DD DD DD DD DD DD DD DD | DD DD DD DD DD DD DD DD | 08 08 08 08 08 08 08 08 |
  • PKCS5Padding
    PKCS5 和 PKCS7 的唯一區(qū)別是PKCS5只能用來(lái)填充64bit的數(shù)據(jù)塊,除此之外可以混用坎拐。
  • NoPadding
    不填充烦磁,如果加密內(nèi)容不是8字節(jié)整數(shù)倍加密則會(huì)報(bào)錯(cuò)
  • SSL3Padding

C#的默認(rèn)模式為CBC,默認(rèn)填充方式為PKCS7
java的默認(rèn)模式為ECB养匈,默認(rèn)填充方式為PKCS5Padding
C#中key的size為16和24均可
java中要求key的size必須為24
對(duì)于CBC模式下的向量iv的size兩者均要求必須為8

java平臺(tái)每種加密方式所需密碼長(zhǎng)度

AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
import android.util.Log;

import java.io.UnsupportedEncodingException;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * 3DES加密解密
 * key長(zhǎng)度為24個(gè)字符哼勇,不足可補(bǔ)零
 * IV向量必須為8位<br/>
 * 使用Base64.encodeToString(byte[], Base64.NO_WRAP);來(lái)將加密后的byte[]轉(zhuǎn)為String<br/>
 * 使用Base64.decode(String, Base64.NO_WRAP);將轉(zhuǎn)為String的加密字符轉(zhuǎn)換為byte[]<br/>
 * new String(byte[])將解密后的byte[]轉(zhuǎn)為String<br/>
 */
public class DES3Util {
    private static final String TAG = "DES3Util";
    private static final String DES3 = "DESede";

    ///////////////////////////////////////////////////////////////////////////
    // DES3
    ///////////////////////////////////////////////////////////////////////////

    /**
     * 3DES ECB模式加密
     */
    public static byte[] des3EncodeECB(byte[] key, byte[] data) {
        try {
            SecretKey DESKey = new SecretKeySpec(key, DES3);    //生成密鑰
            Cipher cipher = Cipher.getInstance(DES3 + "/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, DESKey);
            return cipher.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG, e.getMessage());
            return null;
        }
    }

    /**
     * 3DES ECB模式解密
     */
    public static byte[] des3DecodeECB(byte[] key, byte[] data) {
        try {
            SecretKey DESKey = new SecretKeySpec(key, DES3);    //生成密鑰
            Cipher cipher = Cipher.getInstance(DES3 + "/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, DESKey);
            return cipher.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG, e.getMessage());
            return null;
        }
    }

    /**
     * 3DES CBC模式加密
     */
    public static byte[] des3EncodeCBC(byte[] key, byte[] iv, byte[] data) {
        try {
            SecretKey DESKey = new SecretKeySpec(key, DES3);    //生成密鑰
            Cipher cipher = Cipher.getInstance(DES3 + "/CBC/PKCS5Padding");
            IvParameterSpec ips = new IvParameterSpec(iv);
            cipher.init(Cipher.ENCRYPT_MODE, DESKey, ips);
            return cipher.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG, e.getMessage());
            return null;
        }
    }

    /**
     * 3DES CBC模式加密
     */
    public static byte[] des3DecodeCBC(byte[] key, byte[] iv, byte[] data) {
        try {
            SecretKey DESKey = new SecretKeySpec(key, DES3);    //生成密鑰
            Cipher cipher = Cipher.getInstance(DES3 + "/CBC/PKCS5Padding");
            IvParameterSpec ips = new IvParameterSpec(iv);
            cipher.init(Cipher.DECRYPT_MODE, DESKey, ips);
            return cipher.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG, e.getMessage());
            return null;
        }
    }

    /**
     * 根據(jù)字符串生成密鑰字節(jié)數(shù)組
     *
     * @param keyStr 密鑰字符串
     */
    private static byte[] build3DesKey(String keyStr) {
        try {
            byte[] key = new byte[24];    //聲明一個(gè)24位的字節(jié)數(shù)組都伪,默認(rèn)里面都是0
            byte[] temp = keyStr.getBytes("UTF-8");    //將字符串轉(zhuǎn)成字節(jié)數(shù)組
            if (key.length > temp.length) {
                //如果temp不夠24位,則拷貝temp數(shù)組整個(gè)長(zhǎng)度的內(nèi)容到key數(shù)組中
                System.arraycopy(temp, 0, key, 0, temp.length);
            } else {
                //如果temp大于24位积担,則拷貝temp數(shù)組24個(gè)長(zhǎng)度的內(nèi)容到key數(shù)組中
                System.arraycopy(temp, 0, key, 0, key.length);
            }
            return key;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            Log.e(TAG, e.getMessage());
            return null;
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陨晶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子帝璧,更是在濱河造成了極大的恐慌先誉,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件的烁,死亡現(xiàn)場(chǎng)離奇詭異褐耳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)渴庆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)铃芦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人襟雷,你說(shuō)我怎么就攤上這事刃滓。” “怎么了耸弄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵咧虎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我计呈,道長(zhǎng)砰诵,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任捌显,我火速辦了婚禮胧砰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苇瓣。我一直安慰自己尉间,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布击罪。 她就那樣靜靜地躺著哲嘲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪媳禁。 梳的紋絲不亂的頭發(fā)上眠副,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音竣稽,去河邊找鬼囱怕。 笑死霍弹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的娃弓。 我是一名探鬼主播典格,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼台丛!你這毒婦竟也來(lái)了耍缴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挽霉,失蹤者是張志新(化名)和其女友劉穎防嗡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體侠坎,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚁趁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了实胸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片他嫡。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖童芹,靈堂內(nèi)的尸體忽然破棺而出涮瞻,到底是詐尸還是另有隱情,我是刑警寧澤假褪,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布署咽,位于F島的核電站,受9級(jí)特大地震影響生音,放射性物質(zhì)發(fā)生泄漏宁否。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一缀遍、第九天 我趴在偏房一處隱蔽的房頂上張望慕匠。 院中可真熱鬧,春花似錦域醇、人聲如沸台谊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锅铅。三九已至,卻和暖如春减宣,著一層夾襖步出監(jiān)牢的瞬間盐须,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工漆腌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贼邓,地道東北人阶冈。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像塑径,于是被迫代替她去往敵國(guó)和親女坑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 這篇文章主要講述在Mobile BI(移動(dòng)商務(wù)智能)開(kāi)發(fā)過(guò)程中晓勇,在網(wǎng)絡(luò)通信堂飞、數(shù)據(jù)存儲(chǔ)灌旧、登錄驗(yàn)證這幾個(gè)方面涉及的加密...
    雨_樹(shù)閱讀 2,335評(píng)論 0 6
  • 本文主要介紹移動(dòng)端的加解密算法的分類(lèi)绑咱、其優(yōu)缺點(diǎn)特性及應(yīng)用玛界,幫助讀者由淺入深地了解和選擇加解密算法陨仅。文中會(huì)包含算法的...
    蘋(píng)果粉閱讀 11,463評(píng)論 5 29
  • 1 基礎(chǔ) 1.1 對(duì)稱算法 描述:對(duì)稱加密是指加密過(guò)程和解密過(guò)程使用相同的密碼蹲诀。主要分:分組加密照藻、序列加密其屏。 原理...
    御淺永夜閱讀 2,366評(píng)論 1 4
  • 1. 在上火喝了幾天粥之后评雌,分外想念世博一樓伪很。 外賣(mài)這幾家粥店都髓涯,特別難喝毛甲。只有白粥勉強(qiáng)像粥年叮,還總是涼的。 我總覺(jué)...
    龍姑娘的喵喵閱讀 252評(píng)論 0 0
  • 二十六:勿在分類(lèi)中聲明屬性 把封裝數(shù)據(jù)所用的全部屬性都定義在主接口里玻募。在"class-continuation分類(lèi)...
    蘇蘇咯閱讀 214評(píng)論 0 0