密码技术之密码

  最脆弱的环节不是密码,而是人类自己!

前言:

  消息传输时,从一台机器传输到另一台机器上,消息会通过许多台计算机和通信设备进行中转,在这个过程中,就存在恶意窃听者窃听的可能性。

  如果不想让别人看到消息的内容,发送者(sender)就需要对消息进行加密(encrypt)后再发送出去,加密之前的消息称为明文(plaintext),加密之后的消息称为密文(ciphertext)。

  而接收者(receiver)就需要对密文进行解密(decrypt)之后再阅读。

 

  密码学家工具箱中6个重要工具:对称密码、公钥密码、单向散列函数、消息认证码、数字签名以及伪随机数生成器。

 

第一部分:密码

密码算法:

  用于解决复杂问题的步骤,通常称为算法(algorithm)。密码算法(加密算法和解密算法)中需要密钥(key),无论是加密时还是解密时,都需要知道密钥。

  根据密钥的使用方法,可以讲密码分为对称密码和公钥密码两种。

    对称密码:是指在加密和解密时使用同一密钥的方式。公钥密码:加密和解密时使用不同密钥的方式,又称为非对称密码

其他密码技术:

  单向散列函数:如下载文件时,自行计算所下载的文件的散列值是否和软件发布者公布的散列值相同,验证所下载的文件是否是完整的,有没有被篡改过。

  消息认证码:为了确认消息是否来自所期望的通信对象,可以使用消息认证码技术

  数字签名:私钥加签,公钥验签。能够防止伪装、篡改和否认等威胁的技术。

  伪随机数生成器:是一种能够模拟产生随机数列的算法。随机数和密码相关,因为随机数承担着密钥生成的重要职责。例如在web中进行SSL/TLS通信时,会生成一个仅用于当前通信的临时密钥

(会话密钥)这个密钥就是基于伪随机数生成的。

  隐写术:密码是一种能够让消息内容变得无法解读的技术,还有另外一种技术,不是让消息变得无法解读,而是能够隐藏消息本身,这种技术称为隐写术(藏头诗)。

    密码隐藏的是内容,隐写术隐藏的是消息本身。通过将密码与隐写术相结合,就可以同时产生两者各自具备的效果。如将密文运用隐写术作为数字水印隐藏到图片中。

 

历史上的密码:

  恺撒密码,密码算法:将明文中的各个字母按照指定的字母数平移,密钥:平移的字母数量

  简单替换密码,密码算法:按照替换表对字母表进行替换,密钥:替换表

 

对称密码(共享密钥密码)

  ——用相同的密钥进行加密和解密

编码:现代的密码都是建立在计算机的基础之上的,这是因为现代的密码所处理的数据量非常大,而且密码算法也非常复杂,不借助计算机的力量就无法完成加密和解密的操作。

  计算机的操作对象并不是文字,而是由0和1排列而成的比特序列。文件在计算机中都是用比特序列来表示的。执行加密操作的程序,就是将表示明文的比特序列转换为表示密文的比特序列。

  将现实世界中的东西映射为比特序列的操作称为编码(encoding),如ASCII码。

XOR:exclusive or,中文为异或。异或运算,两个比特位相同,结果为0,不同,结果为1。两个相同的数进行异或运算结果一定为0

那么A XOR B 再XOR B=A。这一步和加密、解密的步骤非常相似:

  将明文A用密钥B进行加密,得到密文A XOR B

  将密文A XOR B用密钥B进行解密,得到明文A

所以,只要选择一个合适的B,仅仅使用XOR就可以实现一个高强度的密码。

对于密码技术而言,“是否可以预测”是非常重要的一点。能够产生不可预测的比特序列,对于密码技术的贡献是巨大的。这种不可预测的比特序列就称为随机数。

 

