对称密码体系


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)