历史上几种著名的密码(古典密码)

一.凯撒密码

1.定义

将明文中所使用的字母表按照一定的字数平移得到的。

2.图解(以平移三位为例)

abcdefghijklmnopqrstuvwxyz
defghijklmnopqrstuvwxyzabc
abcdefghijklmnopqrstuvwxyz
xyzabcdefghijklmnopqrstuvw

3.加密

如:明文:hello world;

密钥:3(向右平移);

密文:khoor zruog

4.解密

1)发送者和接收者事先约定好密钥

2)暴力破解/穷举搜索/词频分析

5.python代码

# Caesar
def shift_transform(input_m, shift):     # 移位变换函数(输入明文以及移位数)
    output_c = ""     # 定义初始的输出字符串为空
    for i in range(len(input_m)):  
        char = input_m[i]  
        # 区分大小写后进行移位变换
        if char.isupper():
            # 大写字母的ASCII从65开始
            output_c += chr((ord(char) + shift - 65) % 26 + 65)
        else:
            # 小写字母的ASCII从97开始
            output_c += chr((ord(char) + shift - 97) % 26 + 97)
    return output_c  
Message_test = "rovvyxgybvn"  # 在这里输入你想要的明文
shift_num =-10   # 在这里设置移位数
print("原始字符串为:" + Message_test)
print("移位数:" + str(shift_num))
print("移位变换后的字符串为:" + shift_transform(Message_test, shift_num))

6.说明:

ord()用于返回字符的Unicode码

用法:ord(“C”)

对应的还是有ord()函数的配对函数chr() 

chr()的作用是:输入一个十进制或十六进制数字,返回其在Unicode编码中对应的文字或符号

ord("a")  #返回字母a对应的ASCII码:97
ord("aa")  #报错,参数不能是字符串,只能是字符
chr(97) #返回字母a
chr(20320) #返回汉字 “你”

7.运行结果

原始字符串为:rovvyxgybvn
移位数:-10
移位变换后的字符串为:hellonworld

进程已结束,退出代码为 0

8.ROT13(替换式密码)

       ROT13(回转13位,rotate by 13 places,有时中间加了个连字符称作ROT-13)是一种简易的替换式密码。它是一种在英文网络论坛用作隐藏八卦(spoiler)、妙句、谜题解答以及某些脏话的工具,目的是逃过版主或管理员的匆匆一瞥。ROT13被描述成“杂志字谜上下颠倒解答的Usenet点对点体”。ROT13 也是过去在古罗马开发的凯撒加密的一种变体。

       套用ROT13到一段文字上仅仅只需要检查字元字母顺序并取代它在13位之后的对应字母,有需要超过时则重新绕回26英文字母开头即可。A换成N、B换成O、依此类推到M换成Z,然后序列反转:N换成A、O换成B、最后Z换成M。只有这些出现在英文字母里头的字元受影响;数字、符号、空白字元以及所有其他字元都不变。因为只有在英文字母表里头只有26个,并且26=2×13,ROT13函数是它自己的逆反: [1]

       对任何字元x:ROT13(ROT13(x))=ROT26(x)=x。

       换句话说,两个连续的ROT13应用函式会回复原始文字(在数学上,这有时称之为对合(involution);在密码学上,这叫做对等加密(reciprocalcipher))。

        转换可以利用查找表完成,如下例所示:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm

        例如,下面的英文笑话,精华句为ROT13所隐匿:

How can you tell an extrovert from an

introvert at NSA?Va gur ryringbef,

gur rkgebireg ybbxf ng gur BGURE thl'f fubrf.

       透过ROT13表格转换整片文字,该笑话的解答揭露如下:

Ubj pna lbh gryy na rkgebireg sebz na

vagebireg ng AFN?In the elevators,

the extrovert looks at the OTHER guy's shoes.

       第二次ROT13函数将转回原始文字。

9.ROT47

ROT47是ROT13的衍生物,它对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。用于ROT47编码的字符其ASCII值范围是33-126,具体可参考ASCII编码

范例:

