AES中Sbox的生成

转载请注明来源:http://blog.youkuaiyun.com/zhangyang0402/archive/2010/04/08/5465032.aspx

一、概述

在整个AES加密中,SBox被使用到了两次:一次是在密钥(Cipher Key)扩展生成轮密钥(Round Key)的时候,另一次是轮加密的第一步字节替换(SubByte)

根据FIPS 197SBox的生成分两步:

1.GF(28)有限域内各元素的乘法逆元.(运用扩展欧几里得算法)

 

2.用第1步的结果做仿射变换(Affine Transformation)

 

二、具体求解步骤

下面是求解过程,这里这里以第1列第0元素{10}为例

 

1.求{10}在有限域GF(28)上的乘法逆元

{10}用多项式表示为: x4

由扩展欧几里得算法:

 

d

X1

X2

X3

Y1

Y2

Y3

 

1

0

x8+x4+x3+x+1

0

1                             

x4

x4+1

0

1

x4

1

x4+1

x3+x+1

x

1

x4+1

x3+x+1

x

x5+x+1

x2+x

x+1

x

x5+x+1

x2+x

x2+x+1

x6+ x5 + x4+ x2

1

 

Y2=x6+ x5 + x4+ x2  {74},是{10}GF(28)有限域上的逆元

 

2{74}做仿射变换

B={74}=01110100

= b7b6b5b4b3b2b1b0

 

C={63}=01100011

=c7c6c5c4c3c2c1c0

 

B’=b’7b’6b’5b’4b’3b’2b’1b’0

由仿射变换定义,

b’0=b0b4b5b6b7c0=0

b’1=b1b5b6b7b0c1=1

b’2=b2b6b7b0b1c2=0

b’3=b3b7b0b1b2c3=1

b’4=b4b0b1b2b3c4=0

b’5=b5b1b2b3b4c5=0

b’6=b6b2b3b4b5c6=1

b’7=b7b3b4b5b6c7=1

B’=11001010={ca}

 

{74}经仿射变换,结果为{ca}

因此,在SBox中,第10元素的对应值为{ca}。其他元素也可相继求出。规定 {00}映射到其本身。

 

 

### AES加密算法中的S盒生成过程 AES(Advanced Encryption Standard)加密算法中的S盒(Substitution Box)是一个非线性变换,用于增强算法的安全性。S盒的生成基于有限域上的数学运算,具体包括以下两个步骤: 1. **乘法逆元计算**:在有限域 \(GF(2^8)\) 上计算每个字节的乘法逆元。 2. **仿射变换**:对乘法逆元的结果应用一个固定的仿射变换。 以下是用Python实现AES S盒生成的具体代码: ```python import numpy as np # 定义有限域 GF(2^8) 的不可约多项式 x^8 + x^4 + x^3 + x + 1 irreducible_poly = 0b100011011 # 十进制为283 # 计算乘法逆元 def gf_multiplicative_inverse(x): if x == 0: return 0 result = 1 for _ in range(7): # GF(2^8) 中的指数最大为255,因此最多循环7次即可 result = np.bitwise_xor(result, x) result = np.roll(np.unpackbits(np.uint8(result)), -1)[-8:] result = np.packbits(result)[0] return result % irreducible_poly # 仿射变换矩阵 affine_matrix = [ [1, 0, 0, 0, 1, 1, 1, 1], [1, 1, 0, 0, 0, 1, 1, 1], [1, 1, 1, 0, 0, 0, 1, 1], [1, 1, 1, 1, 0, 0, 0, 1], [1, 1, 1, 1, 1, 0, 0, 0], [0, 1, 1, 1, 1, 1, 0, 0], [0, 0, 1, 1, 1, 1, 1, 0], [0, 0, 0, 1, 1, 1, 1, 1] ] # 仿射变换 def affine_transform(byte): byte_bin = list(np.binary_repr(byte, width=8)) transformed = [0] * 8 for i in range(8): transformed[i] = sum([byte_bin[j] * affine_matrix[i][j] for j in range(8)]) % 2 transformed_byte = int("".join(map(str, transformed)), 2) return (transformed_byte ^ 0x63) % 256 # XOR with 0x63 # 生成S盒 def generate_sbox(): sbox = [] for i in range(256): inverse = gf_multiplicative_inverse(i) sbox.append(affine_transform(inverse)) return sbox # 输出S盒 sbox = generate_sbox() print("AES S盒:", sbox) ``` #### 关键点解释 - **乘法逆元计算**:通过有限域 \(GF(2^8)\) 上的扩展欧几里得算法计算每个字节的乘法逆元[^1]。 - **仿射变换**:将乘法逆元的结果与一个固定矩阵相乘,并加上常量向量 \(0x63\),以完成仿射变换[^2]。 - **S盒生成**:遍历所有可能的字节值(0到255),依次计算其乘法逆元并进行仿射变换,最终生成完整的S盒。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值