DAY 2- 编码跟加密-凯萨密码

到底念Caesar还是Caesar,我都念Caesar。

编码不等於加密

今天要厘清一个非常重要的事情。非常重要。

我们先来看这个东西,它叫做凯萨密码。
这里的凯萨,就是古罗马的那个凯萨。凯萨发明用来加密的方法,叫做凯萨密码 ( Caesar cipher )。

他的做法是将每一个英文字母都往後推n个,上图表示为 n=2 ( 而凯萨使用的是n=3 )。

小举例:hello world → jgnnq yqtnf

如果我要写一个程序实作凯萨密码,最直观的方法就是把每个字母的对应关系告诉电脑。
问题来了,如果我今天想要改变偏移量(也就是n),比如说我想要让A对应到E,而非原本的C
那我不就要重新再打一份对应表了吗。

於是最好的方法,就是编码 ( encode )

编码是把资料换个表示方法储存。
我们要把原本的英文字母,换成可以用来运算的数字。
於是我让 A→1、B→2、C→3、....、Z→26好方便计算。

经过这样的转换,凯萨密码就可以写成:

https://chart.googleapis.com/chart?cht=tx&chl=E(x)%20%3D%20(x%2Bn)%20mod%2026

https://chart.googleapis.com/chart?cht=tx&chl=D(x)%20%3D%20(x-n)%20mod26

其中E(x)是加密函数、D(x)是解密函数、mod26则是除以26取余数的意思。
而A→1、B→2、C→3、....、Z→26这个过程,就叫编码。

编码的功能有很多:例如方便资料传递、防止不同的编码打架、修正错误等等。
但最重要的是,编码是没有办法保护资料的。
更多的像ASCII、UTF-8、base64、甚至摩斯密码等也都是编码方式。
是不具有隐藏资讯的功能的,任何知道编码方式的人都可以把它还原成文字。

所以绝对不要再把编码跟加密搞错了。
( 这几天找资料的过程中也很常出现许多网站把 encode 误打成是 encrypt,尤其是外国网站)


*base64 是一种编码方式

而加密 ( encrypt ) 则是需要密钥的讯息转换过程,为的是隐藏资讯。
在这个例子里,密钥就是n。如果不知道n,就没办法把原本的文字变回来。

不过当然,因为这个例子很简单,英文字母也就26个,多猜几次就猜出来了。
而在之後的文章里,也都是着重於加密的方面哦。

接着,
既然讲了凯萨密码,我们就来讲一下相对应的攻击方式。
除了上面所讲的穷举法之外,另一个很好玩的东西叫做字母频率分析。

字母频率分析

在有字母的语言里,每个字母出现的频率都不一样。
举例来说,英文最常出现的字母是e,接着是t、a、o、i
於是,像这种一个字母对应到另一个字母的加密方式就可以用字母频率分析来破解。

最後补一个上面的坑

MOD

不是你家电视的MOD,是modulo的简写。

y mod x 的意思,就是取y除以x的余数。这样的目的,是让我们的计算结果都可以落在一个范围之内。
如果你无法想像的话,想想看时钟好了。
我们都知道18点就是6点,20点就是8点

18 mod 12 = 6、20 mod 12 = 8

时钟就是一个mod 12 的运算。
所以不论时间过多久,他永远在12点之内 。

凯萨密码要让字母永远在编码26之内,
也就是说如果我要用数学方式把 z 转换成 b ,那就要计算(26+2) mod 26 = 2,也就是b。
那今天就这样罗,如果你很无聊,可以玩看看我用python写的caesar cipher。我放在底下。

def caesar(text,n):
    result = str()
    for i in range(len(text)):
        a  = text[i]
        if ord(a) != 32:
            if ord(a) < 97:
                result += chr((ord(a) + n-65) % 26 + 65)
            else:
                result += chr((ord(a) + n - 97) % 26 + 97)
        else:
            result += " "
    return result

msg = input()
n = int(input())
print (caesar(msg,n))

图片来源:
https://windsongtraining.ca/encryption-part-1-the-caesar-cipher/
http://www.quickmeme.com/meme/36aj0j


<<:  D13-(9/13)-鸿海(2317)-iPhone组装概念股

>>:  [Day 13] 简单的单元测试实作(七)-建立共用的函式

用React刻自己的投资Dashboard Day16 - react-router-dom让SPA也有路由

tags: 2021铁人赛 React 前一篇提到的导览列的各个按钮,点击之後会跳到不同的页面,每个...

#11 Pandas教学3

Pandas汇入CSV档 # 载入pandas import pandas as pd if __n...

Day 12:UI / UX

前言 UI 跟 UX 是两个完全不一样的东西,以工程师的角度简单来说, UI 是美术视觉看得到的, ...

【20】从头自己建一个 keras 内建模型 (以 MobileNetV2 为例)

Colab连结 虽然 Tensorflow 提供了几个预训练模型让我们可以很快的完成训练任务,但是有...

Day 22 - 物理模拟篇 - 二维布料模拟 - 成为Canvas Ninja ~ 理解2D渲染的精髓

时间过得很快,这边我们已经来到物理模拟篇的最後一节 ~ 二维布料模拟了。 原本其实我是打算把这一篇放...