TheQuickBrownFoxJumpsOverTheLazyDog.

加密成为

%96"F:4AD~G6C%96{2KJs@8]

10.ROT5

只对数字进行编码,用当前数字往前数的第5个数字替换当前数字,例如当前为0,编码后变成5,当前为1,编码后变成6,以此类推顺序循环。

11.ROT18

这是一个异类,本来没有,它是将ROT5和ROT13组合在一起,为了好称呼,将其命名为ROT18。

二.栅栏密码

1.定义

把明文分成N个组,然后取出每组的第一个,每组的第二个。。接着按顺序排列得出密文。若每个组里有n两个元素的话就叫n栏栅栏密码。

2.例题

题目:

1)比如明文:THERE IS A CIPHER
去掉空格后变为:THEREISACIPHER
两个一组,得到:TH ER EI SA CI PH ER
先取出第一个字母:TEESCPE
再取出第二个字母:HRIAIHR
连在一起就是:TEESCPEHRIAIHR
还原为所需密码。
而解密的时候,我们先把密文从中间分开,变为两行:
T E E S C P E
H R I A I H R
再按上下上下的顺序组合起来:
THEREISACIPHER
分出空格,就可以得到原文了:
THERE IS A CIPHER

2)一只小羊跳过了栅栏,两只小样跳过了栅栏,一坨小羊跳过了栅栏…

tn c0afsiwal kes,hwit1r  g,npt ttessfu}ua u hmqik e {m,  n huiouosarwCniibecesnren.

分析:由于题中提到了栅栏,于是猜这段字符串使用了栅栏密码,一般来说,要先去掉空格再分组的,然而这个不要空格之后发现字符串长度只有71,是个素数,不能分组,那么将空格加上数出有85(=17*5)个字符,进行分组

tnc0afsiwalkes,
hwit1rg,nptt
essfu}uauhmqik
e{m,nhuiouos
arwCniibecesnren.

答案:the anwser is wctf{C01umnar},if u is a big new,u can help us think more question,tks.

3.python运行(以栅栏为8为例)

#栅栏技术(栏数为8)
a = input('请输入明文:')
b = []#存储明文
c = []#存储密文
b.extend(a)#extend()函数是直接将a的序列和b进行合并
len = len(b)
for i in range(8):
    c.extend(b[i:len:8])
print('栏数为8的密文为:')
for temp in c:
    print(temp,end = '')#temp暂时存储;#end=输出结果
print("\n")

三.简单替换密码

1.定义:将明文中所使用的字母表替换为另一套字母表的密码,可以认为凯撒密码是其中一种

2.密钥:不同的替换表有不同的密钥

3.解密:频率分析

四.Enigma(一种密码机)

1.密钥:《国防军密码本——每日密码》

2.加密过程:1)输入两遍相同的三个字母,得到六个字母的通信密码,但是不论转子怎么转都不                             会出现明文本身,

                     2)重置Enigma,

                     3)输入明文,根据灯泡是否亮起得到密文,

                     4)将通信密码和密文拼接发送。

五.维吉尼亚密码

1.定义

维吉尼亚密码是16世纪法国密码学家维吉尼亚发明的多表替换式密码,它使用多个密钥生成多个替换表,对明文中的每个字母进行多次替换,以增加密文的复杂度。维吉尼亚密码的优点是即使某个字母出现的频率较高,在密文中也不会出现明显的规律性。

2.【加密原理】

明文:I Love You

密钥:OK

        首先,密钥长度需要与明文长度相同,如果少于明文长度,则重复拼接直到长度相等。本例中,明文长度为8个字母(非字母忽略),密钥补全为“OKOKOKOK”。

      然后根据密码表进行加密。明文第一个字母是“I”,密钥第一个字母是“O”,在表格中找到“I”列与“O”行的相交点,字母“W”就是密文的第一个字母。同理,“L”列与“K”行交点字母是“V”。“O”列与“O”行交点字母是“C”……以此类推,得到密文: W VCFS ICE。     

3.【解密原理】

