aes 加密算法

这篇文章首先登在法国的一本linux杂志的一期关于安全的特刊上。编辑,作者以及翻译人员好心的允许LinuxFocus杂志刊登这个特刊里的任意一篇文章。所以只要这些文章被翻译好了,LinuxFocus杂志就会尽快地呈现给读者。谢谢所有参与这项工作的人。如果所有文章都是来自这个特刊的话,都会使用这个摘要。




 

为什么要进行加密?--2500年的历史

密码学的起源可能要追溯到人类刚刚出现,并且尝试去学习如何通信的时候。他们不得不去寻找方法确保他们的通信的机密。但是最先有意识的使用一些技术的方法来加密信息的可能是公元六年前的古希腊人。他们使用的是一根叫scytale的棍子。送信人先绕棍子卷一张纸条,然后把要写的信息打纵写在上面,接着打开纸送给收信人。如果不知道棍子的宽度(这里作为密匙)是不可能解密里面的内容的。后来,罗马的军队用凯撒密码(三个字母表轮换)进行通信。

在随后的19个世纪里面,主要是发明一些更加高明的加密技术,这些技术的安全性通常依赖于用户赋予它们多大的信任程度。在19世纪Kerchoffs写下了现代密码学的原理。其中一个的原理提到:加密体系的安全性并不依赖于加密的方法本身,而是依赖于所使用的密匙。.

那么,从这个角度来看,加密体系应该能够满足那些需求的。可是,当时的加密体系仍然缺少数学的背景,因而也缺少测量或评价这些体系抗攻击的能力。要是有人能最终达到密码学的终极目标,即找到百分百无条件安全的体系那该有多好呀!在1948年和1949年,香农(Claude Shannon)在他的两篇论文里,把科学背景加入了密码学。这两篇论文是《通信的数学原理》以及主要的《秘密体系的通信原理》。那些文章把许多的希望和偏见都扫开了。同时香农(Claude Shannon)还证明了Vernam密码(也称为One Time Pad)是当时唯一无条件安全的体系。不幸的是,那个体系在使用上是不可行的...。这就是为什么现在评价体系的安全性相反是基于理论上计算得到的安全性的理由。如果还没有找到一种比完全搜索可能的密匙值这种方法更好的攻击方法的话,你可以说这种密匙加密方法是安全的。.

 

AES(高级加密标准Advanced Encryption Standard)

200010月,NIST(美国国家标准和技术协会)宣布通过从15种侯选算法中选出的一项新的密匙加密标准。新的标准将会代替密匙长度变的太短的旧的DES算法。Rijndael被选中成为将来的AESRijndael这个名字是从它的两个发明者RijmenDaemen的名字得来的。

这个加密体系据说是一种分组加密方法,因为信息的内容是以128位长度的分组为加密单元的。加密密匙长度有128192256位多种选择。正象你所知的那样,DES加密的分组长度是64比特,而密匙长度只有64比特。三重DES加密的分组长度通常是64比特,而密匙长度上112比特。

AES

 

表一: AES 迭代


图一描述了AES的操作模式。首先密匙K0和待加密信息按位相与。然后所有要加密的分组都用一个函数F进行迭代计算,计算用的子密匙是由一个密匙扩展函数产生的,初始的密匙是主密匙。

对于AES 函数F要迭代10次。

  • 2描述的是加密过程中函数F是如何被迭代的。一个128位的分组转换成16个字节,作为下面处理的输入。首先,每一个字节分别经过替换函数S的处理,然后,用第二个置换函数P16个字节进行处理。然后这个结果就和匙扩展函数产生的子匙进行位与。
  • Ki是用匙扩展函数从第K(i-1)轮的子匙和第K0的密匙得到的。图三描述了匙扩展函数。16个字节的被分成4组,每组4个字节,来进行处理。最后的一组的4个字节由替换函数S(这个S和用F函数进行迭代处理时的S是一样的)来进行替换处理。最初的4个字节的结果和α系数相加,这个系数是与轮数相关的,它是预先定义的。最后,为了得到Ki,把得到的4个字节的结果和K(i-1)匙的最初4个字节按位相加,然后得到的结果又和K(i-1)匙的下面的4个字节按位相加,如此类推。

