✅ 操作成功!

流密码

发布时间:2023-06-11 作者:admin 来源:文学

流密码

流密码

-

2023年3月6日发(作者:金太阳好教育平台)

对称加密算法总结–流密码与块密码

随机数

在对称加密的流密码算法和块密码算法中,都需要⽣成随机的密钥流,明⽂通过密钥加密得到密⽂,所以随机数⽣成算法显得⼗分重要,它

决定加密密钥,密钥决定了加密算法的安全性。

随机数的类型分有三种,伪随机数⽣成器,密码学伪随机数⽣成器和真正的随机数⽣成器,前两者⽣成随机数通过软件实现,真正的随机数

⽣成器通过硬件实现。

1、伪随机数⽣成器:软件实现,随机性。

2、密码学伪随机数⽣成器:软件实现,随机性,不可预测性。

3、真正的随机数⽣成器:硬件实现,随机性,不可预测性,不可重现性。

随机性很好理解,简单地说就是每个数字出现的概率是差不多的,出现的次数的平均的。不可预测性也很好理解,就是每次⽣成的随机数,

它们之间是没有关联的,我们⽆法从前⾯⽣成的随机数中找到规律,从⽽推导出后⾯可能⽣成的随机数。不可重现性的意思就是随机数⽣成

器不会⽣成完全⼀样的两个随机数,⽆论经过多长时间。

“内部状态“(internalstate)

上⾯的三种随机数⽣成器,其内部⽣成原理都是⼀样的,它们都需要维护⼀个“内部状态“。拿伪随机数⽣成器举例,c语⾔中的rand()

函数⽤来⽣成⼀个随机数他,它就是⼀个伪随机数⽣成器,通过算法得到随机数,对于伪随机数⽣成器来说,⾥⾯维护的内部状态称为”种

⼦“,使⽤过rand()函数⽣成随机数的同学都知道,假如我们只是单纯地inta=rand();那么每次得到的随机数a都是⼀样的。原因

是rand()函数,随机数⽣成器,是根据”种⼦“的值,结合算法公式计算出⼀个随机数的,这个”种⼦“在计算机启动后就⽣成了,并且

值是固定的,所以根据这个固定的”种⼦“结合特定的算法公式,每次计算出来的随机数都是⼀样的。为了得到不同的随机数,使⽤

rand()函数,每次都要重新”播种“,也就是传⼊不同值的”种⼦“,具体在这⾥不详述,⼤家可以⾃⾏查找随机数函数的⽤法,⼤多都

会讲到如何重新产⽣”种⼦“。这⾥我们要知道,伪随机数⽣成器是软件层⾯,根据内部状态”种⼦“结合特定算法公式,得到的随机数。

对于硬件实现的真正的随机数⽣成器,它内部也维护了⼀个“内部状态“,之所以它能⽣成不可预测性,不可重现性的随机数,很重要是因

为它的内部状态,称为”熵“,数值来⾃于外部如温度和时间等。

对称加密

数据加密算法主要有对称加密和⾮对称加密两种,对称加密,简单地说就是使⽤⼀个密钥加⼀个算法来加密明⽂,得到不规则的密⽂,加密

和解密的过程是可以互逆的,明⽂通过密钥和算法经过计算得到密⽂,反过来密⽂通过相同的密钥和算法,可以计算得到明⽂,显然对称加

密中加密和解密都使⽤的同⼀个密钥,密钥是⼀串数字,密钥的长度决定了该加密算法的安全性。

对称加密算法分两⼤类,流密码算法和块密码算法。

流密码算法

流密码算法,或者叫序列密码,算法⼤概的原理是,每次加密都通过密钥⽣成⼀个密钥流,解密也是使⽤同⼀个密钥流,明⽂与同样长度的

密钥流进⾏异或运算得到密⽂,密⽂与同样的密钥流进⾏异或运算得到明⽂。流密码算法是以“⼀次性密码本“为雏形演变出来的加密算

法,⼀次性密码本算法很重要的⼀个特性就是密钥使⽤的”⼀次性“,来看看⼀次性密码本的算法原理。

⼀次性密码本

⼀次性密码本的操作核⼼是异或运算,明⽂和同样长度的密钥进⾏异或运算,得到密⽂,密⽂根据加密时使⽤的的密钥进⾏异或运算,解密

得到明⽂。举个例⼦,假如我们的明⽂是:

11100110

使⽤的加密密钥是:

11101110

那么明⽂与密钥进⾏加密异或运算,得到的密⽂就是:

10101000

之后密⽂通过同样的密钥进⾏异或运算,即可解密出明⽂:

10101000

11101110

11100110

这就是⼀次性密码本的原理,⼀次性密码本保证安全性的⽅法是,每⼀次加密解密后,下⼀次加密解密会更换不同的密钥,也就是每次都更

换密钥。对于同⼀个明⽂信息,每⼀次加密都会使⽤不同的密钥,这样即使别⼈掌握了其中⼀个密钥和密⽂,他也⽆法确定这个密⽂是否是

通过这个密钥加密⽣成的,⽆法确定该密⽂使⽤这个密钥解密出的就是原始明⽂。

流密码算法便是以⼀次性密码本为雏形实现的加密算法,由上⾯⼀次性密码本的原理可以看到,安全性关键在于每次都要更换密钥,这

个密钥就是⼀次性的。流密码算法是如何实现⼀次性的密钥?答案就是使⽤随机数⽣成器。将密钥作为“内部状态“传⼊随机数⽣成器中,

每次由随机数⽣成器⽣成随机的密钥流,然后明⽂和密⽂都使⽤相同的密钥流进⾏异或运算加密和解密。

块密码算法

