AES加密算法原理及实现
目录
一、简介
1、明文P
2、密钥K
3、AES加密函数
4、密文C
5、AES解密函数
二、AES简要流程
三、加密的详细过程
1、字节替换
a、字节替换操作
b、字节替换逆操作
2、行移位
a、行移位操作
b、行移位的逆变换
3、列混合
a、列混合操作
b、列混合逆运算
4、轮密钥加
四、密钥扩展
五、解密过程
六、AES算法实现
1、密钥扩展的实现
2、字节代换的实现
3、行移位的实现
4、列混合的实现
5、轮密钥加的实现
6、AES解密函数
一、简介
首先明确的是AES是数据高级加密标准,而并非是一种加密算法。AES(Advanced Encryption Standard)在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;
![](/assets/blank.gif)
1、明文P
没有经过加密的数据。
2、密钥K
用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。
3、AES加密函数
设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。
4、密文C
经加密函数处理后的数据
5、AES解密函数
设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。
在这里简单介绍下对称加密算法与非对称加密算法的区别。
对称加密算法
加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。
非对称加密算法
加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。
实际中,一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。
本文下面AES原理的介绍参考自《现代密码学教程》,AES的实现在介绍完原理后开始。
二、AES简要流程
AES是分组加密的算法,将明文分成一组一组的分别加密,然后拼接成完整的密文。AES每组明文的长度是128位即32个字节。秘钥的长度有三种长度:128位、192位、256位,三种秘钥的区别如下:
AES | 密钥长度(32位比特字) | 分组长度(32位比特字) | 加密轮数 |
---|---|---|---|
AES-128 | 4 | 4 | 10 |
AES-192 | 6 | 4 | 12 |
AES-256 | 8 | 4 | 14 |
注意:下文中涉及的所有讨论,均是AES-128,即秘钥长度128,加密轮数10轮。
上面说到AES的加密函数是C = E(K,P) ,
在加密函数E中,会执行一个轮函数,并且执行10次这个轮函数,这个轮函数的前9次执行的操作是一样的,只有第10次有所不同。也就是说,一个明文分组会被加密10轮。AES的核心就是实现一轮中的所有操作。
AES的处理单位是字节,128位的输入明文分组P和输入密钥K都被分成16个字节,分别记为P = P0 P1 … P15 和 K = K0 K1 … K15。如,明文分组为P = abcdefghijklmnop,其中的字符a对应P0,p对应P15。一般地,明文分组用字节为单位的正方形矩阵描述,称为状态矩阵。在算法的每一轮中,状态矩阵的内容不断发生变化,最后的结果作为密文输出。该矩阵中字节的排列顺序为从上到下、从左至右依次排列,如下图所示:
![](/assets/blank.gif)
我们假设明文分组P为”abcdefghijklmnop”,则对应上面生成的状态矩阵图如下:
上图中,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轮加密运算中的轮密钥加,如下图所示:
上图中,设K = “abcdefghijklmnop”,则K0 = a, K15 = p, W[0] = K0 K1 K2 K3 = “abcd”。
三、加密的详细过程
如上图所示,加密解密的轮函数依次经过了字节替换、行移位、列混合、轮秘钥加;而解密的过程正好是加密过程的逆运算。下文将详细讨论各个过程的具体细节。
1、字节替换
a、字节替换操作
简单来讲,就是我们准备了一张密码表,将明文的a 替换成 x , b 替换成 y , 这张密码表就是S盒 , 解密的时候是逆S盒。
行/列 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0x63 | 0x7c | 0x77 | 0x7b | 0xf2 | 0x6b | 0x6f | 0xc5 | 0x30 | 0x01 | 0x67 | 0x2b | 0xfe | 0xd7 | 0xab | 0x76 |
1 | 0xca | 0x82 | 0xc9 | 0x7d | 0xfa | 0x59 | 0x47 | 0xf0 | 0xad | 0xd4 | 0xa2 | 0xaf | 0x9c | 0xa4 | 0x72 | 0xc0 |
2 | 0xb7 | 0xfd | 0x93 | 0x26 | 0x36 | 0x3f | 0xf7 | 0xcc | 0x34 | 0xa5 | 0xe5 | 0xf1 | 0x71 | 0xd8 | 0x31 | 0x15 |
3 | 0x04 | 0xc7 | 0x23 | 0xc3 | 0x18 | 0x96 | 0x05 | 0x9a | 0x07 | 0x12 | 0x80 | 0xe2 | 0xeb | 0x27 | 0xb2 | 0x75 |
4 | 0x09 | 0x83 | 0x2c | 0x1a | 0x1b | 0x6e | 0x5a | 0xa0 | 0x52 | 0x3b | 0xd6 | 0xb3 | 0x29 | 0xe3 | 0x2f | 0x84 |
5 | 0x53 | 0xd1 | 0x00 | 0xed | 0x20 | 0xfc | 0xb1 | 0x5b | 0x6a | 0xcb | 0xbe | 0x39 | 0x4a | 0x4c | 0x58 | 0xcf |
6 | 0xd0 | 0xef | 0xaa | 0xfb | 0x43 | 0x4d | 0x33 | 0x85 | 0x45 | 0xf9 | 0x02 | 0x7f | 0x50 | 0x3c | 0x9f | 0xa8 |
7 | 0x51 | 0xa3 | 0x40 | 0x8f | 0x92 | 0x9d | 0x38 | 0xf5 | 0xbc | 0xb6 | 0xda | 0x21 | 0x10 | 0xff | 0xf3 | 0xd2 |
8 | 0xcd | 0x0c | 0x13 | 0xec | 0x5f | 0x97 | 0x44 | 0x17 | 0xc4 | 0xa7 | 0x7e | 0x3d | 0x64 | 0x5d | 0x19 | 0x73 |
9 | 0x60 | 0x81 | 0x4f | 0xdc | 0x22 | 0x2a | 0x90 | 0x88 | 0x46 | 0xee | 0xb8 | 0x14 | 0xde | 0x5e | 0x0b | 0xdb |
A | 0xe0 | 0x32 | 0x3a | 0x0a | 0x49 | 0x06 | 0x24 | 0x5c | 0xc2 | 0xd3 | 0xac | 0x62 | 0x91 | 0x95 | 0xe4 | 0x79 |
B | 0xe7 | 0xc8 | 0x37 | 0x6d | 0x8d | 0xd5 | 0x4e | 0xa9 | 0x6c | 0x56 | 0xf4 | 0xea | 0x65 | 0x7a | 0xae | 0x08 |
C | 0xba | 0x78 | 0x25 | 0x2e | 0x1c | 0xa6 | 0xb4 | 0xc6 | 0xe8 | 0xdd | 0x74 | 0x1f | 0x4b | 0xbd | 0x8b | 0x8a |
D | 0x70 | 0x3e | 0xb5 | 0x66 | 0x48 | 0x03 | 0xf6 | 0x0e | 0x61 | 0x35 | 0x57 | 0xb9 | 0x86 | 0xc1 | 0x1d | 0x9e |
E | 0xe1 | 0xf8 | 0x98 | 0x11 | 0x69 | 0xd9 | 0x8e | 0x94 | 0x9b | 0x1e | 0x87 | 0xe9 | 0xce | 0x55 | 0x28 | 0xdf |
F | 0x8c | 0xa1 | 0x89 | 0x0d | 0xbf | 0xe6 | 0x42 | 0x68 | 0x41 | 0x99 | 0x2d | 0x0f | 0xb0 | 0x54 | 0xbb | 0x16 |
怎么替换呢?
AES加密的处理的最小单元是字节 , 一个字节 = 4个比特位 ,我们把前两个比特位为行坐标 , 后两个比特位为列坐标 , 依次来确定替换后的新字节。例如,输出的字节S1为0x12,则查S盒的第0x01行和0x02列,得到值0xc9,然后替换S1原有的0x12为0xc9。状态矩阵经字节代换后的图如下:
b、字节替换逆操作
操作流程同上,逆S盒如下:
行/列 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0x52 | 0x09 | 0x6a | 0xd5 | 0x30 | 0x36 | 0xa5 | 0x38 | 0xbf | 0x40 | 0xa3 | 0x9e | 0x81 | 0xf3 | 0xd7 | 0xfb |
1 | 0x7c | 0xe3 | 0x39 | 0x82 | 0x9b | 0x2f | 0xff | 0x87 | 0x34 | 0x8e | 0x43 | 0x44 | 0xc4 | 0xde | 0xe9 | 0xcb |
2 | 0x54 | 0x7b | 0x94 | 0x32 | 0xa6 | 0xc2 | 0x23 | 0x3d | 0xee | 0x4c | 0x95 | 0x0b | 0x42 | 0xfa | 0xc3 | 0x4e |
3 | 0x08 | 0x2e | 0xa1 | 0x66 | 0x28 | 0xd9 | 0x24 | 0xb2 | 0x76 | 0x5b | 0xa2 | 0x49 | 0x6d | 0x8b | 0xd1 | 0x25 |
4 | 0x72 | 0xf8 | 0xf6 | 0x64 | 0x86 | 0x68 | 0x98 | 0x16 | 0xd4 | 0xa4 | 0x5c | 0xcc | 0x5d | 0x65 | 0xb6 | 0x92 |
5 | 0x6c | 0x70 | 0x48 | 0x50 | 0xfd | 0xed | 0xb9 | 0xda | 0x5e | 0x15 | 0x46 | 0x57 | 0xa7 | 0x8d | 0x9d | 0x84 |
6 | 0x90 | 0xd8 | 0xab | 0x00 | 0x8c | 0xbc | 0xd3 | 0x0a | 0xf7 | 0xe4 | 0x58 | 0x05 | 0xb8 | 0xb3 | 0x45 | 0x06 |
7 | 0xd0 | 0x2c | 0x1e | 0x8f | 0xca | 0x3f | 0x0f | 0x02 | 0xc1 | 0xaf | 0xbd | 0x03 | 0x01 | 0x13 | 0x8a | 0x6b |
8 | 0x3a | 0x91 | 0x11 | 0x41 | 0x4f | 0x67 | 0xdc | 0xea | 0x97 | 0xf2 | 0xcf | 0xce | 0xf0 | 0xb4 | 0xe6 | 0x73 |
9 | 0x96 | 0xac | 0x74 | 0x22 | 0xe7 | 0xad | 0x35 | 0x85 | 0xe2 | 0xf9 | 0x37 | 0xe8 | 0x1c | 0x75 | 0xdf | 0x6e |
A | 0x47 | 0xf1 | 0x1a | 0x71 | 0x1d | 0x29 | 0xc5 | 0x89 | 0x6f | 0xb7 | 0x62 | 0x0e | 0xaa | 0x18 | 0xbe | 0x1b |
B | 0xfc | 0x56 | 0x3e | 0x4b | 0xc6 | 0xd2 | 0x79 | 0x20 | 0x9a | 0xdb | 0xc0 | 0xfe | 0x78 | 0xcd | 0x5a | 0xf4 |
C | 0x1f | 0xdd | 0xa8 | 0x33 | 0x88 | 0x07 | 0xc7 | 0x31 | 0xb1 | 0x12 | 0x10 | 0x59 | 0x27 | 0x80 | 0xec | 0x5f |
D | 0x60 | 0x51 | 0x7f | 0xa9 | 0x19 | 0xb5 | 0x4a | 0x0d | 0x2d | 0xe5 | 0x7a | 0x9f | 0x93 | 0xc9 | 0x9c | 0xef |
E | 0xa0 | 0xe0 | 0x3b | 0x4d | 0xae | 0x2a | 0xf5 | 0xb0 | 0xc8 | 0xeb | 0xbb | 0x3c | 0x83 | 0x53 | 0x99 | 0x61 |
F | 0x17 | 0x2b | 0x04 | 0x7e | 0xba | 0x77 | 0xd6 | 0x26 | 0xe1 | 0x69 | 0x14 | 0x63 | 0x55 | 0x21 | 0x0c | 0x7d |
2、行移位
a、行移位操作
行移位就是我们的状态矩阵以行为单位左移的过程(注意左侧移除的字节转接到本行末尾),具体规则如下:
第一行不移位,第二行移1位,第三行移2位,第四行移3位
b、行移位的逆变换
行移位的逆操作,是右移。规则同上
3、列混合
a、列混合操作
列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵,如下图的公式所示:
状态矩阵中的第j列(0 ≤j≤3)的列混合可以表示为下图所示:
矩阵元素的乘法和加法都是定义在基于GF(2^8)上的二元运算,并不是通常意义上的乘法和加法。后续我会另起文章讨论这一块的内容。
对于一个8位的二进制数来说,使用域上的乘法乘以(00000010)等价于左移1位(低位补0)后,再根据情况同(00011011)进行异或运算,设S1 = (a7 a6 a5 a4 a3 a2 a1 a0),刚0x02 * S1如下图所示:
也就是说,如果a7为1,则进行异或运算,否则不进行。
类似地,乘以(00000100)可以拆分成两次乘以(00000010)的运算:
乘以(0000 0011)可以拆分成先分别乘以(0000 0001)和(0000 0010),再将两个乘积异或:
因此,我们只需要实现乘以2的函数,其他数值的乘法都可以通过组合来实现。
下面举个具体的例子,输入的状态矩阵如下:
C9 | E5 | FD | 2B |
7A | F2 | 78 | 6E |
63 | 9C | 26 | 67 |
B0 | A7 | 82 | E5 |
下面,进行列混合运算:
以第一列的运算为例:
详细解释一下第一行第一列 C9 的列混合操作:
2 * 0xC9 = 0xC9 * 2 = 1100 1001 * 0000 0010 = ( 1100 1001 << 1 ) ^ 0001 1011 = 1 1001 0010 ^ 0001 1011 = 1000 1001
3 * 0x7A = 0x7A * 3 = 0111 1010 * 0000 0011 = (0111 1010 << 1) ^ 0111 1010 = 1111 0100 ^ 0111 1010 = 1000 1110
(2 * 0xC9) ^ (3 * 0x7A) = 1000 1001 ^ 1000 1110 = 0000 0111
(2 * 0xC9) ^ (3 * 0x7A) ^ 0x63 = 0000 0111 ^ 0110 0011 =0110 0100
(2 * 0xC9) ^ (3 * 0x7A) ^ 0x63 ^ 0xB0 = 0110 0100 ^ 1011 0000 = 1101 0100 = 0xD4
其它列的计算就不列举了,列混合后生成的新状态矩阵如下:
D4 | E7 | CD | 66 |
28 | 02 | E5 | BB |
BE | C6 | D6 | BF |
22 | 0F | DF | A5 |
b、列混合逆运算
逆向列混合变换可由下图的矩阵乘法定义:
可以验证,逆变换矩阵同正变换矩阵的乘积恰好为单位矩阵。
4、轮密钥加
轮密钥加的逆运算同正向的轮密钥加运算完全一致,这是因为异或的逆操作是其自身。轮密钥加非常简单,但却能够影响S数组中的每一位。
四、密钥扩展
AES首先将初始密钥输入到一个44的状态矩阵中,如下图所示。
五、解密过程
六、AES算法实现
/*** 参数 p: 明文的字符串数组。* 参数 plen: 明文的长度。* 参数 key: 密钥的字符串数组。*/
void aes(char *p, int plen, char *key){int keylen = strlen(key);if(plen == 0 || plen % 16 != 0) {printf("明文字符长度必须为16的倍数!\n");exit(0);}if(!checkKeyLen(keylen)) {printf("密钥字符长度错误!长度必须为16、24和32。当前长度为%d\n",keylen);exit(0);}extendKey(key);//扩展密钥int pArray[4][4];for(int k = 0; k < plen; k += 16) {convertToIntArray(p + k, pArray);addRoundKey(pArray, 0);//一开始的轮密钥加for(int i = 1; i < 10; i++){//前9轮subBytes(pArray);//字节代换shiftRows(pArray);//行移位mixColumns(pArray);//列混合addRoundKey(pArray, i);}//第10轮subBytes(pArray);//字节代换shiftRows(pArray);//行移位addRoundKey(pArray, 10);convertArrayToStr(pArray, p + k);}
}
1、密钥扩展的实现
//密钥对应的扩展数组
static int w[44];/*** 扩展密钥,结果是把w[44]中的每个元素初始化*/
static void extendKey(char *key) {for(int i = 0; i < 4; i++)w[i] = getWordFromStr(key + i * 4); for(int i = 4, j = 0; i < 44; i++) {if( i % 4 == 0) {w[i] = w[i - 4] ^ T(w[i - 1], j); j++;//下一轮}else {w[i] = w[i - 4] ^ w[i - 1]; }} }
/*** 常量轮值表*/
static const int Rcon[10] = { 0x01000000, 0x02000000,0x04000000, 0x08000000,0x10000000, 0x20000000,0x40000000, 0x80000000,0x1b000000, 0x36000000 };
/*** 密钥扩展中的T函数*/
static int T(int num, int round) {int numArray[4];splitIntToArray(num, numArray);leftLoop4int(numArray, 1);//字循环//字节代换for(int i = 0; i < 4; i++)numArray[i] = getNumFromSBox(numArray[i]);int result = mergeArrayToInt(numArray);return result ^ Rcon[round];
}
2、字节代换的实现
/*** 根据索引,从S盒中获得元素*/
static int getNumFromSBox(int index) {int row = getLeft4Bit(index);int col = getRight4Bit(index);return S[row][col];
}/*** 字节代换*/
static void subBytes(int array[4][4]){for(int i = 0; i < 4; i++)for(int j = 0; j < 4; j++)array[i][j] = getNumFromSBox(array[i][j]);
}
3、行移位的实现
行移位的时候,首先把状态矩阵中第2,3,4行复制出来,然后对它们行进左移相应的位数,然后再复制回去状态矩阵array中。
/*** 将数组中的元素循环左移step位*/
static void leftLoop4int(int array[4], int step) {int temp[4];for(int i = 0; i < 4; i++)temp[i] = array[i];int index = step % 4 == 0 ? 0 : step % 4;for(int i = 0; i < 4; i++){array[i] = temp[index];index++;index = index % 4;}
}/*** 行移位*/
static void shiftRows(int array[4][4]) {int rowTwo[4], rowThree[4], rowFour[4];//复制状态矩阵的第2,3,4行for(int i = 0; i < 4; i++) {rowTwo[i] = array[1][i];rowThree[i] = array[2][i];rowFour[i] = array[3][i];}//循环左移相应的位数leftLoop4int(rowTwo, 1);leftLoop4int(rowThree, 2);leftLoop4int(rowFour, 3);//把左移后的行复制回状态矩阵中for(int i = 0; i < 4; i++) {array[1][i] = rowTwo[i];array[2][i] = rowThree[i];array[3][i] = rowFour[i];}
}
4、列混合的实现
s = GFMul3(0xC9) ^ 0x7A ^ 0x63 ^ GFMul2(0xB0)
/*** 列混合要用到的矩阵*/
static const int colM[4][4] = { 2, 3, 1, 1,1, 2, 3, 1,1, 1, 2, 3,3, 1, 1, 2 };static int GFMul2(int s) {int result = s << 1;int a7 = result & 0x00000100;if(a7 != 0) {result = result & 0x000000ff;result = result ^ 0x1b;}return result;
}static int GFMul3(int s) {return GFMul2(s) ^ s;
}/*** GF上的二元运算*/
static int GFMul(int n, int s) {int result;if(n == 1)result = s;else if(n == 2)result = GFMul2(s);else if(n == 3)result = GFMul3(s);else if(n == 0x9)result = GFMul9(s);else if(n == 0xb)//11result = GFMul11(s);else if(n == 0xd)//13result = GFMul13(s);else if(n == 0xe)//14result = GFMul14(s);return result;
}/*** 列混合*/
static void mixColumns(int array[4][4]) {int tempArray[4][4];for(int i = 0; i < 4; i++)for(int j = 0; j < 4; j++)tempArray[i][j] = array[i][j];for(int i = 0; i < 4; i++)for(int j = 0; j < 4; j++){array[i][j] = GFMul(colM[i][0],tempArray[0][j]) ^ GFMul(colM[i][1],tempArray[1][j])^ GFMul(colM[i][2],tempArray[2][j]) ^ GFMul(colM[i][3], tempArray[3][j]);}
}
5、轮密钥加的实现
轮密钥加的实现很简单,就是根据传入的轮数来把状态矩阵与相应的W[i]异或。
/*** 轮密钥加*/
static void addRoundKey(int array[4][4], int round) {int warray[4];for(int i = 0; i < 4; i++) {splitIntToArray(w[ round * 4 + i], warray);for(int j = 0; j < 4; j++) {array[j][i] = array[j][i] ^ warray[j];}}
}
6、AES解密函数
AES的解密函数和加密函数有点不同,可以参考上面的等价解密流程图来理解,解密函数中调用的是各轮操作的逆函数。逆函数在这里就不详细讲解了,可以参考最后的完整代码。
/*** 参数 c: 密文的字符串数组。* 参数 clen: 密文的长度。* 参数 key: 密钥的字符串数组。*/
void deAes(char *c, int clen, char *key) {int keylen = strlen(key);if(clen == 0 || clen % 16 != 0) {printf("密文字符长度必须为16的倍数!现在的长度为%d\n",clen);exit(0);}if(!checkKeyLen(keylen)) {printf("密钥字符长度错误!长度必须为16、24和32。当前长度为%d\n",keylen);exit(0);}extendKey(key);//扩展密钥int cArray[4][4];for(int k = 0; k < clen; k += 16) {convertToIntArray(c + k, cArray);addRoundKey(cArray, 10);int wArray[4][4];for(int i = 9; i >= 1; i--) {deSubBytes(cArray);deShiftRows(cArray);deMixColumns(cArray);getArrayFrom4W(i, wArray);deMixColumns(wArray);addRoundTowArray(cArray, wArray);}deSubBytes(cArray);deShiftRows(cArray);addRoundKey(cArray, 0);convertArrayToStr(cArray, c + k);}
}
AES加密算法原理及实现相关推荐
- AES加密算法原理及python实现
AES加密算法原理及python实现 AES对称加密算法 1.Rijndael的设计思想 2.AES的基本结构 3.加密解密的详细结构 4.四种轮操作 1.字节代换(SubBytes) 2.行移位操作 ...
- 什么是AES加密?详解AES加密算法原理流程
在密码学中,加密算法分为双向加密和单向加密.单向加密包括MD5.SHA等摘要算法,它们是不可逆的.双向加密包括对称加密和非对称加密,对称加密包括AES加密.DES加密等.双向加密是可逆的,存在密文的密 ...
- AES加密算法原理及java android实现
AES当今最流行的对称加密算法之一,是DES的替代者. 密钥是AES算法实现加密和解密的根本.对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥. AES支持三种长度的密钥: ...
- AES加密算法原理分析
明文:任何人见字符(文)知意:暗文:没有密钥解码则见字符(文)不知意. AES(Advanced Encryption Standard)高级加密标准为常见的对称型加密算法(微信小程序加密传输是用AE ...
- AES加密算法原理解析
转自: https://blog.csdn.net/qq_28205153/article/details/55798628 AES简介 高级加密标准(AES,Advanced Encryption ...
- AES加密算法原理简述
AES为迭代型密码:明文长度固定128bit=16Byte,轮数依赖于密钥长度.密钥为128.192.256bit时,轮数分别为:10.12.14,本文以密钥长度为128bit为例. 整体过程: 明文 ...
- AES加密算法工作原理
密码学博大精深,这里所说的AES加密算法原理可以理解为AES工作流程,至于为什么这么设计,这么设计为什么是安全的,有待今后的学习与思考. 分组密码设计的两个原则 分组密码设计的两个原则:混淆(conf ...
- AES加密算法java实现
转载自: https://blog.csdn.net/zyhlwzy/article/details/77948165 AES加密算法是密码学中的高级加密标准,该加密算法采用对称分组密码体制,密钥长度 ...
- AES 加密算法的原理详解
本文转载https://blog.csdn.net/gulang03/article/details/81175854 本教程摘选自 https://blog.csdn.net/qq_28205153 ...
最新文章
- [零基础学JAVA]Java SE应用部分-27.Java IO操作(01)
- Android的ImageView背后的绘制原理
- 图片进行base64编解码方法
- python实现自顶向下,自底向上
- 5分钟学会开发浏览器扩展
- VJ 1033 整数分解(版本2)
- 两万字详细爬虫知识储备,数据采集与清洗基础习题(一)头歌参考答案
- 作者:男,博士,西南财经大学经济数学学院讲师、硕士生导师
- asp.net学习之GridView
- 提取字符串中字母数字方法
- python实现:用类实现一个图书馆,实现借书,入库,还书,查书,等功能,要求数据可以保存到文件中,退出后下次可以找回数据...
- Python网络爬虫与信息提取 - requests库入门
- 用StringUtil判断字符串非空的方法
- iis php性能优化,iis优化网站运行速度 网站浏览更加快
- 太好玩了!用Python写一个乒乓球游戏!
- ab cookie 压力测试接口
- 河北滹沱河流域上演喜鹊戏金雕
- 跟着太白老师学python day10 函数嵌套, global , nonlocal
- 记一次云服务器挖矿病毒处理过程
- 逆势而上,Intel大连工厂高价挖人