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,感兴趣的点个星星

详情文章

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