zoukankan      html  css  js  c++  java
  • 《图解密码技术》[02] 对称密码


    所谓对称密码,是指在加密和解密时使用的都是同一密钥,比如之前提到的恺撒密码。而非对称密码,也称之为公钥密码,是指在加密和解密时使用不同密钥的方式。

    本章会主要介绍几种对称密码,如DES、三重DES、AES等,在这之前,要先了解一下什么是比特序列运算。

    1、比特序列运算

    在这之前,我们先来看一个异或运算(不同取1,相同取0,以下称XOR),假如有二进制数01001100为A,10101010为B,则两者XOR结果为C:
    A 0100 1100 
    B 1010 1010
    C 1110 0110

    将结果C和B再进行XOR运算,结果又会变回A:
    C 1110 0110
    B 1010 1010
    A 0100 1100

    上面的计算,就和加解密的步骤非常相似:
    • A是明文,B是密钥,C是密文
    • 发送者将A通过密钥B加密得到C,接收者将收到的C通过密钥B解密得到A

    而我们知道,计算机的操作对象并不是文字,而是由0和1排列组成的比特序列所以加密的过程,实际上就是将表示明文的比特序列,转换为表示密文的比特序列

    由于同一个比特序列进行两次XOR运算后会回到最初的状态,不妨来一个由很多点组成的图像“字母D”,如下图,白点作为0,黑点作为1:

    由此看到,这里使用的蒙版就是一个比特序列,使用XOR运算将原来的图像进行了掩盖。 当然,这里只是为了形象地表示,实际上在计算机中,图片虽然也是0和1的序列,但并不是按如上使用0和1进行类似像素描点来展示的。但不论如何我们已经知道,数据可以通过一个随机的比特序列进行XOR运算,达到加密的目的。



    2、DES

    Data Encryption Standard 是1977年美国联邦信息处理标准中采用的一种对称密码,但是随着计算机的进步,DES已经能够在数小时能被暴力破解,所以我们现在也不应该再使用DES了。

    DES是一种将64比特的明文加密成64比特的密文的对称密码算法,这里的64比特的单位成为分组。DES的密钥长度为56比特,另外还有7比特用于设置错误检查。由于其基本结构是由Horst Feistel设计,因此也称为Feistel网络

    2.1 Feistel网络的加密

    Feistel网络中,加密的各个步骤称之为“轮”,整个加密过程就是进行若干次轮循环。
     
    Feistel网络中,每一轮都需要使用不同的密钥,因为它只是一个局部密钥,所以称为子密钥。加密算法如上图,明文被分为左侧和右侧两部分,轮函数根据右侧数据和子密钥,计算出一串比特序列,用该序列和左侧数据进行XOR运算,作为加密后的左侧数据。

    但这样一来右侧根本就没有加密,所以在下一轮需要将左右侧数据对调,再换一个子密钥继续进行加密,说白了,就是把之前没加密的右侧数据也加密。每轮处理32比特,最后一轮结束后不需要对调。

    如下图加密96比特明文,即进行三轮加密:
     

    2.2 Feistel网络的解密

    不论轮函数具体是什么,根据XOR运算的特性,Feistel网络的解密,只需要把每轮加密的结果使用相同的子密钥重新运算一次,即可还原为明文,如下图:

    多轮情况下也是一样的,解密操作只要按照相反的顺序来使用子密钥就可以了:
    (笔者注:对于上图3-6的解密3轮,还是没理解,脑子转不过来)
     

    2.3 Feistel网络的性质

    • 无论使用任何轮函数都可以正确解密
    • 加密和解密可以用完全相同的结构来实现,只是循环次数不同

    2.4 三重DES

    三重DES就是将DES重复三次得到的一种密码算法,通常缩写为3DES。它的加密机制如下图所示:
     
    由于DES密钥长度为56比特,所以三重DES的密钥长度则为56*3=168比特。

    从上图我们可以看出,3DES并不是进行三次加密,而是进行了加密、解密、加密。这里加入解密是为了兼容原来的DES,将三重加密都使用相同密钥,那么在加密和解密后得到的还是明文,再进行第三次加密,即和原来的DES效果相同。因此,以前DES加密的秘闻,也可以通过3DES解密。

    • 如果所有密钥都相同,则结果和普通的DES等价
    • 如果密钥1、3相同,2不同,则称为DES-EDE2
    • 密钥完全不同,则称为DES-EDE3

    3DES的解密过程和加密过程正好相反,是以密钥3、2、1的顺序执行 “解密、加密、解密” 的操作。

    尽管3DES目前还被银行等机构使用,但是其处理速度不高,且安全性方面也逐渐显现了一些问题。



    3、AES

    DES的安全性逐渐出现了一些问题,自然就出现了取代它的 Advanced Encryption Standard,这种加密算法是从众多候选算法中评选出的名为Rijndael的对称密码算法,确定其成为AES。Rijndael没有使用Feistel网络,而是使用了SPN结构。

    DES的分组是64比特,而Rijndael的分组则是128比特,也就是16字节,它的算法首先需要逐个字节地进行SubBytes处理,所谓SubBytes,即以每个字节的值(0~255中任意值)为索引,从一张拥有256个值得替换表中找出对应值的处理,也就是说,把一个1字节的值替换为另一个1字节的值,这类似于简单替换密码,不过是256个字母的版本。

    SubBytes之后要进行ShiftRows处理,即将SubBytes的输出以字节为单位进行打乱,这种打乱是有规律的。ShiftRows之后进行MixColumns处理,即对一个4字节的值进行比特运算,将其变为另一个4字节值。

    最后,将MixColumns的输出与轮密钥进行XOR运算(Rijndael算法也是和Feistel一样是采取轮的),即进行AddRoundKey,到这里,Rijndael的一轮就结束了。实际上,在Rijndael中需要重复进行10~14轮计算。这种算法和之前的Feistel相比,因为输入的所有比特都会被加密,而不是每轮只加密一半,所以优势在于加密所需要的轮数更少。

    小结一下加密过程就是:
    • SubBytes:16个字节,每个字节进行替换表替换
    • ShiftRows:平移行(有规律平移,如下图,第一个字节移动到对应MixColumns的第一个字节,第二个字节对应第二个MixColumns的第二个字节,第三个对应第三个MixColumns的第三个,以此类推)
    • MixColumns:对每4字节进行比特运算,变成另外的4字节值
    • AddRoundKey:与轮密钥进行XOR运算

     
    解密过程则分别存在反向运算InvSubBytes、InvShiftRows、InvMixColumns,这是因为Rijndale不像Feistel网络一样可以使用同种结构实现加密和解密。
     
    在书中提到,Rijndael还没有出现针对性的有效攻击,但因其背后有着严谨的数学结构,从明文到密文的计算过程可以全部用公式表达,意味着能够通过数学方法进行破译,这为新的攻击方式产生了可能。

    尽管作者提到DES已能在数小时内破译,但可能涉于篇幅对于DES也没有案例进行破译讲解。所以DES和AES这部分的知识点大概也就这样理解吧,了解就行。核心还是在于对称密码的特点,即加密和解密使用相同的密钥,这里的两个算法都涉及以XOR运算作为基础。


  • 相关阅读:
    使用Jquery EasyUi常见问题解决方案
    短信平台接口调用方法参考
    linux查找日志技巧
    Linux 上传 启动 删除...命令总结
    java 验证手机号码、电话号码(包括最新的电信、联通和移动号码)
    Web Services 中XML、SOAP和WSDL的一些必要知识
    Mac环境下配置PhpStorm
    Python爬虫刷回复
    Django和layim实现websocket
    Python爬虫刷回复
  • 原文地址:https://www.cnblogs.com/deng-cc/p/7538485.html
Copyright © 2011-2022 走看看