Java DES 使用方法

天星技術團隊發表於2018-08-31
作者:玄夜 時間:2018-8-31

前言

演算法,永不過時!

· 簡介

DES全稱為Data Encryption Standard,即資料加密標準,是一種使用金鑰加密的塊演算法,1977年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),並授權在非密級政府通訊中使用,隨後該演算法在國際上廣泛流傳開來。需要注意的是,在某些文獻中,作為演算法的DES稱為資料加密演算法(Data Encryption Algorithm,DEA),已與作為標準的DES區分開來(百度百科抄的)。

· 常用加密模式

ECB:電子密本模式

CBC:密文分組連結模式

CTR:計算器模式

CFB:加密反饋模式

OFB:輸出反饋模式

· 填充方式

我看了很多的文章,但是很多都沒有詳細寫上填充方式啊、偏移量什麼的,只是簡單的將程式碼貼出來,很容易看得稀裡糊塗的,一時心血來潮,就自己也來整理一份了。

NoPadding:不填充

PKCS5Padding:缺幾個位元組就補充幾個位元組的幾;

PKCS7Padding:缺幾個位元組就補幾個位元組的0;

ISO10126Padding:填充字串由一個位元組序列組成,此位元組序列的最後一個位元組填充位元組序列的長度,其餘位元組填充隨機資料;

java當中支援NoPadding、PKCS5Padding(預設)、ISO10126Padding;

· 偏移量

概念就不多解釋了,在java的IvParameterSpec中,偏移量必須是8位的,否則直接報錯

Java DES 使用方法

· 乾貨

這裡重點講下CBC模式,其他的就不一一講了,自己可以換下引數:

1、第一步,將資料按照8個位元組一組進行分組,A1A2...An,分組不是8的整數倍那就要用到資料填充了;

2、第一組資料A1與向量I異或後的結果進行DES加密得到第一組密文B1(向量I,也叫偏移量,ECB模式是沒有的;如果明文中有兩個分組的內容相同,ECB會得到完全一樣的密文,但CBC則不會);

3、第二組資料A2與第一組的加密結果B1異或以後的結果進行DES加密,得到第二組密文B2,如此類推,把資料串起來最後得到的B1B2B3......Bn就是加密結果。

· 工具類

public class DES {
    // 對稱加密,這裡不用在意為什麼寫了兩行,都是一樣的,
    private static String encryptKey = "6c12b11d";
    private static String decryptKey = "6c12b11d";

    // 向量/偏移量
    private static String ivStr = "166290ac";
    private static byte[] iv = ivStr.getBytes();


    //加密
    public static String encryptDES(String encryptString) throws Exception {
        IvParameterSpec zeroIv = new IvParameterSpec(iv);
        SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
        byte[] encryptedData = cipher.doFinal(encryptString.getBytes());

        return Base64.encode(encryptedData);
    }


    //解密
    public static String decryptDES(String decryptString) throws Exception {
        byte[] byteMi = new Base64().decode(decryptString);
        IvParameterSpec zeroIv = new IvParameterSpec(iv);
        SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES");
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
        byte decryptedData[] = cipher.doFinal(byteMi);

        return new String(decryptedData);
    }
}
複製程式碼

· 執行程式碼

        String text = "中華人民共和國萬歲!!!";
        String result1 = DES.encryptDES(text);
        String result2 = DES.decryptDES(result1);
        System.out.println(result1);
        System.out.println(result2);
複製程式碼

· 執行結果

Java DES 使用方法

粉絲QQ群:557247785

炮友們有問題,請留言 感謝!

相關文章