一次性密码本——绝对不会被破译的密码

  一次性密码本是一种非常简单的密码,它的原理是“将明文与一串随机的比特序列进行XOR运算”。为什么说无法破译呢?因为即使暴力破解解密得到了明文,也无法判断它是否是正确的明文。

    如将一个字符串通过ASCII进行编码并产生一串比特序列,然后再产生一串和明文相同位数的比特序列(密钥),然后将这两个比特序列做异或运算,得到一串新的比特序列(一次性

    密码本的密文)。那么在对密文进行尝试破解的过程中,会得到各种可能的字符串,根本无法判断哪一个才是正确的明文。

  但是由于一次性密码本的密钥的长度必须和明文相同,并且密钥需要传送用于解密,存在密钥过大且传输被截取的风险大,所以一次性密码本没有被广泛使用。

 

 DES

  DES(Data Encryption Standard)是一种对称密码。然而随着计算机的进步,现在DES已经能够被暴力破解,所以我们现在不应该再使用DES了。

  加密和解密:

    DES是一种将64bit的明文加密成64bit的密文的对称密码算法,它的密钥长度为56比特,每隔7比特会设置一个用于错误检查的比特。

    DES是以64比特的明文(比特序列)为一个单位来进行加密的,这个64比特的单位称为分组。一般来说,以分组为单位进行处理的密码算法称为分组密码,DES是分组密码的一种。

    DES每次只能加密64比特的数据,如果要加密的明文比较 长,就需要对DES加密进行迭代。

  DES的结构:

    DES的基本结构称为Feistel网络, 在Feistel网络中,加密的各个步骤称为轮(round),整个加密的过程就是进行若干次的循环。每轮加密将64bit的明文等分为左右各32bit进行处理,

  左侧32bit使用轮函数根据右侧和一个子密钥生成的进行加密的比特序列与左侧进行XOR运算,得到加密后的左侧,右侧不加密,然后左右侧重新拼接输出得到一轮64bit的密文。

  一轮的加密具体步骤如下:

    1、将输入的数据等分为左右两部分

    2、将输入的右侧直接发送到输出的右侧

    3、将输入的右侧发送到轮函数

    4、轮函数根据右侧数据和子密钥,计算出一串看上去是随机的比特序列

    5、将上一步得到的比特序列与左侧数据进行XOR运算,并将结果作为加密后的左侧。

  但是,这样下来右侧根本没有被加密,因此我们需要用不同的子密钥对一轮的处理重复若干次,并在两轮处理之间将左侧和右侧的数据对调。

  Feistel的解密只要按照相反的方向使用子密钥就可以完成了(两个相同的数进行XOR的结果一定为0)。

 

 差分分析和线性分析

  TODO

 

 三重DES

  DES已经可以在现实的时间内被暴力破解,因此我们需要一种用来替代DES的分组密码,三重DES就是出于这个目的被开发的。

  三重DES(triple-DES)是为了增加DES的强度,将DES重复三次所得到一种密码算法,也成为TDEA(Triple Data Encryption Algorithm),通常缩写为3DES。

  三重DES的密钥分为密钥1,密钥2,密钥3;由于DES的密钥长度为56bit,所以3DES的密钥长度为56*3=168bit。

  三重DES的加密机制为:加密-->解密-->加密。之所以不是3次加密是为了兼容普通的DES,当3DES的3个密钥相同时,3DES也就等同于普通的DES了。

  如果3DES的密钥1和密钥3使用相同的密钥,而密钥2使用不同的密钥,这种3DES就称为DES-EDE2。(EDE表示Encryption->Decryption->Encryption这个流程 )。

  密钥1、密钥2、密钥3全部使用不同的比特序列的三重DES称为DES-EDE3。

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

  由于3DES的处理速度不高,除了特别重视 向下兼容性的情况以外,很少被用于新的用途。

 

 AES

  AES(Advanced Encryption Standard),高级加密标准,是取代其前任标准DES而成为新标准的一种对称密码算法。在AES算法选拔中,Rijndael算法力压群雄,被NIST选定为AES标准。

  Rijndael的分组长度和密钥长度可以分别以32bit为单位在128bit和256bit的范围内进行选择。不过在AES的规格中,分组长度固定为128bit,密钥长度只有128、192和256bit三种。

  Rijndael的加密和解密:

    和DES一样,Rijndael算法也是由多个轮构成的,其中每一轮分为SubBytes、ShiftRows、MixColumns和AddRoundKey共4个步骤,一般需要重复10-14轮运算。使用的是SPN结构。

    Rijndael的输入分组为128bit,也就是16字节。首先,需要逐个字节地对16字节的输入数据进行SubBytes处理。

      然后,进行ShiftRows处理。这一步是以4字节为单位的行(row)按照一定的规则向左平移,且每一行平移的字节数是不同的。

      之后,进行MixColumn处理,这一步是对一个4字节的值进行比特运算,将其变成另外一个4字节值

      最后,需要将MixColumn的输出与轮密码进行XOR运算,即进行AddRoundKey处理。

 DES、3DES和AES三种对称密码算法中,推荐使用AES。

 

 分组密码的模式

  DES和AES都属于分组密码,它们只能加密固定长度的明文。 如果需要加密任意长度的明文,就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。而分组密码的

