美文网首页Android开发Android开发经验谈
JAVA加密系列(二)- 对称加密算法 DES、AES

JAVA加密系列(二)- 对称加密算法 DES、AES

作者: lance_小超 | 来源:发表于2019-07-29 17:24 被阅读9次

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

    详情文章

    相关文章

      网友评论

        本文标题:JAVA加密系列(二)- 对称加密算法 DES、AES

        本文链接:https://www.haomeiwen.com/subject/kgcirctx.html