首页 > 编程知识 正文

十分钟就能读懂的直升机原理,十分钟读懂庆余年

时间:2023-05-05 21:39:46 阅读:111370 作者:282

博客已迁移,转载请注明来源:https://leerw.github.io

今天看了Moserware的《A Stick Figure Guide to the Advanced Encryption Standard(AES)》收获了很多,对AES算法有了更清楚的了解。 这个博客使用了很多情景文字来展示AES的发展历史和算法的具体流程。 虽然是2009年的博文,但今天也可以作为参考。 今天翻译了这篇博文,翻译不好,暂时扔了球。 很久以前

AES:我每天处理很多数据。 我把很多很棒的秘密数据加密成无聊的数据包给你的WIFI路由器。 这些是我做的!

AES:但是还没有人在意我的故事,心跳加速的狗。

AES:我的故事可以比灰姑娘的故事更传奇。 因为我现在是分组密码世界的国王。

你还没去呢。 你想听我说话吗? 开始造作吧…

曾经(1975年以前),只有保密局无法评价其加密算法更好。 有人说EBG13 vf terng,也有人说Double ROT13,各执一词。

终于有人站了起来,呼吁制作好的安全加密算法。

这时,出现了有力的竞争者。 他的名字叫IBM!

国家安全局修改后,他被钦定为数据加密标准,也就是DES。 因为人有更短的钥匙和更强的s盒。

DES已经统治了20多年,学术界也开始了他的研究。 这是第一次细致的研究。 从此,现代密码学应运而生。

这几年,以前去过后继的攻击者挑战DES,DES被打败过几次。

阻止攻击的唯一方法是使用DES算法三次,也就是“triple-des”。 这个方法可行,但真的很慢。

有需求来了,他们像‘triple-des’一样强,但是需要更快更灵活的加密算法。 ((~1997 ) )。

大家都跃跃欲试。

我的创造者AES的发明者,Vincent Rijmen和Joan Daemen也在他们之中。 他们俩把他们的姓组合起来给了我乳名: Rijndael。

果不其然,AES赢了。

然后,AES成为了加密界的国王。 他无处不在。 Intel在他们的芯片里为我定制了基础指令,让AES能更快地执行!

但是加密算法是如何工作的呢? 我们来下一部分

密码学基础

要理解加密算法的工作原理,需要了解三个idea才能理解这些内容。

1 .混淆

在明文和加密后的秘文之间建立某种关系是个好主意。 凯撒密码就是一个被混淆的例子。 密文中的每个字符对应于明文字符后面的第三个字符。

2 .扩散

另一个好主意是扩散信息。 一个例子是简单的列调换。

3 .私钥

千百年来,我们假设没有人知道你的加密方法是愚蠢的,发现有人最终知道了。

但是具体是怎么工作的? 让我们看看下一部分

详细的过程

但在我告诉你们之前,你们必须先签署这个协议!

你需要先在这个上签名

请将数据放入4*4的矩阵中,并填充在此矩阵的末尾。 因为数据不一定用16个字节来填充。 以下,将该矩阵称为"状态矩阵"

的第一个循环对刚才创建的矩阵和第一个循环的密码4*4矩阵进行异或操作

为什么要用异或操作? 理由很简单,异或快,开销少。 是高速位运算。 异或运算使用简单的硬件,可以进行并行计算。 因为没有需要参加运算的多余东西。

密钥扩散第1部分

AES需要很多密钥来进行后轮加密。 AES通过简单的混合操作生成初始密钥。 这个生成过程很快。 那也有几个缺点。 (太简单了),AES已经足够了。

密钥扩散部件2 a

*首先,取出上一轮关键点的最后一列,然后将该列的第一个字节放在最后一个位置,并将其他位置的字节一次上移

然后,通过一个替代框映射将转换了位置的列转换为另一列

密钥扩散部件2 b

*然后,使刚才得到的列与轮定数列不同,或者,该常数每个轮都不同

*最后,异或后得到的列与上次密钥的第一列不同,或者得到第一列

密钥扩散部件3

我刚才得到了第一排,第二排怎么弄? 很简单。 通过上一个回合的密钥的第二列和刚才得到的第一列的异或得到新一个回合的第二列。 第三列、第四列用同样的方法依次计算得到。 (请注意,256位密钥更复杂。 使用128位密钥,即16个字节。 )

接下来是中间轮。 中间轮重复几次一系列的操作。 重复的次数取决于键的长度。 128位重复9次,192位重复11次,256位重复13次)

模糊:备用字节

在s框中将每个字节替换为另一个字节,用图像左下角和右下角的符号表示混乱操作

扩散p

art1:行移位


将4*4的矩阵按图左的方式进行行移位,然后按图右的方式进行重新组合得到一个新的4*4矩阵左下角和右下角的符号代表行移位这一操作

扩散 Part2:列混淆


用列混淆变换将每一列转换成新的一列,算法为模不可约多项式
图片中左下角和右下角的符号代表列混淆操作

