0
点赞
收藏
分享

微信扫一扫

密码学笔记4——AES密码

Gaaidou 2021-09-21 阅读 43
Java笔记

1.AES密码的特点

  • 分组密码。明文和密文的长度都是128位,但密码的长度可变
  • 面向二进制的密码算法
  • 不是对合运算
  • 综合使用多种密码技术(置换,代替,代数)
  • sp结构(前面的des算法是Feistelistel结构)

2.AES算法框架

可以看到从明文加密到密文一共经历了10轮的循环,每一轮的循环主要经历4个不同的阶段。
  • 字节替换 :用一个s盒完成分组的字节到字节的替换
  • 行位移
  • 列混淆
  • 轮密钥加

下面我们只需要了解这几个阶段的实际运算过程和密钥的扩展操作就可以对AES加密有一个完整的了解。

3.字节替换

AES的字节代换其实就是一个简单的查表操作。AES定义了一个S盒和一个逆S盒。

AES的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

把该字节的高4位作为行值,低4位作为列值,取出S盒或者逆S盒中对应的行的元素作为输出。例如,加密时,输入的字节S1为0x12,则查S盒的第0x01行和0x02列,得到值0xc9,然后替换S1原有的0x12为0xc9。状态矩阵经字节代换后的图如下:
AES的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

3.行位移变换

正向和逆向变换:状态的第一栏保持不变,把状态的第二栏左移一个字节,状态的第三栏左移两个字节,状态的第四栏左移三个字节

例子:


逆向行变换将状态栏中的后三行执行相反方向移位操作,如第2行右移一位。

4.列混淆变换

列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵,如下图的公式所示:


状态矩阵中的第j列(0 ≤j≤3)的列混合可以表示为下图所示:


其中,矩阵元素的乘法和加法都是定义在基于GF(2^8)上的二元运算,并不是通常意义上的乘法和加法。这个位置就比较复杂了,想要深入理解可以去了解一下有限域的概念,我们需要记住一个公式

这个位置有点不好理解,我们举一个简单的例子(都是我翻阅资料,最后通过计算总算是知道怎么算了)
计算


这里ab.02为什么需要xor00011011,由上面的公式可知,乘以x的运算可以通过左移一位再根据条件判断是否需要XOR00011011,这里最左边的位数是1,所以需要XOR操作。

5.轮密钥加变换

1.密钥的扩展

输入密钥直接被复制到扩展密钥数组的前4个字。然后每次用4个字填充扩展密钥余下的部分。公式描述

j            1             2            3               4             5
Rcon[j] 01 00 00 00   02 00 00 00     04 00 00 00   08 00 00 00     10 00 00 00
j              6            7              8            9            10
Rcon[j] 20 00 00 00   40 00 00 00    80 00 00 00    1B 00 00 00     36 00 00 00

举一个例子来描述AES算法

明文:0123456789abcdeffedcba9876543210
密钥:0f1571c947d9e8509cb7add6af7f6798
密文:ff0b844a0853bf7c6934ab4364148fb9
这里引用书上的例子,自己可以去算一遍加深理解

举报

相关推荐

0 条评论