一.凯撒密码
1.定义
将明文中所使用的字母表按照一定的字数平移得到的。
2.图解(以平移三位为例)
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z | ||
d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z | a | b | c |
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
x | y | z | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w |
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)个字符,进行分组
t | n | c | 0 | a | f | s | i | w | a | l | k | e | s | , | ||
h | w | i | t | 1 | r | g | , | n | p | t | t | |||||
e | s | s | f | u | } | u | a | u | h | m | q | i | k | |||
e | { | m | , | n | h | u | i | o | u | o | s | |||||
a | r | w | C | n | i | i | b | e | c | e | s | n | r | e | n | . |
答案: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.解密网站