手动推导计算AES中的s盒的输出

手动推导计算AES中的s盒的输出

初衷

为了解决一道密码学课后作业:

在AES中,对于字节 “00” 和 “01” 计算S盒的输出。

百度查了很久,很多都是浅尝则之,没有具体说明S盒计算的具体过程和方法,要么就是说直接使用S盒求出,搞的我很崩溃,本身也是半吊子。后来在这篇文章的帮助下,顺利找到了解决方法。


很明显,如果通过查表的方式,很容易就可以得出 63 “ 63 ” 7C “ 7 C ” 这两个输出。但是这道题不能这么做,需要手动计算S盒的输出。

算法过程简介

AES加密算法涉及4种操作:

  • 字节替代(SubBytes)
  • 行移位(ShiftRows)
  • 列混淆(MixColumns)
  • 轮密钥加(AddRoundKey).

其中第一步字节替换,即SubBytes,它是作用在状态中每个字节上的一种非线性字节变换,这个变换(或称S_box
)按以下两步进行:
- 把字节的值用它的乘法逆来代替,其中 “00” 的逆就是它自己;
- 把经上一步处理后的字节值再进行如下定义的仿射变换:

仿射变换

因此第一步需要求多项式的乘法逆

又二进制多项式 b(x) b ( x ) 的乘法逆为满足

a(x)b(x)=1modm(x)(1) (1) a ( x ) b ( x ) = 1 m o d m ( x )

的二进制多项式 a(x) a ( x ) ,其中 a(x)=b1(x) a ( x ) = b − 1 ( x )

计算过程

1. 求乘法逆(Multiplicative Inverse)

在RJNDAEL中的不可约多项式为:

m(x)=x8+x4+x3+x+1(17) (17) m ( x ) = x 8 + x 4 + x 3 + x + 1

假设我们要求 a(x) a ( x ) 的逆,对 a(x) a ( x ) m(x) m ( x ) 使用扩展欧几里得算法可以得到形如
b(x)a(x)+s(x)m(x)=1(18) (18) b ( x ) ∗ a ( x ) + s ( x ) ∗ m ( x ) = 1

的等式,即等价于
b(x)a(x)=1(modm(x))(19) (19) b ( x ) ∗ a ( x ) = 1 ( m o d m ( x ) )

其中
  • 30
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
好的,让我们来手动推导一个简单的CNN卷积神经网络。 我们先来定义一个输入的图像,假设我们的输入图像是一张28x28的灰度图像。然后我们设定我们的卷积神经网络有两个卷积层和一个全连接层。每个卷积层包含一个卷积核和一个池化层。 我们假设第一个卷积核大小为3x3,步长为1,输出通道数为32。第一个池化层大小为2x2,步长为2。第二个卷积核大小为3x3,步长为1,输出通道数为64。第二个池化层大小为2x2,步长为2。最后一个全连接层有10个神经元,代表10个类别。 现在我们先来看看第一个卷积层。我们将28x28的输入图像与大小为3x3的卷积核进行卷积,得到一个26x26的输出。然后我们对这个输出进行激活函数处理,比如使用ReLU函数。接着我们将这个输出进行2x2的池化操作,得到一个13x13的输出。 然后我们再来看第二个卷积层。我们将上一个池化层的13x13的输出与大小为3x3的卷积核进行卷积,得到一个11x11的输出。同样的,我们对这个输出进行激活函数处理,再进行2x2的池化操作,得到一个5x5的输出。 最后,我们将这个5x5的输出展开,得到一个长度为5x5x64=1600的向量,作为我们的全连接层的输入。我们将这个向量与全连接层的权重矩阵相乘,得到一个10维的输出向量,代表每个类别的概率。 这就是一个简单的CNN卷积神经网络的推导过程。当然,在实际的卷积神经网络,会有更多的卷积层、池化层、激活函数、正则化等操作,但是它们的基本原理和推导过程都是类似的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值