对称密码

对称密码

为什么要使用对称密码?

为了保证传输的***信息的机密性***。即为了***让别人看不懂我们到底传输了什么***,就将需要传输的明文信息通过对称加密算法,转换成完全看不到明文信息的密文,然后再进行传输。

XOR运算

1 XOR运算

假设有一枚硬币,正面记为0,反面记为1,初始状态设为0,即正面。那么异或运算:

0(正面) XOR 0(正面) == 0(正面)

0(正面) XOR 1(反面) == 1(反面)

1(反面) XOR 0(正面) == 1(反面)

1(反面) XOR 1(反面) == 0(正面)

通过上述的例子,大家可以得出一个规律,即两个相同的数进行XOR运算的结果一定是0,两个不同的数进行XOR运算的结果一定是1。

2 比特序列的XOR

假设A=01001100,B=10101010,那么A xor B如下:
在这里插入图片描述

即逐个比特进行XOR运算。

如果(A XOR B) XOR B =A,即经过两次异或运算,式子中的B会被抵消。(这块和对称加密极度相似,①将明文A用密钥B进行加密,得到密文A XOR B;②将密文Z XOR B用密钥进行解密,得到明文A

在这可能你会有疑问:既然异或运算就能够达到和对称加密类似的效果,那为什么不直接使用异或运算来加密呢,还用啥对称加密算法,不是多此一举吗?

那你试着想一下(在此,我仅仅列出我能想到的点,下一节的一次性密码本就是异或运算用于加密的例子4、):

①XOR运算他需要一个和明文等长的密钥B,那我都能保证和明文等长的B的安全了,我为什么不能直接保证明文A的安全性?

②B需要的是一个别人无法预测的比特序列,这个比特序列如何产生?如何传输?

一次性密码本

1 什么是一次性密码本

只要通过暴力破解对密钥空间进行遍历,无论什么密文总有一天能够被破译。而一次性密码本是个例外,即便使用暴力破解遍历整个密钥空间,一次性密码本也绝对无法被破译。

2 一次性密码本加密

原理:将明文与一串随机的比特序列进行 异或运算。

3 一次性密码本解密

解密时加密的反向运算,也就是说,用密文和密钥进行异或运算,就可以得到明文。

4 为什么一次性密码本是无法破译的?

针对加解密算法,我们只要能遍历整个密钥空间,那么总有一天我们会尝试找到和加密密钥相同的密钥,这是事实(但在实际生活中,很多密钥之所以没有被破解,就是受密钥时效性----验证码、破解代价等限制),对于一次性密码本,即使我们找到正确的密钥,解出正确的明文,***但是我们没办法判断这个明文到底是不是正确的明文***-------因为密钥是个随机的比特序列,这个随机比特我们会找到很多种,然后解出很多种明文,但是我们就是没办法确定哪个是对的。

5 一次性密码本没有被使用的原因

①既然能保证与明文等长的随机比特序列的安全性,为啥不能直接保证明文比特的安全性?既然能保证随机比特能正确安全传输,为啥不能直接保证明文比特的正确传输?----即密钥保存和配送的问题(公钥算法、密管中心、共享密钥、DH密钥交换等都可以解决秘钥的配送问题)

②一次性密码本中绝对不能重用过去用过的随机比特,因为一旦密钥比特序列泄露,之前采用这个密钥加密的内容将可以被全部被解密-----密钥的重用问题。

密钥的生成----(必须是无重现性的真随机数)、同步----(明文很长时,密钥也很长,密钥不允许任何错位或缺失,因为密钥一旦出现任何一丁点的问题,所有的信息将无法被解密)等问题。

更多详细内容,可参考:https://blog.csdn.net/chengqiuming/article/details/82155036

DES&3DES

1 DES

DES data encryption standard是1977年美国联邦信息处理标准FIPS中采用的一种对称密码。

在RSA公司举办的DES challenge中,1999年DES challenge 3中只使用22h15m就破解了,所以现在除了用它来解密以前的密文外,现在都不实用DES了。

2 DES加密&解密
  • DES是一种将64比特的明文加密成64比特密文的对称加密算法,它的密钥长度是64比特,但是有效密钥长度是56个,因为每隔7个比特就有一个校验位。
  • DES是以64比特的明文为一个单位来进行加密的,这个64比特的单位称为分组。一般来说,以分组为单位进行处理的密码算法称为分组密码,DES就是分组密码的一种。
  • DES每次只能加密64比特的数据,如果要加密的数据较长,就需要进行迭代,迭代的具体方法称为模式(后面讲解)。

加解密过程如图:

在这里插入图片描述

DES是一种16轮的feistel网络。其中每一轮的计算流程如下
在这里插入图片描述

一轮中具体的计算步骤:

①将输入的数据等分成左右两部分。
②将输入的右侧直接发送到输出的右侧。
③将输入的右侧发送带轮函数。
④轮函数根据右侧数据和子密钥,计算出一串随机比特序列。
⑤将④中的比特序列与左侧的数据进行异或运算,将结果作为加密后的左侧。

完整的DES算法如下图:

在这里插入图片描述

1.输入64位明文数据,并进行初始置换IP。
2.在初始置换IP后,明文数据再被分为左右两部分,每部分32位,以L0,R0表示。
3.在密钥的控制下,经过16轮运算(f)。
4.16轮后,左、右两部分交换,并连接再一起,再进行逆置换。
5.输出64位密文。


具体内容讲解:
①初始置换
DES算法使用64位的密钥key将64位的明文输入块变为64位的密文输出块,并把输出块分为L0、R0两部分,每部分均为32位。

将输入的64位明文的第1位置换到第40位,第2位置换到第8位,第3位置换到第48位。以此类推,最后一位是原来的第7位。置换规则是规定的。L0(Left)是置换后的数据的前32位,R0(Right)是置换后的数据的后32位。

②加密处理--迭代过程
经过初始置换后,进行16轮完全相同的运算,在运算过程中数据与秘钥结合。

函数f的输出经过一个异或运算,和左半部分结合形成新的右半部分,原来的右半部分成为新的左半部分。每轮迭代的过程可以表示如下:
                        Ln = R(n - 1);
                        Rn = L(n - 1)⊕f(Rn-1,kn-1)
⊕:异或运算
Kn是向第N层输入的48位的秘钥,f是以Rn-1和Kn为变量的输出32位的函数

③逆置换
将初始置换进行16次的迭代,即进行16层的加密变换,这个运算过程我们暂时称为函数f。得到L16和R16,将此作为输入块,进行逆置换得到最终的密文输出块。逆置换是初始置换的逆运算。从初始置换规则中可以看到,原始数据的第1位置换到了第40位,第2位置换到了第8位。则逆置换就是将第40位置换到第1位,第8位置换到第2位,以此类推.

DES的解密过程和DES的加密过程完全类似,只不过将16圈的子密钥序列K1,K2……K16的顺序倒过来。即第一圈用第16个子密钥K16,第二圈用K15,其余类推。

DES更多详细内容,可参考:https://blog.csdn.net/yxtxiaotian/article/details/52025653

3 3DES

现在DES已经可以在有限时间内实现暴力破解了,3DES就是为了替代DES而开发出来的一种分组算法。

3DES是为了增加DES的强度,将DES重复三次所得到的一种密钥算法,也称为TDEA或3DES。3DES的实现过程如下图:

在这里插入图片描述

  • 明文经过三次DES处理才能变成最后的密文,由于DES有效的密钥长度是56比特,所以3DES的密钥长度就是56*3=168比特。
  • 加密时,三重DES并不是进行三次加密(加密—>加密—>加密),而是***加密—>解密—>加密的过程。这样的目的是为了兼容普通的DES,即3DES具有向下兼容性,因为当三个密钥都相同时,3DES==DES。同理,解密时也不是三次解密(解密—>解密—>解密),而是解密—>加密—>解密***的过程。

3DES解密过程如下图:

在这里插入图片描述

AES

1 AES简介
  • AES(advanced encryption standard)是取代前任标准DES而成为新标准的一种对称密码算法。它的产生经历了很长时间的选拔过程,采用的是与DES完全不同的一种***Rijndael算法***。
  • Rijndael算法的分组长度和密钥长度可以分为32比特为单位咋128比特到256比特的范围内进行选择,不过***在AES的规格中,分组长度固定为128比特,密钥长度只有128比特----10轮、192比特----12轮、256比特----14轮三种***。
  • 在密钥长度为128位时,要进行10轮循环运算,其中***9轮为subBytes(字节代换)->ShiftRows(行移位)->mixColumns(列混合)->addRoundKey(轮密钥加),最后一轮为subBytes(字节代换)->ShiftRows(行移位)->addRoundKey(轮密钥加)***。

AES更多详细内容请参考:https://blog.csdn.net/qq_38289815/article/details/80900813

分组密码的模式-----迭代模式

1 为什么要使用分组模式?
  • DES(64比特)、3DES(64比特)、AES(128比特、192比特、256比特)都属于对称分组加密算法,而分组算法每次只能处理特定长度的一块数据的一类算法。这里的一块就是分组,一个分组的比特数就是分组长度

  • 分组密码算法只能加密固定长度的分组,但是我们实际需要加密的明文可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密,而这个迭代的方法就称为分组密码的模式;***当我们加密的明文分组长度小于分组密码的分组长度,这个时候就需要在加密前使用填充模式,将数据填充至分组密码的分组长度,然后在进行加密,解密完成后,需要使用去填充模式,最终才能得到解密后的真实数据***----这块后续讲解。

  • 明文分组是指分组密码算法中作为加密对象的明文,明文分组的长度与分组密码算法的分组长度是相等的。

  • 密文分组是指使用分组密码算法将明文分组加密之后所生成的密文。

在这里插入图片描述

2 ECB模式
  • ECB模式:electronic codebook mode电子密码本模式。在ECB模式中,将明文分组加密之后的结果直接作为密文分组。
  • 具体过程如图:

在这里插入图片描述

  • 使用ECB模式加密时,相同的明文分组会被转换成为相同的密文分组,也就是说,我们其实是将明文分组转换为密文分组。即明文分组和密文分组是一个一一对应的关系,因此使用ECB模式加密时,破译者可以根据“相同明文分组转换为相同的密文分组”这一特性来破译密码。

  • 对ECB模式的攻击:

    ①改变密文分组顺序。因为在ECB模式中,每个分组都各自独立地进行加密和解密,当改变密文分组的顺序的时候,相应的明文分组顺序也会被改变。

    银行转账业务中:假设第一个分组是汇款方式账户,第二个分组是收款方账户,第三个分组是汇款金额,如果将第一个分组和第二个分组交换,那么本来是从汇款方将钱发给收款方,交换后变成了收款方给汇款方汇款。。。。。。
    

    ②复制、替换、删除密文分组,对应的明文分组也会跟着发生改变。

3 CBC模式
  • CBC模式:cipher block chaining mode 密文分组链接模式。CBC模式是将前一个密文分组与当前明文分组的内容混合起来进行加密的,这样就避免了ECB模式的弱点。
  • 在CBC模式中,将明文分组与前一个密文分组进行XOR运算,然后将结果再进行加密运算。
  • CBC模式具体过程如图:

在这里插入图片描述

  • 对比ECB模式和CBC模式,ECB模式只进行了加密。而CBC模式则在加密之前进行了一次XOR运算。

  • 当加密第一个明文分组时,由于不存在“前一个分组”,因此需要事先准备一个长度为一个分组的比特序列来替代前一个分组,这个比特序列称为初始化向量IV。

  • 一般来说,每次加密都会随机产生一个不同的比特序列来作为初始化向量IV。

  • 对CBC模式的攻击:

    ①IV中任意比特反转,则解密后得到的明文分组中相应的比特序列也会反转。因为解密过程中,第一个明文分组会和IV进行XOR运算。

    ②当使用CBC加密的密文分组中有一个分组损坏了,只要密文长度没有发生变化,则解密的时候最多只会有2个分组受到数据损坏的影响。

    ③当使用CBC加密的密文分组中有一个或多个比特缺失了,在初始缺失比特的位置之后的密文分组也就全部无法解密了。

4 CFB模式
  • CFB模式:cipher feedback mode密文反馈模式。在CFB模式中,前一个密文分组会被送回密码算法的输入端。所谓反馈,就是指返回输入端的意思。
  • CFB具体过程:

在这里插入图片描述

  • 在ECB模式和CBC模式中,明文分组都是通过密码算法进行加密的,而CFB模式中,明文分组并没有通过密码算法来直接进行加密。即明文分组和密文分组之间并没有经过加密这一步骤,而是只有一个XOR运算。
  • 实际上,在CFB模式中,密码算法就相当于用来生成密钥流的伪随机数生成器,而初始化向量IV就相当于伪随机数生成器的种子。

  • 对CFB模式的攻击:

    ①重放攻击,下图就是重放攻击的例子。

    假如昨天我给你发送了由四个密文分组构成的一条消息,攻击者将后三个密文分组截取下来,当我今天在给你发送与昨天内容不同的4个密文分组的时候,攻击者将其截取的三个密文分组替换今天发送的后三个密文分组,造成今天发送的消息没有被发送成功。。。。。这就是重放攻击
    

在这里插入图片描述

5 OFB模式
  • OFB模式:output feedback mode输出反馈模式。在OFB模式中,密码算法的输出会反馈到密码算法的输入中。
  • OFB模式并不是通过密码算法对明文直接进行加密的,而是通过将明文分组和密码算法的输出进行XOR来产生密文分组的。
  • OFB加密的过程:

在这里插入图片描述
在这里插入图片描述

  • 和CBC模式、CFB模式一样,OFB模式中也需要使用初始化向量IV,一般情况下,我们需要在每次加密时生成一个不同的随机比特序列用作初始化向量。
  • CFB模式和OFB模式的区别仅仅在于密码算法的输入。前者密码散发的输入是前一个密文分组,也就是将密文分组反馈到密码算法中;而后者密码算法的输入则是密码算法的前一个输出,也就是输出反馈给密码算法。
6 CTR模式
  • CTR模式:counter mode计数器模式。CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。
  • 在CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流,也就是说 ,最终的密文分组是通过将计数器加密得到的比特序列,与明文分组进行XOR运算得到。
  • CTR模式流程如图:

在这里插入图片描述

填充模式

1 为什么要填充?
  • 对于DES/3DES/AES/SM1/SM4/SM7(前三种属于国际对称加密算法,后三种属于国密对称加密算法)对称加密算法,均属于分组加密算法,当被加密的数据长度不是分组长度的整数倍时,需要在加密前按照一定的规则进行填充,以使其长度符合加密的要求,解密之后再进行去除填充即可还原出数据。
  • DES/3DES/SM7算法的分组长度是8字节,64比特。
  • AES/SM1/SM4分组长度为16字节。
2 填充模式1
  • 遵循PBOC2.0加解密数据填充规范。
  • 如果输入数据msg的长度不是分组长度的整数倍,在msg的右端加上一个字节的0x80,然后在右边加上最少的0x00,使得结果报文**msg‘=(msg||0x80||0x00||……||0x00)**的长度是分组长度的整数倍;如果输入数据msg的长度是分组长度的整数倍,则不填充。
  • 注意:若原加密数据的最末字节可能是0x80,则填充模式不建议使用该模式。
3 填充模式2
  • 遵循ISO/IEC 9797-1的padding模式2标准,等同于PBOC2.0的MAC运算数据填充规范。
  • 对输入数据msg,在msg的右端强制加上一个字节的0x80,然后在右边加上最少的0x00,使得结果报文msg’=(msg||0x80||0x00||……||0x00)的长度是分组长度的整数倍。
4 填充模式3
  • 遵循ISO/IEC 9797-1的padding模式1标准,等同于ANSI X9.19中定义的规范,符合银联规范应用中的MAC运算填充模式。
  • 如果输入数据msg的长度不是分组长度的整数倍,在msg右端加上最少的0x00字节,使得结果报文msg‘=(msg||0x00||……||0x00)的长度是分组长度的整数倍;如果输入数据msg的长度是分组长度的整数倍,则不填充。
  • 注意:若原始数据的最末字节可能是0x00,则不建议使用该模式。
5 填充模式4
  • 遵循ANSI X9.23中定义的规范。
  • 对输入数据msg,在msg的右端强制加上一个字节的填充字符,然后在右边加上最少一个0x00字节,且添加的最后一个字节标识添加的PAD的字节数,使得结果报文msg’=(msg||0x00||0x00||……||0x0X)的长度是分组长度的整数倍,最末字节X取值为0x01-0x10。
6 填充模式5
  • 遵循PKCS#5中定义的规范。
  • 对输入的数据msg,在msg的右端添加N-(||msg||%N)个PAD字符,每个字符取回为N-(||msg||%N),也就是说,对应msg,最右端的数据块,缺m个字节则补充m个数值m,最少补1个0x01,最多补16个0x10(当msg长度为分组长度的整数倍时)。
7 填充模式6
  • PBOC3.0规范的加解密数据填充模式。
  • 对输入数据msg,先在msg的左端填充1-3个字节的数据长度(ANS.1编码对象的长度域),若满足分组长度的整数倍则不填充,否则填充0x80||0x00||……||0x00。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值