JAVA加密系列(二)- 對稱加密算法 DES、AES

JAVA加密系列(二)- 對稱加密算法 DES、AES

採用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱爲對稱加密,也稱爲單密鑰加密。

算法介紹

常見算法

  • DES(Data Encryption Standard):數據加密標準,速度較快,適用於加密大量數據的場合;
  • 3DES(Triple DES):是基於DES,對一塊數據用三個不同的密鑰進行三次加密,強度更高;
  • AES(Advanced Encryption Standard):高級加密標準,是下一代的加密算法標準,速度快,安全級別高,支持128、192、256、512位密鑰的加密;

算法特徵

  • 加密方和解密方使用同一個密鑰;
  • 加密解密的速度比較快,適合數據比較長時的使用;
  • 密鑰傳輸的過程不安全,且容易被破解,密鑰管理也比較麻煩;

加密模式

  • ECB:電子密本模式
  • CBC:密文分組鏈接模式
  • CTR:計算器模式
  • CFB:加密反饋模式
  • OFB:輸出反饋模式

填充方式

  • NoPadding:不填充
  • PKCS5Padding:缺幾個字節就補充幾個字節的幾
  • PKCS7Padding:缺幾個字節就補幾個字節的0
  • ISO10126Padding:填充字符串由一個字節序列組成,此字節序列的最後一個字節填充字節序列的長度,其餘字節填充隨機數據

java當中支持NoPadding、PKCS5Padding(默認)、ISO10126Padding;

DES

DES-Data Encryption Standard,即數據加密算法。是IBM公司於1975年研究成功並公開發表的。DES算法的入口參數有三個:Key、Data、Mode。其中Key爲8個字節共64位,是DES算法的工作密鑰;Data也爲8個字節64位,是要被加密或被解密的數據;Mode爲DES的工作方式,有兩種:加密或解密。 DES算法把64位的明文輸入塊變爲64位的密文輸出塊,它所使用的密鑰也是64位。

工具類

public class DESUtil {

    //必須8位  否則會報錯  偏移量
    private static String IV = "12345678";
    //鑰匙  必須8位
    private static String KEY = "87654321";

    public static void main(String[] args) {
        //字符串編碼
        System.out.println("編碼結果:" + encrypt("hello word"));
        //字符串解碼
        System.out.println("編碼結果:" + decrypt("iug3JXsgvoWaRv0QF3cODw=="));
    }

    //加密
    public static String encrypt(String str) {
        try {
            byte[] bytes = str.getBytes();
            IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
            SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), "DES");
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
            bytes = cipher.doFinal(bytes);
            bytes = Base64.getEncoder().encode(bytes);
            return new String(bytes);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    //解密
    public static String decrypt(String str) {
        try {
            byte[] bytes = Base64.getDecoder().decode(str);
            IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
            SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), "DES");
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
            bytes = cipher.doFinal(bytes);
            return new String(bytes);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}

log
編碼結果:iug3JXsgvoWaRv0QF3cODw==
編碼結果:hello word

AES

密碼學中的高級加密標準(Advanced Encryption Standard,AES),又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣爲全世界所使用。

工具類

public class AESUtil {

    //必須16位  否則會報錯  偏移量
    private static String IV ="asdfgh1234567890";
    //鑰匙  必須16位
    private static String KEY = "1234567890asdfgh";

    public static void main(String[] args) {
        //字符串編碼
        System.out.println("編碼結果:" + encrypt("hello word"));
        //字符串解碼
        System.out.println("編碼結果:" + decrypt("UePyU9tACUkzOEHYFMUsNg=="));
    }

    //加密
    public static String encrypt(String str) {
        try {
            byte[] bytes = str.getBytes();
            IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
            SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
            bytes = cipher.doFinal(bytes);
            bytes = Base64.getEncoder().encode(bytes);
            return new String(bytes);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    //解密
    public static String decrypt(String str) {
        try {
            byte[] bytes = Base64.getDecoder().decode(str);
            IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
            SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
            bytes = cipher.doFinal(bytes);
            return new String(bytes);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}
log
編碼結果:UePyU9tACUkzOEHYFMUsNg==
編碼結果:hello word

總結

java多各種加密算法都有封裝,其實DES有很多同胞兄弟,如DESede(TripleDES)、AES、Blowfish、RC2、RC4(ARCFOUR)。這裏就不過多闡述了,大同小異,只要換掉ALGORITHM換成對應的值,同時做一個代碼替換SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);就可以了,此外就是密鑰長度不同了。後面有空再分析加密原理和性能

源碼下載

GitHub,感興趣的點個星星

詳情文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章