F function

 

2: 函数 F


好了,现在我们简单地看看替换函数是怎么得到的,然后看看ai常数有什么作用。为了简单的理由,一个字节应该是256个元素集(称为有限域)的一个元素,对于这些元素只包含一些简单的操作(例如加法,乘法,反转)。事实上,前面提到的替换函数S在那个有限域里的反转。置换函数S被定义为一个很简单的操作,以便能简单的实现。ai系数是和指数I(有限域的元素)成正比的。这些考虑,使得AES实现起来非常有效。

因为AES仅仅在基于简单的位操作运算,这有两个主要的优点:

  • 即使是纯粹的软件实现,AES也是很快的。例如,用C++在奔腾200的电脑上实现的AES的加密速度可达到70M/;
  • AES并不依赖于S-Box的选择(根据NSA, DES里的S-Boxes可能包含后门),对分析算法抗击差分密码分析及线性密码分析具有能力。

Key expansion routine

 

3: 匙扩展例程

 

公匙加密

1976年,Diffie Hellman发表了一篇叫《密码学新动向》的文章,这篇文章给密码学社区的研究者带来了很大的轰动。这篇文章介绍了公匙加密的概念。实际上,作为当时所知道的唯一的一种算法-对称密匙算法-已经不能满足由于网络等的通信手段而引起的通信量急增的需要

基本上说来,他们的高明想法的核心就是单向函数的机关。对于那个函数来说,一个方向上的操作是容易的,但是如果不知道秘密的机关,即使所有人都知道函数本身,从反方向计算是不现实的。在这里,公匙的扮演的角色和函数相同,仅被有限的一部分人知道的机关就是私匙。这样,爱丽斯和鲍勃(以及其他人)的世界就诞生了。爱丽斯和鲍勃是两个希望进行具有完整性要求的通信的人,他们需要防止有人监听和篡改通信。.

不用说,接收信息的人要使用私匙,逆向使用函数,来解密信息。

公匙体系最好(当然也是最简单的)例子在两年后,也就是1978年出现了。它是由Rivest, Shamir Adleman发明的,所以也被称为RSARSA算法建立在对整数的分解的数学难题上的。私匙是由三个数(p,q,d)组成,其中pq是两个素数(具有大致相同的大小),而d和(p-1*q-1)互质。公匙由两个数(ne)组成,其中n=pq,而e(p-1)(q-1)d为模的倒数, 例如:

ed = 1 mod(p-1)(q-1).




假如爱丽斯想鲍勃的公匙(n,e)加密,传送一些文本。她首先会把明文转换成小于n的整数m,那么她就会这样处理: 

c = me mod n,



然后把结果c送给鲍勃。在鲍勃的这边,他就会用他的私匙(p,q,d)进行这样的处理

cd mod n = med mod n = m.



对于RSA,单向的机关函数是能够从一个小于n的整数x得到xe mod n.

RSA产生以来,又发明了许多其它的公匙体系。现在来说,除了RSA外,其中一个还可选择的最有名的体系是基于离散算法的。  

密码学在现代的应用

实际上,公匙加密由于更容易的使用,以及能解决了目前为止许多安全的问题,所以更为吸引人。说的更准确点的说,它解决了一些认证的问题:

  • 身份认证: Alice在使用今天的匿名通信的时候,她想肯定她正在通信的对象并不是假扮Bob的。为了达到这样的目的,她使用了一个认证协议。现在有许多认证协议的存在,通常都是基于RSA或离散对数原理的。
  • 文档认证::一个授权机关通过一个数字签名来认证一个文档。签名通常附加在消息后面,这些签名通常是把文档和授权机关的一些信息作为输入而得到的一些字节位,这些得到的签名通常是通过MD5SHA等的哈希算法hash得到的。还有就是, 任何访问该文档的人都应该能够去检查签名是否真的由授权机关签发的。为了实现这个目的,使用了所谓的签名模板(signature schemas)。其中一个最有名的模板是ElGamal模板,又是基于离散算法问题的。

此外,与密匙加密相比,公匙加密还提供基于密码的加密体系,以确保通信的保密性。

