DYUE.TOP - AES
type: channel
link: https://www.dyue.top/index.php/tag/AES
items: AES加密算法的详细介绍与实现

AES加密算法的详细介绍与实现
type: item
date: 2017-02-19T08:53:54+08:00
description: AES简介高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥，具体的加密流程如下： 下面简单介绍下各个部分的作用与意义：明文P没有经过加密的数据。密钥K用来加密明文的密码，[AES加密算法的详细介绍与实现]对称加密算法中，加密与解密的密钥是相同的。密钥为接收方与发送方协商产生，但不可以直接[AES加密算法的详细介绍与实现]网络上传输，否则会导致密钥泄漏，通常是通过非对称加密算法加密密钥，然后再通过网络传输给对方，或者直接面对面商量密钥。密钥是绝对不可以泄漏的，否则会被攻击者还原密文，窃取机密数据。AES加密函数设AES加密函数为E，则 C = E(K, P),其中P为明文，K为密钥，C为密文。也就是说，把明文P和密钥K作为加密函数的参数输[AES加密算法的详细介绍与实现]，则加密函数E会输出密文C。密文C经加密函数处理后的数据AES解密函数设AES解密函数为D，则 P = D(K, C),其中C为密文，K为密钥，P为明文。也就是说，把密文C和密钥K作为解密函数的参数输[AES加密算法的详细介绍与实现]，则解密函数会输出明文P。AES加密算法的详细介绍与实现[AES加密算法的详细介绍与实现]简单介绍下对称加密算法与非对称加密算法的区别。对称加密算法加密和解密用到的密钥是相同的，[AES加密算法的详细介绍与实现]种加密方式加密速度非常快，适合经常发送数据的场合。缺点是密钥的传输比较麻烦。非对称加密算法加密和解密用的密钥是不同的，[AES加密算法的详细介绍与实现]种加密方式是用数学上的难解问题构造的，通常加密解密的速度比较慢，适合偶尔发送数据的场合。优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。实际中，一般是通过RSA加密AES的密钥，传输到接收方，接收方解密得到AES密钥，然后发送方和接收方用AES密钥来通信。本文下面AES原理的介绍参考自《现代密码学教程》，AES的实现[AES加密算法的详细介绍与实现]介绍完原理后开始。AES的基本结构AES为分组密码，分组密码也就是把明文分成一组一组的，每组长度相等，每次加密一组数据，直到加密完整个明文。[AES加密算法的详细介绍与实现]AES标准规范中，分组长度只能是128位，也就是说，每个分组为16个字节（每个字节8位）。密钥的长度可以使用128位、192位或256位。密钥的长度不同，推荐加密轮数也不同，如下表所示：AES密钥长度（32位比特字)分组长度(32位比特字)加密轮数AES-1284410AES-1926412AES-2568414轮数[AES加密算法的详细介绍与实现]下面介绍，AES加密算法的详细介绍与实现实现的是AES-128，也就是密钥的长度为128位，加密轮数为10轮。 上面说到，AES的加密公式为C = E(K,P)，[AES加密算法的详细介绍与实现]加密函数E中，会执行一个轮函数，并且执行10次[AES加密算法的详细介绍与实现]个轮函数，[AES加密算法的详细介绍与实现]个轮函数的前9次执行的操作是一样的，只有第10次有所不同。也就是说，一个明文分组会被加密10轮。AES的核心就是实现一轮中的所有操作。AES的处理单位是字节，128位的输[AES加密算法的详细介绍与实现]明文分组P和输[AES加密算法的详细介绍与实现]密钥K都被分成16个字节，分别记为P = P0 P1 … P15 和 K = K0 K1 … K15。如，明文分组为P = abcdefghijklmnop,其中的字符a对应P0，p对应P15。一般地，明文分组用字节为单位的正方形矩阵AES加密算法的详细介绍与实现，称为状态矩阵。[AES加密算法的详细介绍与实现]算法的每一轮中，状态矩阵的内容不断发生变化，最后的结果作为密文输出。该矩阵中字节的排列顺序为从上到下、从左至右依次排列，如下[AES加密算法的详细介绍与实现]所示： 现[AES加密算法的详细介绍与实现]假设明文分组P为"abcdefghijklmnop"，则对应上面生成的状态矩阵[AES加密算法的详细介绍与实现]如下： 上[AES加密算法的详细介绍与实现]中，0x61为字符a的十六进制表示。可以看到，明文经过AES加密后，已经面目全非。类似地，128位密钥也是用字节为单位的矩阵表示，矩阵的每一列被称为1个32位比特字。通过密钥编排函数该密钥矩阵被扩展成一个44个字组成的序列W[0],W[1], … ,W[43],该序列的前4个元素W[0],W[1],W[2],W[3]是原始密钥，用于加密运算中的初始密钥加（下面介绍）;后面40个字分为10组，每组4个字（128比特）分别用于10轮加密运…