首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >(二)传统密码——Caesar密码

(二)传统密码——Caesar密码

作者头像
渔父歌
发布2019-03-19 16:36:14
发布2019-03-19 16:36:14
2.6K00
代码可运行
举报
文章被收录于专栏:数据结构笔记数据结构笔记
运行总次数:0
代码可运行

Caesar密码是已知最早的代换密码,又Julius Caesar发明。

Caesar密码非常简单,就是对字母表中的每个字母,用它之后的第三个字母来代换。例如:

明文:meet me after the toga party 密文:PHHW PH DIWHU WKH WRJD SDUWB (在密码学中一般使用小写字母表示明文,大写字母表示密文)

如果我们让每个字母对应一个数字,比如字母 a-z分别与数字 0-25对应。那么加密算法可以用如下表达式表达。对每个明文字母p,代换成秘文字母C:

还可以更改移位的数量k,这样就得到了一般的Caesar算法, k的取值从1到25:

解密算法为:

用python实现的Caesar算法如下:

代码语言:javascript
代码运行次数:0
运行
复制
def Caeser_encode(text, offset=3):
    result = []
    for t in text.lower().encode():
        result.append((t + offset - 97) % 26 + 97)
    return bytes(result).decode()

def Caeser_decode(text, offset=3):
    result = []
    for t in text.lower().encode():
        result.append((t - offset - 97) % 26 + 97)
    return bytes(result).decode()

代码里的97对应字母a的ascii码值。

Caesar算法有三个特征:

  1. 已知加密和解密算法
  2. 密钥空间只有25
  3. 明文所用的语言是已知的,且其意义易于识别

根据Caeser算法的这三个特征攻击者可以使用穷举攻击来获取密钥和明文。用python实现的一种破解方式如下:

代码语言:javascript
代码运行次数:0
运行
复制
def Caeser_attack(text):
    for i in range(26):
        print(Caeser_decode(text, i), i)

对于密文:PHHW 使用破解算法的输出如下: phhw 0 oggv 1 nffu 2 meet 3 ldds 4 kccr 5 jbbq 6 iaap 7 hzzo 8 gyyn 9 fxxm 10 ewwl 11 dvvk 12 cuuj 13 btti 14 assh 15 zrrg 16 yqqf 17 xppe 18 wood 19 vnnc 20 ummb 21 tlla 22 skkz 23 rjjy 24 qiix 25

可以很容易看出,只有当i=3时,解密出的明文才是有意义的,所以可以确定密钥k=3。

这里需要特别注意的是,攻击者能够破解密文并不意味着可以获取信息,如果用来加密的明文本身是不可识别的(比如明文是用其他加密算法加密过的),攻击者就无法通过穷举的方式来获取密钥,因为攻击者无法知道哪一个输出才是对应的明文。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.03.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档