对称加密-SymmetricCrypto

    对于对称加密,封装了JDK的,具体介绍见:https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyGenerator

    • AES (默认)
    • ARCFOUR
    • Blowfish
    • DES (默认DES/ECB/PKCS5Padding)
    • DESede
    • RC2
    • PBEWithMD5AndDES
    • PBEWithSHA1AndDESede
    • PBEWithSHA1AndRC2_40

    使用

    以AES算法为例:

    1. String content = "test中文";
    2. byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DESede.getValue()).getEncoded();
    3. SymmetricCrypto des = new SymmetricCrypto(SymmetricAlgorithm.DESede, key);
    4. //加密
    5. byte[] encrypt = des.encrypt(content);
    6. //解密
    7. byte[] decrypt = des.decrypt(encrypt);
    8. //加密为16进制字符串(Hex表示)
    9. String encryptHex = des.encryptHex(content);
    10. //解密为字符串

    对于Java中AES的默认模式是:AES/ECB/PKCS5Padding,如果使用CryptoJS,请调整为:padding: CryptoJS.pad.Pkcs7

    • 快速构建
    1. String content = "test中文";
    2. // 随机生成密钥
    3. byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
    4. // 构建
    5. AES aes = SecureUtil.aes(key);
    6. // 加密
    7. byte[] encrypt = aes.encrypt(content);
    8. // 解密
    9. // 加密为16进制表示
    10. // 解密为字符串
    11. String decryptStr = aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
    • 自定义模式和偏移

    DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,Java中默认实现为:DES/CBC/PKCS5Padding

    • 快速构建
    1. byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();
    2. DES des = SecureUtil.des(key);
    • 自定义模式和偏移
    1. DES des = new DES(Mode.CTS, Padding.PKCS5Padding, "0CoJUm6Qyw8W8jud".getBytes(), "01020304".getBytes());

    在4.2.1之后,Hutool借助Bouncy Castle库可以支持国密算法,以SM4为例:

    我们首先需要引入Bouncy Castle库:

    1. String content = "test中文";
    2. SymmetricCrypto sm4 = new SymmetricCrypto("SM4");
    3. String encryptHex = sm4.encryptHex(content);
    4. String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);//test中文

    同样我们可以指定加密模式和偏移:

    1. String content = "test中文";
    2. SymmetricCrypto sm4 = new SymmetricCrypto("SM4/ECB/PKCS5Padding");
    3. String encryptHex = sm4.encryptHex(content);