加轮密钥


在每轮的最后,将上一步列混淆得到的矩阵与下一轮的密钥进行异或得到新的矩阵

在最后一轮我们丢弃了列混淆这一操作,因为最后一轮它不会提高安全性了,只会将速度拉低

每一轮我都对这些比特进行混淆和扩散。而且还把每一轮的密钥都嵌入进去。轮数越多安全性越好!

决定到底要多少轮总是面临一个挑战,那就是在安全性和效率之前做出权衡。

有人说可以经过6轮加密就可以了,但是这很不好!如果你仔细观察,你会发现每一轮输出的每一个比特取决于前两轮。为了增加扩散的雪崩效应,我增加了4轮。这是我的安全边界。密钥长度位128位时需要10轮,192位时需要12轮,256位时需要14轮。

每次AES都要先执行异或初始操作,然后执行9轮拥有4项操作的中间轮,最后执行包括三项操作的最后一轮

解密意味着加密的逆过程

相比与ECB而言,CBC更好

但是除了刚才所做的那些类比,究竟发生了些什么呢?

如果像真正明白这些东西,我们还需要数学基础知识

数学!


我们思考一个问题,X+X=?你可能会说2X

我们回顾一下数学基础

(x+1)2=(x+1)(x+1)=x2+x+x+1=x2+2x+1 ( x + 1 ) 2 = ( x + 1 ) ( x + 1 ) = x 2 + x + x + 1 = x 2 + 2 x + 1

我们将会做点小改变,以前,系数可以很大,而现在,我们只让系数等于1或0
旧方式: 123x2+45x2+678x+9x+10=168x2+687x+10 123 x 2 + 45 x 2 + 678 x + 9 x + 10 = 168 x 2 + 687 x + 10
新方式: x2⨁x2⨁x2⨁x⨁x⨁1=x2⨁1 x 2 ⨁ x 2 ⨁ x 2 ⨁ x ⨁ x ⨁ 1 = x 2 ⨁ 1
x2⨁x2⨁x2=(x2⨁x2)⨁x2=0⨁x2=x2 x 2 ⨁ x 2 ⨁ x 2 = ( x 2 ⨁ x 2 ) ⨁ x 2 = 0 ⨁ x 2 = x 2

上图展示了乘法怎么让式子增加的飞快

尽管新的加法让事情变得更加简单,但是 x13 x 13 还是显得太大了,我们怎么才能让这个多项式的最高次不高于7呢?

我们请来了我们的朋友——时钟数学,怎么做呢?只需要把式子加在一起然后做长除法就可以了。我们要时刻注意余数(这也叫模加法)

在我们这里,我们用 m(x)=x8⨁x4⨁x3⨁x⨁1 m ( x ) = x 8 ⨁ x 4 ⨁ x 3 ⨁ x ⨁ 1 作为除数而不是12.假设我们现在做乘法 x⋅b(x),b(x) x ⋅ b ( x ) , b ( x ) 有系数 b b 7…b" role="presentation">bb 0;
但是得到的结果最高次幂是8,还是太高了,我们必须将它变从容的书包点


我们将刚才的结果除以 m(x)=x8⨁x4⨁x3⨁x⨁1 m ( x ) = x 8 ⨁ x 4 ⨁ x 3 ⨁ x ⨁ 1 然后取余数

下面我们到了最艰难的部分了:对数运算。对数运算搞定之后,其他都是小case!对数可以帮助我们将乘法转换为加法(如图)

我们将对数引入我们的新世界,在这里,底数不再是10了,而是简单的多项式 x⨁1 x ⨁ 1 (如果你不停地乘以 x⨁1 x ⨁ 1 然后除以 m(x) m ( x ) 得到余数,你会发现你可以生成所有低于 x8 x 8 的多项式)

为什么我们要用这种数学呢?密码学与比特和字节打交道不是吗?OK,还有一个最后的联系,一个7阶的多项式可以表示1字节,因为我们用刚才引入的数学方法生成的多项式的系数只能是1或0

对于字节,我们将多项式加法变成简单的异或。我们可以用对数技巧创建一个表来加快运算

因为我们知道怎么定义的乘法,我们可以为每一个多项式字节找到真正字节的逆运算。因为总共只有255个这样的字节,所以我们可以暴力破解

现在我们可以理解神秘的S盒了。它将一个字节 a a 应用两个函数。第一个函数是g,找到a" role="presentation">aa的逆元,第二个函数是f,f是故意让这个数学更麻烦来抵挡黑客的进攻

我们还可以理解那些疯狂的轮常量。我通过不停地乘以 x x 来得到他们

列混淆变换是最困难的。我把每一列看作是一个多项式.用我们新的乘法将它乘以一个特殊的多项式,然后除以x4+1" role="presentation">x4+1x4+1得到余数,然后将其简化成矩阵相乘

所有的东西都浓缩到上图了

OVER

原文地址

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。