迭代方法就称为分组密码的“模式”。

  分组密码和流密码:密码算法可以分为分组密码和流密码两种。

    分组密码是每次只能处理特定长度的一块数据和一类密码算法,这里的一块就称为分组,一个分组的比特数就称为分组长度。

      如:DES和3DES的分组长度都是64bit。这些密码算法一次只能加密64bit的明文,并生成64bit的密文。AES的分组长度为128bit,因此AES一次可加密128bit的明文,

      并生成128bit的密文。

    流密码是对数据流进行连续处理的一类密码算法。流密码中一般以1bit、8bit或者32bit等为单位进行加密和解密。一次性密码本属于流密码。

  分组密码处理完一个分组就结束了,因此不需要通过内部状态来记录加密的进度;相对地,流密码是对一串数据流进行连续处理,因此需要保持内部状态。

  明文分组和密文分组:明文分组是指分组密码算法中作为加密对象的明文。明文分组的长度与分组密码的长度相同。密文分组是指使用分组密码将明文分组加密之后所生成的密文。

  主动攻击者Mallory:窃听者Eve只能被动地进行窃听,而主动攻击者则可以主动介入发送者和接收者之间的通信过程,进行阻碍通信或者是篡改密文等活动,这样的攻击者称为Mallory。

  1、ECB模式(Electronic Code Book 电子密码本模式)

    将明文分组直接加密成密文分组的方式就是ECB模式。使用ECB模式加密时,相同的明文分组会被转换成相同的密文分组,也就是说,我们可以将其理解为是一个巨大的

    “明文分组-->密文分组”的对应表,因此ECB模式也称为电子密码本模式。当最后一个明文分组小于分组长度时,需要用一些特定的数据进行填充。

    ECB模式有一个很大的弱点,假如存在主动攻击者,那么他无需破译密码就能够操纵明文。如Mallory改变了密文分组的顺序,那么解密后的明文分组的顺序也就被改变了,就可能

    存在A对B转账的密文解密后变成B对A转账。

    而且Mallory对密文分组进行替换、删除、复制等操作,得到的明文分组也会被替换、删除和复制。这是一个很大的问题。

  2、CBC模式(Cipher Block Chaining 密文分组链接模式)

    将前一个密文分组和明文分组的内容混合起来进行加密。首先将明文分组和前一个密文分组进行XOR运算,然后再进行加密。

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

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

    这样,由于初始化向量不同,即使相同的明文分组加密后的密文分组也不相同。

  3、...

 

公钥密码(非对称加密)——用公钥加密,私钥解密

  密钥配送问题:在使用对称密码加解密时,由于加密和解密的密钥相同,因此,报文接收者想要得到解密得到报文的明文,就需要知道报文发送者加密时的密钥,因此发送者同时也需要将报文

