得到明文“ Common sense is not so common.”
解密的步骤 如下:
1. 将 消息 的 长度 除以 密钥 并向 上 取整 计算 需要 的 列数。
2. 画出 一定 数量 的 格子。 列数 已在 第一步 计算, 行数 和 密钥 一样。
3. 将 格子 的 个数( 行数 乘以 列数) 减去 密 文 消息 的 长度 计算 需要 涂 灰 格子 的 个数。
4. 涂 灰 最 右边 那一 列 下面 的 格子, 个数 已在 第三步 计算。
5. 填入 密 文 的 字符, 从 最上 面 那一 行 开始, 从左 向右 填入。 跳过 任何 灰色 格子。
6. 要 获取 明文, 从 最 左边 那一 列 开始, 从上往下 读取, 然后 移到 下一 列 顶部。
Al Sweigart 斯维加特. Python密码学编程(异步图书) (p. 95). 人民邮电出版社. Kindle 版本.
破解方法:通常我们在不知道密钥key的情况下,采用爆破密钥key,然后通过英文单词检测的方式来破解密文。
6-数乘加密法凯撒加密法,都是采用将密钥加到字符串的索引去,而数乘加密法是采用乘法将密钥乘索引。
在凯撒加密法里 ,加密和解密符号涉及把它们转换成数字 ,加上或减去密钥 ,然后把新的数字转换回符号 。
如果我们在加密时不是加上密钥而是乘以呢 ?这会导致 “回调 ”问题 ,不过取模运算符可以解决这个问题 。比如说 ,我们使用只包含大写字母的符号集和密钥 7 。
下面列出字母及其数字 :
要找出符号 F使用密钥 7会加密成什么 ,将它的数字 ( 5 )乘以 7 ,再对 2 6取模 (处理 2 6符号集的 “回调 ” ) 。然后使用那个数字的符号 。 ( 5 × 7 )取模 2 6 = 9 , 9是符号 J的数字 。因此 , F在乘数加密法里使用密钥 7会加密成 J 。同理得到:
问题1:
乘数加密法有个缺点,就是A没有被加密,密文也是A,因为A的索引是0,0乘上任何Key都是0,所以,我们在乘数keyA后,再进行凯撒加密法进行加法keyB加密。于是得到仿射加密法。
问题2:不是任意的数都可以作为乘数加密的密钥Key,例如8,会导致密文多对一。密钥他和字符集大小,要互质。
两个数的最大公约数为1,则两个数互质
求两个数的最大公约数算法:欧几里得算法
def gcd (a , b ) :
while a ! = 0 :
a , b = b % a , a
return b