DES加密解密(java)

無(wú)可厚非午乓,信息安全是互聯(lián)網(wǎng)技術(shù)中非常重要的一塊,所以覺得有必要系統(tǒng)學(xué)習(xí)一下幾種java的加密方法闸准。

一益愈、DES

DES是一種對(duì)稱密碼算法,解密不是加密的逆序夷家,而是使用同樣的加密步驟蒸其,使用次序相反加密密鑰。如果各輪加密密鑰分別是K1库快,K2摸袁,K3…K16,那么解密密鑰就是K16义屏,K15靠汁,K14…K1蜂大。但是大多數(shù)情況下加解密都是使用同一個(gè)密鑰,密鑰的安全也是非常重要的蝶怔,(可以將DES算法包括整個(gè)類和加密密鑰等生成.so文件來(lái)引用)奶浦。

1. DES算法的安全性和發(fā)展

DES的安全性首先取決于密鑰的長(zhǎng)度。密鑰越長(zhǎng)踢星,破譯者利用窮舉法搜索密鑰的難度就越大澳叉。目前,根據(jù)當(dāng)今計(jì)算機(jī)的處理速度和能力斩狱,56位長(zhǎng)度的密鑰已經(jīng)能夠被破解耳高,而128位的密鑰則被認(rèn)為是安全的,但隨著時(shí)間的推移所踊,這個(gè)數(shù)字也遲早會(huì)被突破。

2.常見錯(cuò)誤

報(bào)錯(cuò)如下:
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
原因和處理:我的原因是 mEncryptCipher.init(Cipher.ENCRYPT_MODE,getKey(KEY.getBytes()))中
的Cipher.ENCRYPT_MODE寫成了Cipher.DECRYPT_MODE這種低級(jí)錯(cuò)誤概荷;

2. 代碼實(shí)現(xiàn)

加密:

/**
 * Created by ljt on 2017/6/15.
 */
public class DesUtil {

    /** 對(duì)稱加解密DES密鑰Key*/
    public final static String KEY = "ItisImpor";

    private static Cipher mEncryptCipher = null;
    private static Cipher mDecryptCipher = null;


    public DesUtil() throws Exception {
        //初始化加密和解密密碼提供類
        mEncryptCipher = Cipher.getInstance("DES");
        mEncryptCipher.init(Cipher.ENCRYPT_MODE,getKey(KEY.getBytes()));
        mDecryptCipher = Cipher.getInstance("DES");
        mDecryptCipher.init(Cipher.DECRYPT_MODE,getKey(KEY.getBytes()));
    }

//   ****** 加密 ******

    /**
     * 對(duì) 字符串 加密
     * */
    public String encrypt(String strIn) throws Exception {
        return byte2HexStr(encrypt(strIn.getBytes()));
    }

    /**
     * 對(duì) 字節(jié)數(shù)組 加密
     */
    public byte[] encrypt(byte[] arrB) throws Exception {
        return mEncryptCipher.doFinal(arrB);
    }


//   ****** 解密 ******

    /**
     * 解密 字符串
     * */
    public String decrypt(String strIn) throws Exception {
        return new String(decrypt(hexStr2Byte(strIn)));
    }

    /**
     * 解密 字節(jié)數(shù)組
     */
    public byte[] decrypt(byte[] arrB) throws Exception {
        return mDecryptCipher.doFinal(arrB);
    }


    /**
     * 解密用的密鑰(字節(jié)數(shù)組)長(zhǎng)度必須為8個(gè)字節(jié)否則返回null, 不足8位時(shí)后面補(bǔ)0秕岛,超出8位只取前8位
     *
     * @param arrBTmp 構(gòu)成該字符串的字節(jié)數(shù)組
     * @return 生成的密鑰
     * @throws Exception
    */

    private Key getKey(byte[] arrBTmp) throws Exception {
        // 創(chuàng)建一個(gè)空的8位字節(jié)數(shù)組(默認(rèn)值為0)
        byte[] arrB = new byte[8];

        // 將原始字節(jié)數(shù)組轉(zhuǎn)換為8位
        for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
            arrB[i] = arrBTmp[i];
        }

        // 生成密鑰
        Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");

