1. Caesar's Cipher
(1)Encryption Method
把文本中的每个字符循环向后移动3位,即A->D,B->E,.....,Z->C。该方法的key是固定的3(也可以说不存在key),因此,只要了解过Caesar cipher的就能够对该方法加密的文本进行解密。
(2)Decryption Method
把ciphertext中的每个字符循环向前移动3位,即可得到plaintext。
补充:还有一种移动13位的加密方法,称为ROT-13(这仍然被广泛使用在一些在线网络论坛中)。
2. The Shift Cipher
(1)Encryption Method
把文本中的每个字符循环向后移动K(Κ∈{0,25})位,该方法的key是一个变量,相当于是Caesar Cipher的改进方法。
(2)Decryption Method
可以通过brute-froce方法寻找key,因为key的取值范围只有26个,因此可以通过brute-froce方法在线性时间内求出K。
另外一种改进的攻击方法是:定义pi表示Standard English Text中第i个字符出现的频率,可以得到如下公式:
定义qi表示ciphertext中每个字符出现的频率,假设key表示为k,由于第i个字符可以被mapping为第(i+k)个字符,所以qi+k≈pi,因此可以统计计算如下公式求出k:
找到一个j满足Ij≈0.065,则该j即为key。
3. The Mono-Alphabetic Substitution Cipher
(1)Encryption Method
在shift cipher中,map method是从0-25中寻到一个固定的key值进行mapping。而本方法中,key的选取原则是对字母进行一对一的mapping,这样的话key的选取方法就有26!=26*25*...*1种,近似等于288。
(2)Decryption Method
对于该加密方法使用brute-force是不适合的(以当前计算机的算力,brute-force是能够跑出来的),由于Standard English Text中每个字符出现的频率可以统计出来,因此通过分析其ciphertext中每个字符出现的频率进而判断出和plaintext中每个字符的映射关系。(具体实现方法参考4部分)
4. The Poly-alphabetic Shift Cipher(Vigen`ere Cipher)
(1)Encryption Method
选择一个字符串作为key,并将字符串重复若干次直到和plaintext的长度一样。例如假设key为“cafe”,其相对于字符‘A’的偏离量分别为2054,则其plaintext中字符移动的位数也就确定下来了。使用字符串“cafe”对“tellhimaboutme”进行加密,则其key为“cafecafecafeca”,得到的相应ciphertext为“VEQPJIREDOZXOE”。
(2)Decryption Method
若已知key的长度,假设为 t,则key=k1...kt,ciphertext 设为c=c1c2......,把ciphertext对t取模同余分为t部分(即把偏移量相同的字符分在一组,称为stream),对于任意的j∈{1,...,t},定义一个stream如下:
对于每一个stream,都有26种移位的可能性,也就是一个stream相当于一个shift cipher。因此,可以采用attack shift cipher的方法,对每一个stream中出现的字符进行频率统计,和Standard English Text中的频率分布相比较,进而求解出字符的偏移量,该方法的时间复杂度为26*t,比brute-force的时间复杂度26t要小很多。
以上方法的前提是知道key的长度,但若是不知道key的长度呢?又该如何求出key的长度?下面我们介绍一种方法:kasiski's method。其求解key的长度方法如下:从ciphertext中找到重复出现的字符串,计算其间隔,然后取所有间隔的最大公约数,即为key的长度。
另一种求key的长度的方法是:index of coincidence method,定义如下:求在某段密文中随机的无放回的抽取两个字母相同的概率。
其求解方法如下:假设key的长度为t,则ciphertext中第一个stream如下:
设qi表示stream中第i个字符出现的频率,pi表示Standard English Text中第i个字符出现的频率,假设第一个stream中每个字符移动j位,我们希望对于所有的字符:qi+j≈pi,又知字符频率分布平方和如下:
因此对于一个stream,我们可以假设τ=1,2,.....,而后对下式进行求解(是对一个stream求解,通过赋予不同的τ值):
找到一个τ=t,使得Sτ≈0.065。
在一串无规律的字母中,我们随意无放回的抽取两个字母,由于每个字母被抽到的概率都相等,即为1/26,即qi均为1/26,因此抽取两个字母相同的概率为:26*(1/26)^2=0.0385。可得如下计算公式:
如果从一篇文章或者一句话中选取字符,则Sτ≈0.065。这种特性是破译密码的一大关键点,对于正常的单表替换(Mono-alphabetic substitution cipher),其index of coincidence 更接近0.065,而对于多表替换(poly-alphabetic shift cipher),其index of coincidence更接近0.038。