的加密密钥发送给接收者,但密钥传输过程中可能被窃听,这就是密钥配送问题。

  非对称密钥加密和解密密钥不同,且加密的密钥是公开的,因此不存在密钥配送问题。

  非对称加密:在非对称加密中,密钥分为加密密钥和解密密钥两种。发送者用加密密钥对消息进行加密,接收者用解密密钥对密文进行解密。加密密钥是发送者加密时使用的,而解密密钥是接

收者解密使用的。解密密钥从一开始就是由接收者自己保管的,因此只需要将加密密钥发送给发送者就可以解决密钥配送问题了,而根本不需要配送解密密钥。而且,加密密钥一般是公开的,因此

加密密钥又称为公钥,即使不用担心被窃听。而解密密钥是绝对不可以公开的,只能由自己来使用,因此称为私钥。

  公钥和私钥是一一对应的,一对公钥和私钥统称为密钥对(key pair)。由公钥进行加密的密文,必须使用与该公钥配对的私钥才能解密。密钥对中的两个密钥之间具有非常密切的关系-数学上

的关系,因此公钥和私钥是不能分别单独生成的。公钥密码的使用者需要生成一个包括公钥和私钥的密钥对,其中公钥会被发送给别人,而私钥则仅供自己使用。

  非对称加密无法解决的问题:非对称加密解决了密钥配送问题,但是并不意味着它能够解决所有的问题,因为我们需要判断所得到的公钥是否正确合法,这个问题称为公钥认证问题。另外还有

一个问题是它的处理速度和对称加密算法比只有其的几百分之一。

  

  时钟运算

  为了更好的理解非对称加密的代表RSA算法,需要先了解一下时钟运算。只有一根指针的时钟,12点钟的数字为0。

  什么是质数:在大于1的自然数中,除了1和它本身以外不再有其他因数(不能被其他自然数整除)的自然数。质数p的约数只有两个:1和p

  加法运算:将指针向右旋转看作加法运算,那么时钟右转一定刻度后的结果就是总刻度除12的余数。即mod(模)运算。

  减法运算:将指针向左旋转看作减法运算,向左旋转X刻度数后的结果相当于向右旋转(12-X)刻度数,即可将减法转换为加法运算。

  乘法运算:即连续向右旋转一定次数的刻度。在算术中,乘法相当于加法的反复,那么向右反复旋转X次Y刻度后的结果为(X*Y)mod 12

  除法运算:除法是乘法的逆运算,如果已知(X*Y)mod 12=1,且X已知,那么Y的值怎么求呢?首先,两个数相乘的结果必须是奇数,由此得知只有1,5,7,11这几个数乘以某个数的结果才

符合,且只有这几个数和12的最大公约数为1。和12的最大公约数为1的数(5,7,11),在数学上称为“和12互质的数”,也可以理解为相对于12的质数。

  乘方:如求X^Y mod 12的结果,只要先求出X^Y的结果再进行mod运算就可以了。另外,如果在计算的中间步骤求mod,其结果也是一样的。如7^4 mod 12的结果等于

(7^2 mod 12)*(7^2 mod 12) mod 12 。这种在计算过程中求mod来计算乘方的方法,也是RSA的加密和解密算法中所使用的方法。

  对数:乘方的逆运算称为对数。时钟运算中的对数称为离散对数。目前求离散对数的方法只能依次尝试。

 

  RSA

  RSA是一种非对称加密算法,它的名字由三位开发者的名字首字母组成。公钥加密的密钥分为加密密钥和解密密钥,是怎么做到的呢?

 RAS加密

  RSA的加密过程可以用下列公式表达:密文=明文^E mod N

  E是加密(Encryption)的首字母,N是数字(Number)的首字母。

  也就是说RSA的密文是对代表明文的数字的E次方求mod N的结果,那么E和N的组合就是公钥。E和N两个数组成了一个公钥,一般表达为公钥是(E,N)。

 RSA解密

  明文=密文^D mod N

  D是解密(Decryption)的首字母,N是数字(Number)的首字母。

  也就是说对表示密文的数字的D次方求mod N就可以得到明文。D和N组合起来就是RSA的解密密钥,即D和N的组合就是私钥。