此外,与密匙加密相比,公匙加密还提供基于密码的加密体系,以确保通信的保密性。我们想象一下爱丽斯想和鲍勃进行秘密的通信。爱丽斯从一个公共的目录里取得鲍勃的公匙,然后他用这个公匙对他的明文进行加密。当鲍勃接收到了密文,他就用他的私匙对密文进行解密,得到信息的内容。这些匙各起着很不同的作用,这就是为什么这些体系被称为不对称加密体系的理由。与此不同,密匙加密体系的加密和解密用的都是相同的匙,所以就被称为对称加密体系。


公匙加密与密匙加密相比,还有另外一个更为突出的优点。实际上,如果有N个用户需要通过密匙加密体系进行通信的话,每一个人和组里的任何一个人通信都需要不同的密匙,就是说,需要管理NN-1)条密匙。如果N是上千的话,就会有上百万的密匙需要管理...。更糟糕的是,即使是增加一个用户也并非是一个简单的任务,因为为了使这个用户和组里的所有成员通信,需要产生N个新匙,然后那些新匙都要送遍整个组。与此相反,在非对称加密体系里面,成员的N个公匙是存放在一个公共的目录里面,新增一个新用户要做的只是简单的把他的公匙添加到目录里面就是了。  

使用公匙还是密匙--找出合适的方案

前面的章节已经说明了公匙加密可以解决很多密匙加密不能解决的问题。有很人和疑惑:那AES还有什么作用呢?实际上,对于这种选择有两个主要的理由:

  • 首先是实用上的理由。一般来说公匙加密体系是很慢的。例如RSA的软件实现比AES慢一千倍,还有RSA并不为硬件实现而设计的。在传递信息这么苛刻的今天,我们是不能接受被一个加密算法而限制的。
  • 其次,公匙加密体系的内部结构导致了其他的安全问题。

    例如,对于一个特定的安全水平,公匙加密体系要求匙的长度比密匙加密体系的匙的长度大的多。实际上,对于匙的长度的重要性和观念,仅仅是对于密匙加密体系才有意义。事实上,那些体系依赖于这样的事实:只有野蛮的攻击才可能攻破他们,例如,穷举所有可能的匙值,如果匙的长度是128比特的话,那么2128个匙值需要被穷举。

    但是对于公匙加密体系,仅仅在考虑相同的体系的时候,匙的大小才是一个有意义的参数。例如,匙的长度是512比特的RSA的安全性比匙的长度是128比特的AES差。正确地评估一个公匙加密体系的唯一办法是估计一些众所周知的攻击方法的复杂性,这样一来的话,事情就完全不同了:你永远不知道是否有新的办法破坏体系的安全性。最近,一组研究人员成功的把一个512位的整数分解因子。所以对于一个合理的安全水平,通常建议用1024位的数字。

所以,对于纯粹的加密来说,当能使用密匙加密算法的时候,优先使用密匙加密算法。Zimmermann已经研究了一个有意义的混合的方法,这个方法在PGP里实现。大致说来,当爱丽斯 和鲍勃 想进行具有完整性特征的通信的时候,使用一个密匙加密算法(PGP用的是IDEA):

  • 首先爱丽斯 和鲍勃使用匙交换协议来协商一个密匙。匙交换协议用的是公匙加密。其中最著名的一个协议是基于Diffie-Hellman的算法的
  • 然后他们用IDEA算法进行通信。

当他们完成通信以后,协商到的会话匙就会被丢弃。那样的一个系统即使用了密匙加密体系也使用了公匙加密体系。通常,大家认为这样一个体系里,比较不安全的部分是匙交换协议。  

 

 

 

 

 

密码学历和密码系统种类