        return key;
    }

    /**
     * HEX轉(zhuǎn)碼 String to Byte
     */
    public static byte[] hexStr2Byte(String strIn) throws Exception {
        byte[] arrB = strIn.getBytes();
        int iLen = arrB.length;

        // 兩個(gè)字符表示一個(gè)字節(jié),所以字節(jié)數(shù)組長(zhǎng)度是字符串長(zhǎng)度除以2
        byte[] arrOut = new byte[iLen / 2];
        for (int i = 0; i < iLen; i = i + 2) {
            String strTmp = new String(arrB, i, 2);
            arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
        }
        return arrOut;
    }

    /**
     * HEX轉(zhuǎn)碼 Byte to  String
     */
    public static String byte2HexStr(byte[] arrB) throws Exception {
        int iLen = arrB.length;
        // 每個(gè)byte用兩個(gè)字符才能表示误证,所以字符串的長(zhǎng)度是數(shù)組長(zhǎng)度的兩倍
        StringBuffer sb = new StringBuffer(iLen * 2);
        for (int i = 0; i < iLen; i++) {
            int intTmp = arrB[i];
            // 把負(fù)數(shù)轉(zhuǎn)換為正數(shù)
            while (intTmp < 0) {
                intTmp = intTmp + 256;
            }
            // 小于0F的數(shù)需要在前面補(bǔ)0
            if (intTmp < 16) {
                sb.append("0");
            }
            sb.append(Integer.toString(intTmp, 16));
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        try {

            System.out.println("加密前:");
            DesUtil des = new DesUtil();
            String pwd = des.encrypt("12345uvwxwz");
            System.out.println("加密后:" + pwd);
            pwd = des.decrypt(pwd);
            System.out.println("解密密后:" + pwd);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

修改幾遍Key值可以發(fā)現(xiàn):
1继薛、key中只有8個(gè)字節(jié)有用,如果使用前面8個(gè)愈捅,則第8個(gè)字節(jié)后面的字符不影響加密解密遏考;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蓝谨,隨后出現(xiàn)的幾起案子灌具,更是在濱河造成了極大的恐慌,老刑警劉巖譬巫,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咖楣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡芦昔,警方通過(guò)查閱死者的電腦和手機(jī)诱贿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門环葵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)熄驼,“玉大人,你說(shuō)我怎么就攤上這事荠诬∑竞溃” “怎么了焙蹭?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)墅诡。 經(jīng)常有香客問我壳嚎,道長(zhǎng)桐智,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任烟馅,我火速辦了婚禮说庭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郑趁。我一直安慰自己刊驴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布寡润。 她就那樣靜靜地躺著捆憎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梭纹。 梳的紋絲不亂的頭發(fā)上躲惰,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音变抽,去河邊找鬼础拨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绍载,可吹牛的內(nèi)容都是我干的诡宗。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼击儡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼塔沃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起阳谍,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛀柴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后边坤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體名扛,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年茧痒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肮韧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旺订,死狀恐怖弄企,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情区拳,我是刑警寧澤拘领,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站樱调,受9級(jí)特大地震影響约素,放射性物質(zhì)發(fā)生泄漏届良。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一圣猎、第九天 我趴在偏房一處隱蔽的房頂上張望士葫。 院中可真熱鬧,春花似錦送悔、人聲如沸慢显。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)荚藻。三九已至,卻和暖如春洁段,著一層夾襖步出監(jiān)牢的瞬間应狱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工眉撵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侦香,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓纽疟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親憾赁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子污朽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • 本文主要介紹移動(dòng)端的加解密算法的分類、其優(yōu)缺點(diǎn)特性及應(yīng)用龙考,幫助讀者由淺入深地了解和選擇加解密算法蟆肆。文中會(huì)包含算法的...
    蘋果粉閱讀 11,524評(píng)論 5 29
  • 概述 之前一直對(duì)加密相關(guān)的算法知之甚少,只知道類似DES晦款、RSA等加密算法能對(duì)數(shù)據(jù)傳輸進(jìn)行加密炎功,且各種加密算法各有...
    Henryzhu閱讀 3,023評(píng)論 0 14
  • 引言 如今手機(jī)app五彩繽紛蛇损,確保手機(jī)用戶的數(shù)據(jù)安全是開發(fā)人員必須掌握的技巧,下面通過(guò)實(shí)例介紹DES在androi...
    freesan44閱讀 1,146評(píng)論 1 1
  • 最近在做spark和hbase的相關(guān)項(xiàng)目坛怪。暫且將其分為兩部分:一是利用spark streaming消費(fèi)前臺(tái)推到k...
    帝國(guó)精英閱讀 1,865評(píng)論 0 1
  • 我把一切定義在了光明和傾城之間淤齐,無(wú)法去套用昆侖的低賤,你可以得到最強(qiáng)的男人的寵愛袜匿,但你永遠(yuǎn)得不到真愛更啄,除非時(shí)光...
    柳昕薇絮閱讀 165評(píng)論 0 2