玻璃猫 程序员小灰

漫画:什么是AES算法?_Java



漫画:什么是AES算法?_Java_02



漫画:什么是AES算法?_Java_03



漫画:什么是AES算法?_Java_04



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


漫画:什么是AES算法?_Java_05



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

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


漫画:什么是AES算法?_Java_06



具体工作的步骤如下:


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


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


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



漫画:什么是AES算法?_Java_07



漫画:什么是AES算法?_Java_08



漫画:什么是AES算法?_Java_09



漫画:什么是AES算法?_Java_10





漫画:什么是AES算法?_Java_11



1.密钥


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


AES支持三种长度的密钥:

128位,192位,256位


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



漫画:什么是AES算法?_Java_12



漫画:什么是AES算法?_Java_13



2.填充

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


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


漫画:什么是AES算法?_Java_14



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


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


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


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



漫画:什么是AES算法?_Java_15



漫画:什么是AES算法?_Java_16




漫画:什么是AES算法?_Java_17




漫画:什么是AES算法?_Java_18



3.模式


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


CBC、ECB、CTR、CFB、OFB


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


CBC模式:

电码本模式    Electronic Codebook Book


ECB模式(默认):

密码分组链接模式    Cipher Block Chaining


CTR模式:

计算器模式    Counter


CFB模式:

密码反馈模式    Cipher FeedBack


OFB模式:

输出反馈模式    Output FeedBack



漫画:什么是AES算法?_Java_19


漫画:什么是AES算法?_Java_20



漫画:什么是AES算法?_Java_21



漫画:什么是AES算法?_Java_22



漫画:什么是AES算法?_Java_23



漫画:什么是AES算法?_Java_24



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


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



漫画:什么是AES算法?_Java_25



几点补充:


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


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


最后为大家介绍一位猎头朋友,有求职意向的小伙伴可以联系她:


高端职位招聘猎头judy(张自景),擅长各种技术、产品和运营类职位,运营C轮以上和知名互联网公司,希望有机会共同探讨互联网的现在和将来。

微信号:zhangjin084846





—————END—————