块密码算法也叫分组密码算法,从字⾯意思就可以知道,它把加密和解密序列分成了⼀个个分组,最后把每⼀块序列合并到⼀起,形成明⽂

或者密⽂。根据不同的分组加密⽅式,每个分组之间可以有联系,也可以没有联系,下⾯来看看块密码算法的三种模式。

ECB电码本模式

ECB电码本模式,将明⽂拆分成⼀个⼀个等长字节的数据块,然后依次对每⼀个数据块进⾏密钥加密得到密⽂,最后将⼀个⼀个的密⽂分组

按顺序合成⼀个序列,得到密⽂。

ECB电码本模式的优点是,每⼀个数据分组的加密和解密过程都可以互相独⽴,只需要密钥就可以进⾏,所以使⽤EBC电码本模式的加

密和解密过程都可以并⾏处理,⼤⼤提⾼了处理速度。不过,这种分组之间互相独⽴,没有联系的加密⽅式,被证实是不安全的。原因是对

于相同的明⽂,使⽤相同的密钥加密得到的密⽂是⼀样的,即使它们被分了组,例如⼀个明⽂序列中出现多个字符‘a’,在多个分组中都

存在该字符,由于每⼀个分组使⽤的都是同⼀个加密密钥,所以多个分组中的字符‘a’都会被加密得到相同的密⽂。这样很容易被发现规

律,当被发现使⽤的是EBC电码本模式进⾏加密后,破解就变得很容易了,所以该加密⽅式已经被证实是不安全的。

你可能会想到⼀个问题,如果明⽂序列按照某⼀固定字节长度等分,可是最后⼀块分组数据块发现⽆法等分,怎么办?当遇到某⼀数据

块⽆法等分的情况,采取的是数据填充⽅式,填充标准有PKCS#7,PKCS#5,因为我没有去深⼊了解,所以在这⾥不详述,我们只要知

道是采⽤数据填充⽅式将分组数据块填充到字节数据与前⾯的数据块等长即可。

CBC密⽂分组连接模式

第⼆种是CBC密⽂分组连接模式,由名字可以看出,分组之间有连接,也就是分组数据块之间存在着联系,这样做可以解决EBC模式的不安

全情况,看看CBC密⽂分组连接模式的具体过程:

1.将明⽂序列分成多个等长的分组数据块,如果数据块长度⽆法等分,那么进⾏填充操作。

2.依次处理每⼀个分组数据块,对第⼀个分组数据块进⾏加密时,利⽤随机数⽣成器⽣成⼀个初始化向量IV,数据块⾸先与IV进⾏异或

运算,然后与密钥进⾏运算,得到第⼀块密⽂。

3.第⼆块分组数据块会先和前⼀个分组密⽂进⾏异或运算,再和密钥(使⽤的都是同⼀个密钥)进⾏运算得到第⼆块密⽂。也就是说,

除了第⼀块分组数据块的初始化向量IV是通过随机数⽣成器⽣成之外,其余数据块的IV都是其前⼀个数据块的密⽂。

4.最后,将所有分组数据块密⽂按顺序组合成完整的密⽂。

可以看到CBC密⽂分组连接模式,通过让每⼀个分组之间建⽴联系,⽽不是让它们互相独⽴,解决了EBC电码本模式的不安全情况。第

⼀个分组数据块的初始化向量是通过随机数⽣成器⽣成,长度和分组长度⼀样。明⽂完成加密后,将密⽂,初始化向量和密钥⼀起发送给解

密⼈。⾄于解密,很简单,把步骤反过来,第⼀个密⽂与密钥运算后,和初始化向量IV进⾏异或运算,得到第⼀个明⽂,下⼀个密⽂分组在

和密钥运算后,和前⼀个明⽂进⾏异或运算,得到第⼆个明⽂。

CBC模式虽然解决了EBC模式的安全问题,但是分组数据块之间的联系,使得加密和解密必须⼀个接⼀个顺序进⾏,⽆法实现并⾏操作,降

低了处理速度。

CTR计数器模式

最后⼀种,CTR计数器模式,它同样在每⼀个分组数据块之间建⽴联系,引⼊的是随机密钥流变量,类似于初始化向量。来看看具体过程更

好说明它的原理:

1.第⼀步和前⾯⼀样还是进⾏分组处理,不过不需要对不等长的分组数据块进⾏填充处理。

2.开始依次处理每⼀个分组数据块,⾸先⽣成⼀个随机密钥流,把密钥流与密钥流进⾏运算后,得到的值再和明⽂进⾏异或运算,得到

密⽂。

3.下⼀个密⽂分组,也需要先将密钥流和密钥流进⾏运算,这个密钥流是前⼀个密钥流是有联系的,可以根据⼀个密钥流得到下⼀个密

钥流,最简单的⽅式是递增。所以第n个分组数据块的密钥流是第n-1个分组的密钥流加⼀。

4.得到密钥流和密钥运算后的值,第⼆个分组数据块就可以与该值进⾏异或运算,得到分组密⽂,然后把密钥流加⼀,得到下⼀个分组

数据块的密钥流。

使⽤CTR计数器模式⼀样解决了EBC模式的安全问题,因为分组数据块之间建⽴了联系,就是那个密钥流,第⼀个随机密钥流通过随机数⽣

成器⽣成,有多少个分组数据块就有多少个密钥流,每个密钥流之间有规律联系。⾄于拿到密⽂后的解密过程,⽐CBC模式更简单明了,先

把密钥流和密钥进⾏运算处理后,再和密⽂进⾏异或运算,即可得到⼀块分组明⽂,最后按顺序把所有明⽂拼凑在⼀起即可。

👁️ 阅读量:0