AES加密解密以及base64编解码浅析

1,142 阅读4分钟

AES:一种高级加密标准(英语:Advanced Encryption Standard,缩写:AES)在密码学中又称Rijndael加密法,这个标准用来替代原先的DES(数据加密标准),是对称密钥加密中最流行的算法之一。

密钥:AES要求密钥的长度可以是128位16个字节,192位或256位,位数越高,加密强度自然越大,但是加密的效率自然会低一些,因此要做好衡量,我们开发通常采用128位16个字节的密钥,我们使用AES加密时需要主动提供密钥,而且只需要提供一个密钥就够了,每段数据加密使用的都是这一个密钥,密钥来源为随机生成。

五种加密模式:AES一共有五种加密模式,分别是ECB(Electronic Codebook,电码本模式), ECB模式一般只适用于小数据量的字符信息的安全性保护,例如密钥保护。,CBC(Cipher Block Chaining,密码分组链接模式),CTR(计算器模式),CFB(密码反馈模式),OFB(输出反馈模式)

Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法,由于 2^6=64,所以每 6 个比特为一个单元,对应某个可打印字符。

Base64 常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括 MIME 的电子邮件及 XML 的一些复杂数据。

Base64 编码要求把 3 个 8 位字节(3 * 8=24)转化为 4 个 6 位的字节(4*6=24),之后在 6 位的前面补两个 0,形成 8 位一个字节的形式。 如果剩下的字符不足 3 个字节,则用 0 填充,输出字符使用 =,因此编码后输出的文本末尾可能会出现 1 或 2 个 =。

为了保证所输出的编码位可读字符,Base64 制定了一个编码表,以便进行统一转换。编码表的大小为 2^6=64,这也是 Base64 名称的由来。

在 Base64 中的可打印字符包括字母 A-Za-z、数字 0-9,这样共有 62 个字符,此外两个可打印符号在不同的系统中而不同。

截屏2023-04-12 15.05.51.png

截屏2023-04-12 15.07.48.png

加解密的世界很复杂,对称加密、非对称加密。java内容-使用工具类实现:

截屏2023-04-12 15.57.08.png

加密及编码

    public String encrypt(String encryptKey, String data) throws Exception{
        //创建密码器 AlgorithmProvider("AES/ECB/PKCS5Padding")-加密器
        Cipher cipher = Cipher.getInstance(AlgorithmProvider);
        //初始化 encryptKey-加密key data-要加密的json数据 encoding-编码("utf-8") Algorithm-("AES")
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(encoding),Algorithm));
        byte[] result = cipher.doFinal(data.getBytes(encoding));
        //编码
        BASE64Encoder base64 = new BASE64Encoder();
        return base64.encode(result);
    }

解码及解密

    public String decrypt(String decryptKey, String data) throws Exception{
        //创建密码器 AlgorithmProvider("AES/ECB/PKCS5Padding")-加密器
        Cipher cipher = Cipher.getInstance(AlgorithmProvicer);
        //初始化 decryptKey-解密key data-要解密数据 encoding-编码("utf-8") Algorithm-("AES")
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(encoding), Algorithm));
        BASE64Decoder base64 =  BASE64Decoder();
        //解码
        byte[] decoderResult = base64.decodeBuffer(data);
        //解密
        byte[] result = cipher.doFinal(decoderResult);
        return new String(result, encoding);
    }  

MD5

通俗的讲,MD5 算法能对一串输入生成一串唯一的不可逆的 128 bit 的 0 和 1 的二进制串信息。

不同的输入,输出就会不一样,即使只做了细微修改,两者输出仍旧毫无规律而言。

另外,因为经过 MD5 计算后输出是 128 bit 的 0 和 1 二进制串,但通常都是用十六进制来表示比较友好,1个十六进制是 4 个 bit,128 / 4 = 32,所以常说的 32 位的 MD5 指的是用十六进制来表示的输出串。

那么,为什么还会有 16 位的 MD5 值?其实也就是嫌 32 位的数据太长了,所以去掉开头 8 位,末尾 8 位,截取中间的 16 位来作为 MD5 的输出值。

所以,MD5 算法的输出只有一种:128 bit 的二进制串,而通常结果都用十六进制表示而已,32 位与 16 位的只是精度的区别而已。

MD5 的应用

应用场景很多:数字签名、身份校验、完整性(一致性)校验等等。

参考文档:

1.www.cnblogs.com/dasusu/p/94…

2.c.runoob.com/front-end/6…

3.www.cnblogs.com/huiyichanmi…