Java安全編程:DES加密解密

安全 DES

  • DES加密是最常用的對(duì)稱加密算法之一空郊。
  • 所謂“對(duì)稱加密”指的就是從明文加密到密文和從密文解密到明文用的都是相同的一套密鑰與之相對(duì)應(yīng)的就是“非對(duì)稱加密”。
  • 其它常見的對(duì)稱加密算法還有IDEA具帮、RC2避咆、RC4镶骗、SKIPJACK、RC5厉碟、AES等喊巍。
  • DES加密可以給字節(jié)數(shù)組加密,也可以給文件加密箍鼓。
  • 當(dāng)然在加解密之前我們需要獲取密鑰崭参,獲取密鑰可以通過我們給定的字節(jié)數(shù)組或者生成一個(gè)隨機(jī)的密鑰。密鑰其實(shí)就是一個(gè)8個(gè)長度的字節(jié)數(shù)組款咖。
/**
 * 生成一個(gè)隨機(jī)的DES密鑰
 * @throws Exception
 */
public static Key randomKey() throws Exception{
    KeyGenerator generator = KeyGenerator.getInstance("DES");
    SecretKey key = generator.generateKey();
    byte[] arrKey = key.getEncoded();
    System.out.println(Arrays.toString(arrKey));
    System.out.println("密鑰Base64轉(zhuǎn)碼:" + Base64.encodeBase64String(arrKey));
    System.out.println("密鑰16進(jìn)制顯示:" + Hex.encodeHexString(arrKey));
    return key;
}
/**
 * 根據(jù)byte數(shù)組獲得密鑰對(duì)象
 * @param arrKey
 * @return
 * @throws Exception
 */
public static Key getKey(byte[] arrKey) throws Exception {
    //實(shí)例化DES密鑰材料
    DESKeySpec spec = new DESKeySpec(arrKey);
    //實(shí)例化DES密鑰工廠
    SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
    return factory.generateSecret(spec);
}

從DESKeySpec類的構(gòu)造函數(shù)中可以看出何暮,只能傳入一個(gè)8位的字節(jié)數(shù)組實(shí)例化。

public DESKeySpec(byte abyte0[])
    throws InvalidKeyException
{
    this(abyte0, 0);
}

public DESKeySpec(byte abyte0[], int i)
    throws InvalidKeyException
{
    if(abyte0.length - i < 8)
    {
        throw new InvalidKeyException("Wrong key size");
    } else
    {
        a = new byte[8];
        System.arraycopy(abyte0, i, a, 0, 8);
        return;
    }
}

獲得密鑰后我們就可以進(jìn)行字節(jié)數(shù)組和文件的加解密工作之剧。

/**
 * 加密字節(jié)數(shù)組形式的數(shù)據(jù)
 * @param data
 * @param key
 * @return
 * @throws Exception
 */
public static byte[] encryptByteArr(byte[] data, Key key) throws Exception {
    // using DES in ECB mode
    Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
    // 用密匙初始化Cipher對(duì)象
    cipher.init(Cipher.ENCRYPT_MODE, key);
    return cipher.doFinal(data);
}
/**
 * 解密字節(jié)數(shù)組形式的密文
 * @param data
 * @param key
 * @return
 * @throws Exception
 */
public static byte[] decryptByteArr(byte[] data, Key key) throws Exception {
    // using DES in ECB mode
    Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
    // 用密匙初始化Cipher對(duì)象
    cipher.init(Cipher.DECRYPT_MODE, key);
    return cipher.doFinal(data);
}
/**
 * DES加密文件
 * @param file 明文文件
 * @param dest 加密后的密文文件
 * @param key 密鑰
 * @throws NoSuchAlgorithmException
 * @throws NoSuchPaddingException
 * @throws InvalidKeyException
 * @throws IOException
 */