密码学(Cryptology)一字源自希腊文"krypto's""logos"两字,直译即为"隐藏""讯息"之意。
密码学的起源可能要追溯到人类刚刚出现,并且尝试去学习如何通信的时候。他们不得不去寻找方法确保他们的通信的机密。但是最先有意识的使用一些技术的方法来加密信息的可能是公元六年前的古希腊人。他们使用的是一根叫scytale的棍子。送信人先绕棍子卷一张纸条,然后把要写的信息打纵写在上面,接着打开纸送给收信人。如果不知道棍子的宽度(这里作为密匙)是不可能解密里面的内容的。
后来,罗马的军队用凯撒密码(三个字母表轮换)进行通信。恺撒密码是公元前50年古罗马恺撒用过的密码,加密方法是把a变成Db变成Ec换成F,依次类推,z换成C。这样明文和密文的字母就建立一一对应的关系。
在随后的19个世纪里面,主要是发明一些更加高明的加密技术,这些技术的安全性通常依赖于用户赋予它们多大的信任程度。在19世纪Kerchoffs写下了现代密码学的原理。其中一个的原理提到:加密体系的安全性并不依赖于加密的方法本身,而是依赖于所使用的密匙。.
在二次大战中,密码更是扮演一个举足轻重的角色,许多人认为同盟国之所以能打赢这场战争完全归功于二次大战时所发明的破译密文数字式计算器破解德日密码。破译密文数字式计算器又名图灵机,是数学家图灵所发明的。公元1949年,Shannon提出第一篇讨论密码系统通讯理论之论文,近代密码学可说是滥觞于斯。直至公元1975年,DiffieHellman提出公开金匙密码系统之观念,近代密码学之研究方向,正式脱离秘密金匙密码系统之窠臼,蓬勃发展,至今已近二十年。发展至今,已有二大类的密码系统。第一类为对称金钥(Symmetric Key),第二类为非对称金钥(Public Key)

密码法的基本原理
可以分成两种:移位法(transposition)和替代法(substitution)。

移位法就是将讯息里面的文字,根据一定的规则改变顺序,这种方法,在文字数量很大的时候,便可以显示出他的优势,例如"Hello World"才不过10个字母便可以有11708340914350080000种排列的方式。另外一种方法,就是替代法,还可以分成两种,一种是单字替代,一种是字母替代,两种的原理是一样的,就是利用文字相对顺序的对应,来改变原来的文章,以英文为例,我们可以把英文字母往后移动三个位置,即: 

a b c d e f g h i j k l m n o p q r s t u v w x y z 
D E F G H I J K L M N O P Q R S T U V W X Y Z A B C 

泛例:  Hello World How are you 
khoor zruog krz duh brx 

这句话就变的难以辨认了,而且如果发信人收信人有协议好的话,那还可以把文字之间的空白删除,反正翻译回来的时候,可以靠文句的意思,来推测断句断字的时机。 而单字替代,则是以每个单字,都去换成另外一个相对应的单字,这样来改写原文,变成一个无法辨认其意义的加密文件。 
移位法当然不只限于一种,光是英文字母不考虑大小写,就可以有25种互异的方法,每种密码法,都可视为一种加密法,我们称为算法(algorithm),和一把钥匙(KEY)的组合结果。钥匙是用来指定加密程序的演算细节。以移位法为例,算法是只以密码字母集里的字母,取代明文字母集里面的字母,钥匙便是收发信人定义的密码字母集。 

密码学术语

明文用MMessage,消息)或PPlaintext,明文)表示,它可能是比特流、文本文件、位图、数字化的语音流或者数字化的视频图像等。
密文用CCipher)表示,也是二进制数据,有时和M一样大,有时稍大。通过压缩和加密的结合,C有可能比P小些。
加密函数E作用于M得到密文C,用数学公式表示为:EM=C。解密函数D作用于C产生M,用数据公式表示为:DC=M。先加密后再解密消息,原始的明文将恢复出来,DEM))=M必须成立。

对称金钥(Symmetric Key)。经典对称加密——DES

举一个简单的对称的钥匙密码学的范例假想从朋友处收到一个通知你和你的朋友同意来加解密你们的讯息,你们将使用下列算法每个字母将会上移三个字母例如 A=C, B=D,  Y  Z 转一圈回到 A B,这个方程式 ("每个字母上移三个字母") 就是送信者使用来加密讯息的钥匙而收信者使用相同的钥匙来解密 . 
任何人如果没有钥匙就不能够读此讯息因为相同的钥匙视同实用来加密及解密讯息这个方法是一个 对称钥匙的算法这类的密码学及是我们所知的秘密钥匙密码学,因为此钥匙 必须被秘密保存于送信者和收信者,以保护资料的完整性

