AES算法图文讲解

假设有一个发送方在向接收方发送消息。如果没有任何加密算法,接收方发送的是一个明文消息:“我是小灰”

如果消息被中间人截获到,即使中间人无法篡改消息,也可以窥探到消息的内容,从而暴露了通信双方的私密。

因此我们不再直接传送明文,而改用对称加密的方式传输密文,画风就变成了下面这样:

具体工作的步骤如下:

1.发送方利用密钥123456,加密明文“我是小灰”,加密结果为TNYRvx+SNjZwEK+ZXFEcDw==。

2.发送方把加密后的内容TNYRvx+SNjZwEK+ZXFEcDw==传输给接收方。

3.接收方收到密文TNYRvx+SNjZwEK+ZXFEcDw==,利用密钥123456还原为明文“我是小灰”。

1.密钥

密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥

AES支持三种长度的密钥:

128位,192位,256位

平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。

2.填充

要想了解填充的概念,我们先要了解AES的分组加密特性。

什么是分组加密呢?我们来看看下面这张图:

AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个铭文块长度128bit。

这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。

但是这里涉及到一个问题:

假如一段明文长度是196bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding)。

NoPadding:

不做任何填充,但是要求明文必须是16字节的整数倍。

PKCS5Padding(默认):

如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。

比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}

ISO10126Padding:

如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。

比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则可能补全为{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}

3.模式

AES的工作模式,体现在把明文块加密成密文块的处理过程中。AES加密算法提供了五种不同的工作模式:

CBC、ECB、CTR、CFB、OFB

模式之间的主题思想是近似的,在处理细节上有一些差别。我们这一期只介绍各个模式的基本定义。

CBC模式:

电码本模式 Electronic Codebook Book

ECB模式(默认):

密码分组链接模式 Cipher Block Chaining

CTR模式:

计算器模式 Counter

CFB模式:

密码反馈模式 Cipher FeedBack

OFB模式:

输出反馈模式 Output FeedBack

1. kgen.init传入的第一个参数128决定了密钥的长度是128bit

2. Cipher.getInstance("AES/CBC/NoPadding")决定了AES选择的填充方式是NoPadding,工作模式是CBC模式。

几点补充:

1.我们在调用封装好的AES算法时,表面上使用的Key并不是真正用于AES加密解密的密钥,而是用于生成真正密钥的“种子”。

2.填充明文时,如果明文长度原本就是16字节的整数倍,那么除了NoPadding以外,其他的填充方式都会填充一组额外的16字节明文块。

授权转自:程序员小灰

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AES(Advanced Encryption Standard)是一种对称加密算法,它的密钥长度可以为 128、192 或 256 位,是目前应用最广泛的加密算法之一。AES算法的加密和解密过程都是通过将明文和密钥进行一系列的替代、置换、混淆等操作来完成的。下面简单介绍一下AES算法的加密和解密过程。 加密过程: 1. 密钥扩展:根据密钥长度进行密钥扩展,得到一组轮密钥。 2. 初始轮:将明文与第 0 轮轮密钥进行异或运算。 3. 多轮加密:AES算法中有 10 轮加密(128位密钥)、12 轮加密(192位密钥)或 14 轮加密(256位密钥),每轮都包括字节替代、行移位、列混淆和轮密钥加四个操作。其中字节替代、行移位和列混淆是线性操作,轮密钥加是非线性操作。 4. 最终轮:在最后一轮加密中,省略列混淆操作。 5. 输出密文:得到加密后的密文。 解密过程: 1. 密钥扩展:根据密钥长度进行密钥扩展,得到一组轮密钥。 2. 初始轮:将密文与第 0 轮轮密钥进行异或运算。 3. 多轮解密:与加密过程相反,AES算法中有 10 轮解密(128位密钥)、12 轮解密(192位密钥)或 14 轮解密(256位密钥),每轮都包括列混淆的逆操作、行移位的逆操作、字节替代的逆操作和轮密钥加四个操作。 4. 最终轮:在最后一轮解密中,省略列混淆的逆操作。 5. 输出明文:得到解密后的明文。 Java代码实现: ``` import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; public class AES { public static void main(String[] args) throws Exception { String plaintext = "Hello, world!"; // 明文 String key = "1234567812345678"; // 密钥(长度必须为 16、24 或 32 个字符) byte[] data = plaintext.getBytes("UTF-8"); byte[] keyData = key.getBytes("UTF-8"); SecretKeySpec keySpec = new SecretKeySpec(keyData, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, keySpec); byte[] encryptedData = cipher.doFinal(data); System.out.println("密文:" + new String(encryptedData, "UTF-8")); cipher.init(Cipher.DECRYPT_MODE, keySpec); byte[] decryptedData = cipher.doFinal(encryptedData); System.out.println("明文:" + new String(decryptedData, "UTF-8")); } } ``` 输出结果为: ``` 密文:���2*�a�빥�/�,� 明文:Hello, world! ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值