public static void encryptFile(File file, File dest, Key key)
        throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
    Cipher cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    InputStream is = new FileInputStream(file);
    OutputStream out = new FileOutputStream(dest);
    CipherInputStream cis = new CipherInputStream(is, cipher);
    byte[] buffer = new byte[1024];
    int r;
    while ((r = cis.read(buffer)) > 0) {
        out.write(buffer, 0, r);
    }
    cis.close();
    is.close();
    out.close();
}
/**
 * DES解密文件
 * @param file 需要解密的密文文件
 * @param dest 解密出的明文文件
 * @param key 密鑰
 * @throws NoSuchAlgorithmException
 * @throws NoSuchPaddingException
 * @throws InvalidKeyException
 * @throws IOException
 */
public static void decryptFile(File file, File dest, Key key)
        throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
        IOException {
    Cipher cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.DECRYPT_MODE, key);
    InputStream is = new FileInputStream(file);
    OutputStream out = new FileOutputStream(dest);
    CipherInputStream cis = new CipherInputStream(is, cipher);
    byte[] buffer = new byte[1024];
    int r;
    while ((r = cis.read(buffer)) > 0) {
        out.write(buffer, 0, r);
    }
    cis.close();
    is.close();
    out.close();
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郭卫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子背稼,更是在濱河造成了極大的恐慌贰军,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蟹肘,死亡現(xiàn)場(chǎng)離奇詭異词疼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)帘腹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門贰盗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阳欲,你說我怎么就攤上這事舵盈。” “怎么了球化?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵秽晚,是天一觀的道長。 經(jīng)常有香客問我筒愚,道長赴蝇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任巢掺,我火速辦了婚禮句伶,結(jié)果婚禮上劲蜻,老公的妹妹穿的比我還像新娘。我一直安慰自己考余,他們只是感情好先嬉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秃殉,像睡著了一般坝初。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钾军,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音绢要,去河邊找鬼吏恭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛重罪,可吹牛的內(nèi)容都是我干的樱哼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼剿配,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼搅幅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呼胚,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤茄唐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蝇更,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沪编,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年年扩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚁廓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厨幻,死狀恐怖相嵌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情况脆,我是刑警寧澤饭宾,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站漠另,受9級(jí)特大地震影響捏雌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笆搓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一性湿、第九天 我趴在偏房一處隱蔽的房頂上張望纬傲。 院中可真熱鬧,春花似錦肤频、人聲如沸叹括。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汁雷。三九已至,卻和暖如春报咳,著一層夾襖步出監(jiān)牢的瞬間侠讯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工暑刃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厢漩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓岩臣,卻偏偏與公主長得像溜嗜,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子架谎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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

  • 本文主要介紹移動(dòng)端的加解密算法的分類炸宵、其優(yōu)缺點(diǎn)特性及應(yīng)用,幫助讀者由淺入深地了解和選擇加解密算法谷扣。文中會(huì)包含算法的...
    蘋果粉閱讀 11,519評(píng)論 5 29
  • Android安全加密專題文章索引 Android安全加密:對(duì)稱加密 Android安全加密:非對(duì)稱加密 Andr...
    JackChen1024閱讀 1,188評(píng)論 0 11
  • 隨著對(duì)于安全度的不斷要求,對(duì)于數(shù)據(jù)加解密與破解之間的斗爭(zhēng)在塔,加解密的方式也在不斷發(fā)生著變化幻件,來看看現(xiàn)在流行的一些加解...
    zhouhao_180閱讀 2,092評(píng)論 1 12
  • 有些路,我們走到一半就走不下去了;有些路蛔溃,我們咬著牙走了很久绰沥,卻始終也沒能走到終點(diǎn)。
    乾立風(fēng)中閱讀 92評(píng)論 0 0
  • 朵朵是今天第一個(gè)到班級(jí)的小朋友哦贺待!今天的新任務(wù)是學(xué)會(huì)使用飲水棒徽曲,Ida剛拿出來展示,朵朵就非常感興趣了麸塞。Ida說每...
    ic班閱讀 126評(píng)論 0 0