对称密码体系
symmetry
DES
流程
1??初始置换
2?? feistel 结构
F函数
- 扩展/置换
32-->48
- $R_i \ xor\ K_i $
48
- S盒
48-->32
- 置换
32
- \(R_i\ = \ L_{i-1}\ xor\ t_i\)
密钥生成
- 56比特密钥 置换选择1
- 28位,分成两组,左循环移位 结果向下和向左传递
- 置换选择2
58-->48
3??逆初始置换
python 实现
import pyDes
#密钥
DES = pyDes.des(deskey)
#加密模式
DES.setMode('ECB')
#每轮的子密钥,优先级高于deskey
DES.Kn = [
[1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0],
...
]
#加密
DES.encrypt(flag)
AES
特点
-
明文分组长度为
128
-
密钥长度可为
128,192,256
加密
1?? 初始密钥加
密钥扩展
,State初始化为M
AddRoundKey
: State与密钥异或
2?? 轮函数(N-1 轮迭代)
-
SubBytes
: S盒替换 -
ShiftRows
: 行移位 -
MixColumns
: 列混合变换 -
AddRoundKey
: 与对应密钥异或
3?? 结尾轮
SubBytes
: S盒替换ShiftRows
: 行移位AddRoundKey
: 与对应密钥异或
伪代码
解密
伪代码
python 实现
from Crypto.Cipher import AES
#AES.new(key, mode, *args, **kwargs)
#加密
aes=AES.new(key,AES.MODE_CBC,iv)
enc_flag = aes.encrypt(flag)
#解密
flag = aes.decrypt(enc_flag)