Android开发Android开发经验谈

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

2019-07-29  本文已影响9人  lance_小超

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

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

算法介绍

常见算法

算法特征

加密模式

填充方式

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

详情文章

上一篇 下一篇

猜你喜欢

热点阅读