密文:PWZRNZBZ EA NQKBUHN LNB(表中)

密钥:wind(左表头)

        首先把密钥重复拼接到和密文长度相同,上例中密文为20位字母,密钥拼接后为:windwindwindwindwind。

        密文P对应密钥W,在密码表中找出W行为P的列,沿着这一列向上找到最上面的字母是T。以此类推,得到

明文:tomorrow is another day(上表头)

4.python(字母要大写)

from string import ascii_uppercase as uppercase
from itertools import cycle
 
#创建密码表
table=dict()
for ch in uppercase:
    index=uppercase.index(ch)
    table[ch]=uppercase[index:]+uppercase[:index]
    
#创建解密码表
deTable={'A':'A'}
start='Z'
for ch in uppercase[1:]:
    index=uppercase.index(ch)
    deTable[ch]=chr(ord(start)+1-index)
 
#解密密钥
def deKey(key):
    return ''.join([deTable[i] for i in key])
 
#加密/解密
def encrypt(plainText,key):
    result=[]
    #创建cycle对象,支持密钥字母的循环使用
    currentKey=cycle(key)
    for ch in plainText:
        if 'A'<=ch<='Z':
            index=uppercase.index(ch)
        #获取密钥字母
            ck=next(currentKey)
            result.append(table[ck][index])
        else:
            result.append(ch)
    return ''.join(result)
 
#进行加密
key=input('请输入你的密钥:')#输入只能大写字母
p=input('请输入你想要的加密的内容:')#输入只能大写字母
c=encrypt(p,key)
print('加密后的内容为',c)
#进行解密
q=input('请输入你想要解密的内容:')
key1=input('请输入密钥:')
print('解密后的内容为:',encrypt(q,deKey(key1)))

六.培根密码

1.定义

培根密码是由英国哲学家培根发明的移位式密码,其基本原理是将明文中的每个字母在字母表中向后(或向前)按照固定数目进行移位,得到密文中的字母。例如,将字母表中的每个字母向后移动2位,得到密文中的字母。破解培根密码的关键是找到移位的数目以及移位的方向。

2.应用

在CTF竞赛中,培根密码通常与其他加密方式结合使用,以提高密文的复杂度。破解培根密码需要结合对密文的统计分析以及对移位数目的猜测。

3.解密原理(两种方式)

4.培根应用

基础应用
密文:BAABABAABBAABAAAABBAAAAAAABBABABBBAAABBABAAABAAAAAABBBBAABBBBBAAA

明文:BAABA  BAABB  AABAA  AABBA  AAAAA  ABBAB  ABBBA  AABBA  BAAAB  AAAAA  ABBBB  AABBB  BBAAA
    s      t     e    g   a    n    o    g    r     a    p    h    y

也就是说明文为steganography

进阶应用
1)密文:abCDE    fgHij   kLmNO   pQrST   uVWXy

明文:AABBB   AABAA   ABABB   ABABB   ABBBA 
   h                 e              l              l             o

这里是怎么回事呢,我们令大写字母为B,小写字母为A,则将密文转化为BA字符串,再解码即可。

2)密文:abCDE    fgHij   kLmNO   pQrST   uVWXy

明文:AABBB   AABAA   ABABB   ABABB   ABBBA 
   h                 e              l              l             o

我们令粗体表示B,正常字体为A,则将密文转化为BA字符串,再解码即可。

3)密文:xgdocpdcuuhlpfmglupfdlbhekpxiqknvpiimyykoeahrjjcfkmqusrkbuutqvlfb

明文:BAABA BAABB AABAA AABBA AAAAA ABBAB ABBBA AABBA BAAAB AAAAA ABBBB AABBB BBAAA
    s   t   e   g   a   n   o   g   r   a   p   h   y

这里的规则是:

a~m→A:    字母a到m这一范围内的字母统一换成A
n ~ z→B:     字母n到z这一范围内的字母统一换成B

5.解密网站

培根密码解密_培根密码转换器-ME2在线工具

七、题

write up_赣ctfwriteup-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值