前言
首先,希望大家耐心点,这个加密我也是弄很久才出来的,辛辛苦苦整理的博客,介绍大概概念就进入正题!
上面是基本介绍,后面是个人经历的问题及解决方案,希望你们耐心看,不要踩我进过的坑啦!祝你们都能顺利解决问题✌️
1. 介绍
1.1 AES是什么?
分组密码算法,旨在取代 DES 成为广泛使用的标准。
1.2 AES详解
AES 根据使用密码长度有三种方案以应对不同的场景要求,分别是 AES-128、AES-192 和 AES-256。加密模式有四种,分别是 ECB(Elecyronic Code Book,电子密码本)、CBC(Cipher Block Chaining,加密块链)、CFB(Cipher FeedBack Mode,加密反馈)、OFB(Output FeedBack,输出反馈)。
需要和后台统一四个东西:秘钥长度、加密模式、填充方式、初始向量(也称偏移量,ECB模式不需要)。
定义中说到 AES 是一个对称分组密码算法,加密原理如图:
AES 加密原理
1.3 实现原理和比较
这个就比较深入啦,有兴趣的自行查看~
实现原理
比较
1.4 模式和填充选择
算法/模式/填充
16字节加密后数据长度
不满16字节加密后长度
AES/CBC/NoPadding
16
不支持
AES/CBC/PKCS5Padding
32
16
AES/CBC/ISO10126Padding
32
16
AES/CFB/NoPadding
16
原始数据长度
AES/CFB/PKCS5Padding
32
16
AES/CFB/ISO10126Padding
32
16
AES/ECB/NoPadding
16
不支持
AES/ECB/PKCS5Padding
32
16
AES/ECB/ISO10126Padding
32
16
AES/OFB/NoPadding
16
原始数据长度
AES/OFB/PKCS5Padding
32
16
AES/OFB/ISO10126Padding
32
16
AES/PCBC/NoPadding
16
不支持
AES/PCBC/PKCS5Padding
32
16
AES/PCBC/ISO10126Padding
32
16
PKCS7Padding VS PKCS5Padding:
PKCS5Padding 的 blocksize 为8字节,而 PKCS7Padding 的 blocksize 可以为1到255字节。
需要注意点:
1. iOS只支持 PKCS7Padding 填充方式;Java 支持 PKCS5Padding 但不支持 PKCS7Padding,不过不要担心,上面说的区别我也不懂,实际中倒是一样;
2. node.js 在 AES 加密上和其他语言有略不同,它系统自带方法对 Key 进行过 MD5 处理。
2. 经验总结
2.1 加密模式和填充方式的确定
首先