文章目录
前言
对古典密码中的一些技术作了简单介绍,包括它们的加/解密方法,以及对安全性的简单分析
一 Caesar cipher - 凯撒密码
- 加密
对单字母按同一规则替换- 例:后移三位
meet me after the toga party
PHHW PH DIWHU WKH WRJD SDUWB
- 例:后移三位
- 解密
穷举法,一共只有1-25这25种加密方法
二 Monoalphabetic Cipher - 单表替换
- 加密
选取A-Z的一个排列作为秘钥Key,将原文中的A-Z按Key映射到新的字母上- 例
- Key : DKVQFIBJWPESCXHTMYAUOLRGZN
- plaintext: if we wish to replace letters
- ciphertext: WIRFRWAJUHYFTSDVFSFUUFYA
- 例
- 解密
- 穷举需要26!≈ 4 x 10^26次
- 但仍不安全,因为原文中的字母出现的频率与密文中对应字母的出现频率一致, 可以通过词频分析攻击
- 改进思路
- 多个字母共用一个映射表 -> Playfair
- 一个字母使用多个映射表 -> Vigenere
- Vigenere的一对多比较好理解,按照算法就是每个字母会依次使用不同的替换表,使得最后单字母的分布比较均匀
- 但Playfair按照算法实际上是一个双字母的映射,我这里理解为对于一个字母而言,它和它在Key同列或同行的字母有可能映射到同一个字母,效果上相当于多对一
三 Playfair Cipher
- 加密
- I/J视为同一个字母
- 选取无重复字母的一个字符串作为Key,未出现的字母按顺序接在Key后面,构成一个5x5的矩阵
- 例:使用Key = MONARCHY
矩阵 :
MONAR
CHYBD
EFGIK
LPQST
UVWXZ
- 例:使用Key = MONARCHY
- 预处理明文
- 将明文看作由2字母对组成
- 若两字母相同,则在中间插入填充字母X
- 例:balloon -> ba lx lo on
- 这里填充字母我的理解是选取那些不太会出现在两个相同字母中间的字母,因为解密时无法区分两个相同字母中间的X是预处理时生成的还是原本就有的。按我的理解选择,过度解密的概率较小
- 若最后的明文是奇数个字母,在末尾填充字母X
- 加密,对于每个2字母对,按以下规则加密:
- 2个字母在矩阵中同行,替换每个字母为原字母在该行右边的字母,溢出则回卷
- 例:ar -> RM
- 2个字母在矩阵中同列,替换每个字母为原字母在该列下边的字母,溢出则回卷
- 例: mu -> CM
- else :第一个字母替换为与第一个字母同行且与第二个字母同列的字母;第二个字母替换为与第一个字母同列且与第二个字母同行的字母
- 例:hs -> BP; ea -> IM
- 2个字母在矩阵中同行,替换每个字母为原字母在该行右边的字母,溢出则回卷
- 解密
- 模拟退火算法:爬坡算法的改进
- 爬坡算法
- 生成随机秘钥
- 解密得到伪明文
- 对伪明文进行适应度分析,即判断与真正英文文本的相似度
- 修改秘钥,重复此过程,直到适应度在一定次数内不在变化
- 爬坡算法的问题及改进
- 可能陷入极大值
- 解决方案:以一定概率选取那些不增加适应度的秘钥,概率和迭代的轮次呈负相关
- 爬坡算法
- 词频分析
- 前面有提到Playfair算法对单表替换法面临词频问题有改进,那这里为什么还能词频分析呢
- 因为Playfair算法使得单字母的分布更均匀,但双字母词频没有改变,所以可以根据双字母的词频进行词频攻击
- 相较于单字母的词频26个,双字母词频有26x26=676个,需要收集更多的密文信息才可能进行攻击
- 模拟退火算法:爬坡算法的改进
四 Vigenere Cipher
- 最简单的多表替换算法
- 加密
- 选取一个与原文等长的字符串作为Key,若长度不足则重复补足
- 对原文中的每个字母使用Key中对应位置的字母作凯撒加密
- 例:
- Key: deceptivedeceptivedeceptive
- Plaintext: wearediscoveredsaveyourself
- Ciphertext: ZICVTWQNGRZGVTWAVZHCQYGLMGJ
- 解密
- 词频被模糊了但未完全丢失
- 扩展:AutoKey Cipher - 自动秘钥密码
- 类似于Vigenere密码,不同的是秘钥Key是由关键字Keyword+明文构成的
五 One-Time Pad - 一次性密码本
- 随机秘钥
- 绝对安全
六 Transposition Cipher - 置换密码
- 前面提到的几种密码都是替代密码,接下来会介绍几种置换密码
6.1 Rail Fence Cipher - 铁路围栏
- 把明文按对角线写,按行读
- 例:
6.2 Row Transition Ciphers - 行转换
- 限定明文列数
- 重新排列列
- 按列读取成明文
- 例:
七 Product Cipher - 乘积密码
- 单纯的替代或者置换都不安全,于是出现了串联多种加密方法的Product Cipher
- 从古典密码到现代密码的桥梁
总结
- 本文循序渐进地介绍了古典密码中的经典算法,部分介绍较为详细,部分则比较简略
- 笔者理解有限,如有纰漏敬请指正