DES加密解密(java)

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

一、DES

DES是一種對(duì)稱密碼算法,解密不是加密的逆序,而是使用同樣的加密步驟,使用次序相反加密密鑰。如果各輪加密密鑰分別是K1,K2,K3…K16,那么解密密鑰就是K16,K15,K14…K1。但是大多數(shù)情況下加解密都是使用同一個(gè)密鑰,密鑰的安全也是非常重要的,(可以將DES算法包括整個(gè)類(lèi)和加密密鑰等生成.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.常見(jiàn)錯(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寫(xiě)成了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 {
        //初始化加密和解密密碼提供類(lèi)
        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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容