DES(Data Encryption Standard)
算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。
DES
算法的入口参数有三个:KeyDataMode。其中Key8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;ModeDES的工作方式有两种:加密或解密。
DES
算法是这样工作的:如Mode为加密,则用Key去把数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。

DES
算法实现加密需要三个步骤:
第一步:变换明文。对给定的64位比特的明文x,首先通过一个置换IP表来重新排列x,从而构造出64位比特的x0x0=IP(x)=L0R0,其中L0表示x0的前32比特,R0表示x0的后32位。
第二步:按照规则迭代。规则为
Li = Ri-1
Ri = Li
f(Ri-1,Ki)
第三步:经过i次迭代运算后。得到LiRi,将此作为输入,进行逆置换,即得到密文输出。

DES
算法具有比较高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的,当然,随着科学技术的发展,当出现超高速计算机后,我们可考虑把DES密钥的长度再增长一些,以此来达到更高的保密程度。

非对称金钥(Public Key)。经典非对称加密——RSA

非对称性或公开的钥匙 密码学不同于对称性的 密码学在于其加密钥匙只适用于单一使用者
钥匙被分为两个部分
一把私有的钥匙仅有使用者才拥有
一把公开的钥匙可公开发行配送,只要有要求即取得
每支钥匙产生一个被使用来改变内文的功能私有的钥匙 产生一个 私有改变内文的功能,而公开的钥匙 产生一个 公开改变内文的功能
这些功能是反向相关的例如., 如果一个功能是用来加密讯息,另外一个功能则被用来解密讯息.不论此改变内文功能的次序为何皆不重要
公开的钥匙系统的优势是两个使用者能够安全的沟通而不需交换秘密钥匙例如假设一个送信者需要传送一个信息给一个收信者而信息的秘密性是必要的送信者以收信者的公开的钥匙来加密,而仅有收信者的私有的钥匙能够对此信息解密
公开的钥匙密码学是非常适合于提供认证,完整和不能否认的服务所有的这些服务及是我们所知的数字签名。

1965
年,美国史丹福大学电机工程系--默克尔、迪菲、赫尔曼等三人研究密码学可惜并未有所发现。另外在英国通讯电子保安组(CESG)秘密机构的切尔纳姆发现了还原密码式,但是由于属于秘密机构,所以不能公开。1976年,DiffieHellman在文章“密码学新方向(New Direction in Cryptography)”中首次提出了公开密钥密码体制的思想,1977年,RivestShamirAdleman三个人实现了公开密钥密码体制,现在称为RSA公开密钥体制,它是第一个既能用于数据加密也能用于数字签名的算法。这种算法易于理解和操作,算法的名字以发明者的名字命名:Ron Rivest Adi ShamirLeonard Adleman。他们成立RSA SecurityCompany 现时值25亿美元,在传送信用卡时起了很大作用。RSA已安装了5亿套产品在IE , Netscape下的小锁就是RSA的产品。数学挂锁第一个发现不是美国,但是第一个公开。数学挂锁上锁易,还原难,所以受广泛使用,亦即是信息编码保密。 

数学挂锁泛例
数学挂锁用单向式:N=pxq <--例子 N(合成数)=两个质数的乘 
11x17=187=N 
还原单向式公式:C=Me(mod N) *eM的次数。
 M*13*(mod 187)=C *13
M的次数
c=165 
x=88 (password kiss) 
88*13*(mod 187)=165 *13
88的次数
modN=M 
C*1/e*mod(p-1)(q-1)=88 
C=165 
p=11 
q=17 
answer:mod 187=88 

RSA
的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解 RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前, RSA 的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定 
虽然RSA的安全性一直未能得到理论上的证明。它经历了各种攻击,至今未被完全攻破。
整个密码学发展的程序,辨识找寻新的算法,和保护钥匙避免被解密者发现的程序,钥匙在密码学中非常重要,因为即使算法相同或太简单,没有加密的钥匙的话,我们仍然很难去破解加密的文件。

原文地址:https://www.cnblogs.com/roland1982/p/3494144.html