密钥对公钥 数E和N
密钥对私钥 数D和N
RSA加密 密文=明文^E mod N(明文的E次方除以N的余数)
RSA解密 明文=密文^D mod N(密文的D次方除以N的余数)

 生成密钥对

  由于E和N是公钥,D和N是私钥,因此求E,D,N这三个数就是生成密钥对。 步骤:

(1)求N,用伪随机数生成器求p和q,p和q都是质数。N=p*q (2)求L,L=lcm(p-1,q-1);L是p-1和q-1的最小公倍数
(3)求E,1<E<L,gcd(E,L)=1;E和L的最大公约数为1,即E和L互质 (4)求D,1<D<L,E*D mod L=1

 

 对RSA的攻击

  假设破译者知道的信息有密文(通过窃取获取)、数E和N(公钥公开的信息)

  那么破译者不知道的信息有明文、数D(私钥)、生成密钥对时的p、q和L

  1、通过密文来求得明文

    密文=明文^E mod N,如果仅仅密文=明文^E的话,难度不大,仅仅是一个求对数的问题;但是加上mod N之后,求明文就变成了求离散对数的问题,这是非常困难的,目前

  还没有发现求离散对数的高效算法。

  2、暴力破解来找出D

    只要知道数D,就能够对密文进行解密。暴力破解的难度会随着D的长度增加而变大,当D足够长时,就不可能在现实的时间内通过暴力破解找出数D。现在,RSA中,p和q

  使用的长度都在1024bit以上,N的长度为2048以上。由于E和D的长度可以和N差不多,因此要找出D,就需要进行2048bit以上的暴力破解,极其困难。

  3、通过E和N求出D

    破译者知道了E和N,由于E*D mod L=1,L=lcm(p-1,q-1),因此需要知道L,也就是p和q。所以p和q不能被密码破译者知道,知道了p和q相当于知道了私钥。虽然不知道p

  和q,但是知道N,由于N=p*q,要想通过N来求得p和q,只能对N进行质因数分解来完成。可以说,一旦发现了对大整数进行质因数分解的高效算法,RSA就能够破译。

   目前,还没有发现对大整数进行质因数分解的高效算法,因此求质因数分解还是极其困难的。

  中间人攻击

    指交换公钥的时候,一方拿到的公钥是被攻击者替换过的,攻击者获取发送者使用假公钥加密的密文后,自己即可破解。

  

  混合密码——用对称密码提高速度,用非对称密码保护会话密钥

  通过使用对称密码,我们能够在通信中确保机密性。然而要在实际中运用对称密码,就必须解决密钥配送问题。

  使用公钥密码可以避免解密密钥的配送,从而也就解决了对称密码的密钥配送问题。但是公钥密码有两个很大的问题:

    1、公钥密码的处理速度远低于对称密码

    2、公钥密码难以抵御中间人攻击

    混合密码系统可以解决问题1,而解决问题2需要对公钥进行认证。

  混合密码系统(hybird eryptosystem)是将对称密码和公钥密码的优势相结合的方法。一般情况下,将两种不同的方式相结合的做法就称为混合(hybrid)。混合密码系统中会先用快速的对称密码

来对消息进行加密,这样消息就被转换为了密文,从而保证了消息的机密性。然后只要保证对称密码的密钥的机密性就可以了。然后用公钥密码对加密消息时使用的对称密码的密钥进行加密,由于对称

密码的密钥一般比消息本身短,因此公钥密码速度慢的问题就可以忽略了。

 

    对称密码与公钥密码对比

  对称密码 公钥密码
发送者 用共享密钥加密 用公钥加密
接收者 用共享密钥解密 用私钥解密
密钥配送问题 存在 不存在
机密性 ok   ok
posted @ 2019-08-21 17:13  杨岂  阅读(648)  评论(0编辑  收藏  举报