目录

前言铺垫:

DES:

密钥如何生成:

密码分组;

伽罗瓦域:

AES:

接下来我们进入算法核心——“轮函数”:

接下来,密钥的生成:

结语:


前言铺垫:

计算机中,所有的信息数据都用二进制来保存

XOR(异或)是天然的加密算法:我们假设明文A经过密钥(XOR运算)B得到密文C。且我们只能看到密文C。当密文C为1时,你分不清是A是1还是B是1。反之,当密文C为0时,你分不清AB是全为0还是全为1。所以很明显,异或运算有着50%的随机,完美的随机。

受限于软硬件的处理性能,计算机处理数据时将大数据分块,分成一个个64bit的数据块,对每一块进行XOR加密,再重组,这样,加密所需要点密钥的长度就和分组的长度一样(64bit)。可惜的是这样依然可以通过频率破解来破译出明文,所以我们还需要另一种牢靠的算法让密文的数字更难以预料。搞信息论的香农在这篇开启了现代密码学大门的论文里《Communication Theory of Secrecy Systems*》将这样模糊密钥和密文关系的加密算法称之为:”混淆(confusion)“混淆很常见于古典密码(单表替换,维吉尼亚,Enigma),但这种混淆之后的关系还是有迹可循,而0和1却为混淆带来了更多的可能性

我们以加密100101为例:

看起来毫无规律,但还不够,对于分段存储于硬盘不同区域的信息,如果两个明文差异微小,在密文上的反应,也只是区域里有限位数的不同,这些差异就是破译者的福音。想要消解规律也很简单,打乱顺序就可以了。但这并没有解决明文自身的统计特性,所以,我们要让一个明文的变化影响多个密文,也就是“扩散(diffusion)”

输入里有一半的数据被置换了两次,这样以来,修改输入中的一个数字,就有50%可能改变输出中的两个数字

如果说混淆掩盖了密钥的踪迹,那扩散就是进一步扰乱明文的规律。

XOR,扩散,混淆,于是在1977年,一种以此为基础的加密算法横空出世——DES(Data Encryption Standard)。

这是DES的原理图

DES:

其中算法最核心的部分“轮函数”就是你所熟知的扩散加混淆。

我们把一个32bit的明文扩散成48bit,我们称这个扩散的表盒为“E盒”。

接下来,密钥进场,与之异或,异或后的结果被分为8组,一组6bit,每组数据分别游经自己的“S盒”形成8个4bit的结果 ,最终进行合并,正好又恢复了32bit。还没完,我们将结果再进行一次扩散,这次的表盒称之为“P盒”,注意此次扩散后依然为32bit,此时的结果就是最终的结果。

以上就是DES大名鼎鼎的“轮函数”,但轮函数只加密了一半的明文,因为一开始就被分为两组,各32bit,R0经过了复杂的轮函数之后在与L0进行异或,生成R1,L1什么也不用做,直接由R0得来(未加密前),再将L1和R1交换位置,两者拼接,就是密文,这就是著名的“Feistel加密结构”

为什么要分成两组?为什么L1不需要计算直接继承R0?为什么最后还要进行交换?

一切的一切都是为了——解密,解密就是将密文再加密一遍,其核心就是异或

那么这样的一次加密安全吗?对于心思缜密的密码学家来说,肯定不够!DES采用了16轮加密,每一轮都让密码的复杂度指数级上涨,每一轮都在放大明文和密文的差异。最后的最后,就是开头和结尾增加一次移位,也称为置换,这就是全部的“DES”

现在的密码大多都超出了普通人理解的极限,DES只是一个开始,却让我们思考如何让它呈现的时候,费劲了心力!

密钥如何生成:

还是为了安全性,16轮加密用了16个不同的密钥。你首次手动输入的密钥应该为64bit,它首先被置换为56bit(选择置换),消失的8位不参与加密,用于进行“奇偶校验”(不做展开),然后将56bit的数据分为两组,分别进行一次“左巡回转换”——数据左移1位,接着两组数据合并再进行一次置换为48bit(压缩置换),为第一轮的子密钥。

接下来,用合并前的C1和D1再进行一次左巡回转换(不同轮数,坐循环的次数也不同)得到C2和D2,进行一次置换得到第二轮的子密钥。如此往复,我们就得到了16个不同的子密钥。

附上一张大局图:

DES自诞生之初就饱受争议,它不安全吗?恰恰相反,只要密钥够长,它就足够安全。它为人诟病的是人们不知道它为什么安全。于此同时,密钥的种可能性都抵御不了迅猛发展的计算机技术,1999年DES被暴力破解,耗时22小时15分钟,这也标志着密码学正式推出了密码学历史的舞台

