对称加密AES

AES 简介

DES的密钥长度是56bit,随着计算能力的提升,已经不能保证安全了。
DES标准的秘钥长度要求太短,安全性不够。所以被AES加密方式取代。
AES算法被称为 Rijndael 算法
AES的区块长度固定为128位,密钥长度则可以是128 bit,192 bit 或256位 bit 。换算成字节长度,就是密码必须是 16个字节,24个字节,32个字节。AES密码的长度更长了,破解难度就增大了,所以就更安全。

AES属于块加密

对明文进行分段,然后对每段明文进行加密,最后再拼成一个字符串。块加密的一个要面临的问题就是如何填满最后一块?所以这就是PADDING的作用,使用各种方式填满最后一块字符串,所以对于解密端,也需要用同样的PADDING来找到最后一块中的真实数据的长度。

加密 - 图1

对称加密:加密秘钥和解密秘钥是一样的
AES 是对称加密算法,优点:加密速度快;缺点:如果秘钥丢失,就容易解密密文,安全性相对比较差

IV称为初始向量
AES加密需要:明文 + 密钥+ 偏移量(IV)+密码模式(算法/模式/填充)
AES解密需要:密文 + 密钥+ 偏移量(IV)+密码模式(算法/模式/填充)

填充模式

为对称密钥加密设计的块密码工作模式要求输入明文长度必须是块长度的整数倍,因此信息必须填充至满足要求。
image.png

AES的算法模式一般为 AES/CBC/PKCS5Padding

  • AES,加解密算法
  • CBC,数据分组模式
  • PKCS5Padding,数据按照一定的大小进行分组,最后分剩下那一组,不够长度,就需要进行补齐, 也可以叫 补齐模式

举例:
36 位的 UUID,如果按照 block size=16 字节(即 128 比特),那么就需要补齐到 48 位,差 12 个字节。那么最后填充的 12 个字节的内容,都是字节表示的 0x0c(即 12)

IV偏移量

偏移量 的添加一般是为了增加 AES 加密的复杂度,增加数据的安全性。一般在 AES_256 中会使用到 偏移量 ,而在 AES_128 加密中不会使用到。

字符集

在 AES 加密中,特别也要注意到字符集的问题。一般用到的字符集是 utf-8 和 gbk 。

实际工作中的加密流程

在实际的工作中,客户端跟服务器交互一般都是字符串格式,所以一个比较好的加密流程是:
加密流程 :明文通过 密钥 (有时也需要 偏移量 ),利用 AES 加密算法,然后通过 Base64 转码,最后生成加密后的字符串。
解密流程 :加密后的字符串通过 密钥 (有时也需要 偏移量 ),利用 AES 解密算法,然后通过 Base64 转码,最后生成解密后的字符串。

AES 加密/解密 注意的问题

  1. AES 加密/解密 使用相同的密钥
  2. 若涉及到偏移量,则AES 加密/解密 使用的偏移量要一样
  3. AES 加密/解密 要使用相同加密数位,如都使用**AES_256**
  4. AES 加密/解密 使用相同的字符集
  5. AES 加密/解密 使用相同的加密,填充模式,如都使用`AES/CBC/PKCS5Padding模
  1. private final static String password = "1234567812345678";//目前使用
  2. private final static String IV = "1234567812345678";//目前使用
  3. public static String decryptAES(String content) throws Exception {
  4. byte[] contentNew = Base64.decodeBase64(content);
  5. SecretKeySpec skeySpec = new SecretKeySpec(password.getBytes("UTF-8"), "AES");
  6. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); // "算法/模式/补码方式"
  7. cipher.init(Cipher.DECRYPT_MODE, skeySpec);
  8. return new String(cipher.doFinal(contentNew));
  9. }

参考链接: https://blog.csdn.net/zhaoyanjun6/article/details/120285594

非对称加密RSA

非对称加密:加密秘钥和解密秘钥是不一样的
RSA 是非对称加密算法 , 优点:安全 ;缺点:加密速度慢

使用同一个RSA公钥对同一段数据加密,两次加密的结果不一样。
这个问题跟对数据的padding即填充有关,详细说来,是跟PKCS #1 v1.5指定的padding方式有关