Cipher
morse
python
#!/usr/bin/python
morse_dic = {'01':'A','1000':'B','1010':'C','100':'D','0':'E','0010':'F','110':'G','0000':'H','00':'I','0111':'J','101':'K','0100':'L','11':'M','10':'N','111':'O','0110':'P','1101':'Q','010':'R','000':'S','1':'T','001':'U','0001':'V','011':'W','1001':'X','1011':'Y','1100':'Z','01111':'1','00111':'2','00011':'3','00001':'4','00000':'5','10000':'6','11000':'7','11100':'8','11110':'9','11111':'0','001100':'?','10010':'/','101101':'()','100001':'','010101':'.','110011':',','011010':'@','111000':':','101010':':','10001':'=','011110':"'",'101011':'!','001101':'_','010010':'"','10110':'(','1111011':'{','1111101':'}'}
s = input("请输入密文:").strip()
if '/' in s:
s = s.replace('/', ' ')
if '.' in s:
table = ''.maketrans('.-','01')
t = s.translate(table).split()
else:
t = s.split()
res = ''
for i in t:
res += morse_dic.get(i, "#")
print(res)Bacon's cipher
培根密码是一种简单的替换密码,密文字符只有a和b
每个明文字符都会被替换为一个由a和b组成的长度为5的字符串
h -> aabbb
密文字符也可以选择任意两个其它字符
常规培根密码表 明文i和j、u和v所对应的密文是一样的
扩展培根密码表 包括所有26个字母

python
str = 'hellO everyone,Are YOU huNGrY? woUld you li To eAt BAcon'
res = ''
for i in str:
if i.islower():
res += 'A'
elif i.isupper():
res += 'B'
print(res)
table = ''.maketrans('AB','BA')
print(res.translate(table))解密
bash
#!/usr/bin/python
a = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","babaa","babab","babba","babbb","bbaaa","bbaab"]
b = [chr(i) for i in range(ord('a'), ord('z') + 1)]
table = dict(zip(a,b))
# table = {i:j for i,j in zip(a,b)}
# print(table)
s = input("请输入密文:").strip().lower()
res = ''
for i in range(0, len(s), 5):
res += table.get(s[i:i+5], '#')
print(res)Caesar cipher
凯撒密码加密原理
- 把明文中的所有字母按字母表顺序向后移动n位,数字和非字母字符保持不变。
- 位移数n就是密钥。
- 凯撒密码只有25种可能的密钥。

tools.py
python
# caesar转换 text-待转换的文本 n-移动位数(正数右移,负数左移)
def caesar_transfer(text, n):
res = ''
for i in text:
if i.isupper():
res += chr(((ord(i) - 65) + n) % 26 + 65)
elif i.islower():
res += chr(((ord(i) - 97) + n) % 26 + 97)
else:
res += i
# print(res)
return rescaesar_demo.py
python
#!/usr/bin/python
from tools import caesar_transfer
# 'L oryh Sbwkrq3'
# 'synt{mur_VF_syn9_svtug1at}'
# 'oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}'
# 'NGBKLATCOZNIXEVZU'
# "gmbhjtdbftbs"
keywords = ('flag','ctf','pass','fun', 'have','caesar','cyber','you','zmxh','mzwg','666c')
cipher = input("请输入密文:")
print('-'*15, '解密结果', '-'*15)
for i in range(1,26):
res = caesar_transfer(cipher.strip(), i)
for keyword in keywords:
if keyword in res.lower():
print('Maybe:', res)
breakROT13
ROT13是凯撒密码的一种变体,移位数固定为13。
- ROT13实现的效果是将26个字母的前半部分与后半部分互换,ROT13的密文和明文互为逆反。

Rail Fence Ciphe
置换(移位)密码
- 与替代密码不同,置换密码并不将明文字符用另一种字符来代替。
- 置换密码的主要思想是改变明文字符的排列方式。
- 保持明文的字符相同,但是重新将字符进行排序,形成新的密文序列。
1.传统型(分组式)
操作步骤:
- 选择一个数字作为栏数(Key)。
- 将明文每个字符分为一组。
- 依次取出每组的第 1 个字符组成密文的第一部分,再取每组的第 2 个字符,以此类推,直到所有字符取完。
示例(明文:ILoveLinux,栏数:2):
- 分组:
IL ov eL in ux - 取每组第1位:
Ioeiu - 取每组第2位:
LvLnx - 密文:
IoeiuLvLnx
bash
#!/usr/bin/python
s = input("请输入原文:").strip()
# 自动求出可加密的栏数
key = [i for i in range(2, len(s)) if len(s)%i == 0]
for k in key:
res = ''.join([s[i::k] for i in range(0, k)])
print(f'{k}栏加密: {res}')2.W型(波浪式)
WE ARE DISCOVERED. FLEE AT ONCE'
txt
W . . . E . . . C . . . R . . . L . . . T . . . E
. E . R . D . S . O . E . E . F . E . A . O . C .
. . A . . . I . . . V . . . D . . . E . . . N . .WECRL TEERD SOEEF EAOCA IVDEN