密码分组;

注意了,DES只能处理64bit的数据,但现在的数据动不动就上万bit,怎么解决呢?——密码分组,把数据拆分成n个64bit的数据块,分别进行DES然后再进行重组,听上去很合理,但是——怎么组?最暴力的方法就是直接拼接,这种简单粗暴的模式就是——ECB(电子密码本模式):直接将加密完成后的数据拼起来,明文块与密文块一一对应。现在互联网时代海量的数据重复,这就是ECB的漏洞。所以很清晰,DES让单组数据变得安全,却还需要分组模式为整条明文保驾护航。

这里不再过多展开,附上几种常见的分组模式的解析图(初始化向量为计算机随机生成)

ECB(电子密码本模式):

CBC(密码分组链条模式):

​​​​​​​​​​​​​​

CFB(密文反馈模式):

OFB(输出反馈模式):

CTR(计算器模式):

伽罗瓦域:

有限域亦称伽罗瓦域(galois field),是仅含有限个元素的域。用GF(pⁿ)表示pⁿ元的有限域.GF(pⁿ)的乘法群是(pⁿ-1)阶的循环群。p为一个素数,n是一个正整数,F中元素的个数为pⁿ

在抽象代数中,​​​​​​​域是一种可进行加、减、乘和除运算的代数结构。域是环的一种。域和一般环的区别在于域要求它的元素可以进行除法运算,这等价于每个非零的元素都要有乘法逆元。同时,在现代定义中,域中元素关于乘法是可交换的。简单来说,域是乘法可交换的除环。乘法非交换的除环则称为体,或者反称域。

如果域F只包含有限个元素,则称其为有限域。有限域中元素的个数称为有限域的阶。尽管存在有无限个元素的无限域,但只有有限域在密码编码学中得到了广泛的应用。每个有限域的阶必为素数的幂,即有限域的阶可表示为pⁿ(p是素数、n是正整数),该有限域通常称为Galois域(Galois Fields),记为GF(pⁿ)。

当n=1时,存在有限域GF(p),也称为素数域。在密码学中,最常用的域是阶为p的素数域GF(p)或阶为的GF()域

域中减法:找加法逆元(加负数,相加等于0),本质是加法

域中除法:找乘法逆元(乘倒数,相乘等于1),本质是乘法,没有乘法逆元说明不能做除法

正式定义:

数字世界不在无穷无尽,而是有限闭合,这就是有限域(只有有限个数,运算结果仍是它们本身,这是没有进位的计算)

ps:进位是最影响计算机效率的东西

GF(​​​​​​​2)有限域:

异或就是GF(2)里的加法运算,减法和加法没有区别

乘法是与(AND)运算

其他非有限域全部可以构成以阶为的GF()域

如GF(8)是非有限域,因为不是所有的数都有乘法逆元,那如果是GF()呢?答案就留给你自己来验证吧!

一路来我们学习了DES,密码分组模式和伽罗瓦域,这样以来,我们终于获得了一张前往罗马的机票。等等,为什么是罗马?

AES:

1999年,DES被暴力破解出来的明文信息“See you in Rome",是来自罗马的邀请函。1999年3月22日一场影响深远的算法评审会在罗马召开,来自全球的密码学专家齐聚一堂,商讨DES的继任者

2001年11月26日,美国国家标准组织宣布来自比利时的Rijndeal算法摘得这一桂冠,成为新的高级加密标准,也就是大名鼎鼎的AES(Advanced Encryption Standard)

现在是2022年,但这个算法还没有过时,仍然统治着你我所熟知的数字世界,无法撼动。

接下来,进入正题:

AES同DES一样,数据太长,加密前需要进行分组。不同的是,AES把分组长度提升到128bit,然后再细分为16个小组,每组8bit,排进状态矩阵。

先来看看AES的三种规格:


​​​​​​​

用同一个轮函数迭代加密是分组密码的常见操作

进入加密前,会让子密钥和明文进行一次异或,我们称之为——“轮密钥加”

接下来我们进入算法核心——“轮函数”:

轮函数主要包含 4 种运算,但不同的运算轮所做的具体运的算组合并不相同。主要区别是初始轮(Round 0)和最后一轮(Round Nr),所有中间轮的运算都是相同的,会依次进行 4 种运算,即:

[数据混淆] 字节代换(SubByte)
[数据混淆] 行移位(ShiftRow)
[数据混淆] 列混合(MixColumn)
[数据加密] 轮密钥加(AddRoundKey)

第一步——“字节代换”:不同于DES人为的构造S盒,人们把目光投向数学。仔细观察状态矩阵里每个小组都是8bit,也就是256种可能性,所以很自然,人们想到了由256组成的GF(

AES直接把这个域里数字的逆元设为密文

下次加密时直接查表就可以了。

但是,这样可以吗?仔细观察00没有乘法逆元,01的乘法逆元可以它本身。明文和密文一样很危险,所以还需要一步仿射变换。步骤如下

看不懂没有关系,举个例子就好了:

第二步也可以简化为这样:

可以看到矩阵中,每行每列都有5个1,改变一位输入,输出就会完全不同,这样数据十分的随机

最终我们得到了这样的一张表,还是什么也不用干,得到输入后查表就可以了:

这张表的本质就是“混淆”,因此也可以被称为——“S盒”

第二步是——“行移位”:

这步很简单,把第二行往左移1位,第三行2位,第四行3位 ,除了第一行,其他三行的位置都发生了变化,也就是——行的“扩散”

第三步——“列混淆”:

这步更加简单明了,将状态矩阵和一个常数矩阵相乘以达成列上的“扩散”

例如:

每列的输出都被相同列所有的输入影响,同时每一列的输入,都由上一步行的元素决定,两者的叠加让每个输出数据被所有的输入数据影响,这是极其有效的扩散

最后一步——“轮密钥加”:

这一步和最开始的“轮密钥加”是相同的,和子密钥进行一次异或运算,十分简单

至此,一轮轮函数结束

通常最后一轮的轮函数是没有“列混淆”的,只进行三步。

接下来,密钥的生成:

AES随机生成初始密钥是128位,同样分成16个字节,排列成状态矩阵,然后用于第一次“轮密钥加”。为了增加密钥随机性,还要进行密钥拓展,生成轮函数加密所需的子密钥。

首先让每列的四个数据一组,用W0,W1,W2,W3表示,被叫做——“字”,子密钥按照下图公式生成:

让i = 1就能算出W4到W7,以此类推,如此:

下一轮的子密钥都是由上一轮的子密钥得来,如拉链一样,环环相扣

最后来看g函数:

分成三步:

先是简单的扩散,再经S盒处理,最后与一个名为RC的常数进行异或,每轮RC的值都不一样。

我们继续来看AES的解密:

轮函数的每一步均可逆,所以解密就是加密的逆过程

先由密文和最后一轮的子密钥进行异或,接着就是行移位——左移变成右移,最后是逆向字节代换,仍然是查表即可:

这样一轮轮过后 ,最后一次“轮密钥加”就是最初的明文!

额外说一下,我们日常生活中如WX使用的加密算法就是AES,但是如何进行安全的传输密钥呢?这就要用到非对称加密了。用公钥加密AES的密钥,接收方再用私钥解开,形成安全的通信(双方共同使用相同的AES密钥),因为加解密对称密码比加解密非对称密码的效率高的高的多!如下

至此——完结撒花:

这就是你一路走来寻找的密码算法,一切都是可以落于纸笔的算法,这些复杂,抽象的符号,无一不表示了当然生活的复杂性。只是这样的复杂被封装了起来。我们不需要学会如果去使用,因为它在无声无息的在网络的世界中为你保驾护航,而且,这是到目前为止,尚未出现有效破译方法到密码算法。这就是它的本质——“复杂,无聊“所以——你需要它吗?你没有需要保护的商业机密也没有需要传递的秘密情报。将一串串明文变成这种极其复杂的密文,有何意义?

而这,正是你需要继续去探索的东西。

结语:

从2022/4/16日更新RSA以来到现在2022/07/30,过了三月之多,我们学习了密码学中几个最为经典的密码学算法,但这只是刚刚开始,探索新的大陆需要无谓的勇者,需要星星之火可以燎原的信仰。

密码学无法让你升职加薪,繁琐的计算也非常无趣,也许唯一有用的就是让你对这个世界又多了一点点的了解,但也许就是这一点点点理解,让你在这个信息即流量,隐私即利益的时代,行使自由的方式——“无论输入的是什么,输出的都是自由”。

从DES走到AES(现代密码的传奇之路)相关推荐

  1. 3、【java数据安全】对称加密的5种(DES/3DES、AES、IDEA、PBE)常见算法的使用示例

    java数据安全 系列文章 1.[java数据安全]数据安全之加密解密(base64.MD.SHA.DES.AES.IDEA.PBE.DH.RSA.EIGamal).数字签名(DSA.ECDSA)和数 ...

  2. 如何走上通往IT职业的成功之路

    如何走上通往IT职业的成功之路 来自:AMT研究院 与大众的普遍想法相反,计算机科学专业的就业机会正处于一个空前的高峰期.我们正在学生中传播着这样的信息,计算机科学有危险从一条斑驳的彩虹转变为一潭技术 ...

  3. RSA加密解密DES加密解密AES

    文章目录 RSA java 依赖 RSACoder RSACoderTest js示例 DES 示例一 js java 示例2 js java AES AesUtil RSA java 依赖 < ...

  4. DES, RC4, RC5, AES, RSA, MD5, SHA1 安全算法分析

    1. 基于对称密钥的加密算法主要有DES.RC4.RC5, AES 对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法.有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥 ...

  5. java aes pbe_java – PBE优于DES,3DES和AES的优势

    如果我理解您使用的术语,PBE表示密码或基于密码短语的加密. 根据我所看到的消息来源,PBE是一种"使用"某种加密算法的方式.您可以使用用户提供的密码或密码短语将其转换为加密系统所 ...

  6. NKCTF[eazy_baby_apk](DES名字的AES

    apk文件用jadx打开. 找到主要函数部分,一看就是一堆提示信息,向AES加密和DES. 先看第一部分 key1中的e全部用3代替可以得到第一种填充    r3v3rs3car3fully 接着往下 ...

  7. aes没有密码能解密吗_如果人体基因密码被破译,人类平均寿命能提高到1000岁吗?...

    长生是很多人的追求,但限制我们长生的并不是我们的科技不够发达,而是我们的身体有使用寿命,即使我们的基因密码被破译,我们的平均寿命也不会达到1000岁,但如果科学技术足够进步,或许我们能够实现永生. 我 ...

  8. 知乎究竟走的是什么路线?克隆之路靠谱吗?

    一度时间,微信朋友圈被各种回答问题的刷爆屏.这也是最近非常火爆的一种模式,市场解读为知识网红模式.知识网红其实就是靠自己的知识传播而完成变现的机会.最初我们看到一款"分答"的应用爆 ...

  9. 为什么华为、阿里、字节跳动、微软等都走上了云原生和数字化之路?

    亲爱的开发者朋友们好哇, 前几天我发了篇文章,请各位朋友帮忙给最新一期的<新程序员>选封面,并且和大家说内容已经全部完成,即将出版和大家正式见面.今天,它来啦!<新程序员003:云原 ...

  10. 走好安防海外市场拓展这条路 先认清这些

    中国安防企业整体实力的提升,越来越多的中国安防企业开始将眼光盯向海外市场,呈现出集体出海的趋势.海外安防市场的巨大潜力是目前国内安防行业普遍看好的端口,从2013年开始,国内企业开始大举攻占海外市场. ...

最新文章

  1. 不幸的是MyApp已停止。 我该如何解决?
  2. (zhuan)Castle项目简介--第一部分(译)
  3. stm32f105vct6例程_STM32F107VCT6 107USB例程USB DEVICE例程
  4. 关于arm-linux-gcc的安装与配置
  5. boost::container模块实现检查相等的容器的测试程序
  6. unity案例入门(二)(坦克大战)
  7. Java: IE Firefox下载文件中文乱码的兼容代码
  8. html内容封装为一个对象_技术赋能还是内容为王,哪一个才是短视频创作的关键?...
  9. C++代码 快速排序总结
  10. 传智播客 C/C++学习笔记 二级指针作为输出参数以及空间的释放
  11. 算法萌新如何学好动态规划(二)
  12. Win11 鼠标右键后怎么设置让其显示更多可操作的选项
  13. 视频怎么加水印?这里有你想要的答案
  14. 华为外包公司一面二面三面回顾
  15. 为图片添加LOMO效果
  16. 区域化管理 让多光伏电站运维“1+1>2”
  17. Boss直聘招聘信息爬取
  18. Nvidia Agx Xavier平台无PD控制器USB接口调试
  19. Windows下查看电脑的CPU个数,核心数,线程数
  20. 金立手机官网无法访问 金立破产已进入倒计时

热门文章

  1. 转载—sqlmap在https情况下的一个错误
  2. C++学习笔记20220701
  3. 基于JAVA菜市场的疫情防控管理系统计算机毕业设计源码+系统+lw文档+部署
  4. 008-Web前端-CSS基础理论-盒子模型
  5. 数学不好的人不适合当程序员吗?
  6. 用Cadence Virtuoso IC617仿真工艺库参数
  7. 秋招心得——两个多月的蜕变
  8. 哪个学校计算机每年招不满,211院校有每年考研招不满的情况吗?
  9. css3 的混合模式
  10. 梁静茹《勇气》VS 萧淑慎