古典密码
移位密码
例题 m=flag k=3124
明文 1234
密文 3124
flag
lafg
加密
def shift_encrypt(m,k):
l=len(k)
c=""
for i in range(0,len(m),l):
tmp_c=[""]*l
if i+l>len(m):
tmp_m=m[i:]
else:
tmp_m=m[i:i+l]
for kindex in range(len(tmp_m)):
tmp_c[int(k[kindex])-1]=tmp_m[kindex]
c+="".join(tmp_c)
return c
m="flag{easy_easy_crypto}"
k="3124"
print shift_encrypt(m,k)
解密
def shift_decrypt(c,k):
l=len(k)
m=""
for i in range(0,len(c),l):
tmp_m=[""]*l
if i+l>=len(c):
tmp_c=c[i:]
use=[]
for kindex in range(len(tmp_c)):
use.append(int(k[kindex]) - 1)
use.sort()
for kindex in range(len(tmp_c)):
tmp_m[kindex] = tmp_c[use.index(int(k[kindex])-1)]
else:
tmp_c=c[i:i+l]
for kindex in range(len(tmp_c)):
tmp_m[kindex] = tmp_c[int(k[kindex]) - 1]
m+="".join(tmp_m)
return m
曲路密码
云影密码
云影密码仅包含01248五个数字,其中0用于分割,其余数字用于做加和操作之后转换为明文
def c01248_decode(c):
l=c.split("0")
origin = "abcdefghijklmnopqrstuvwxyz"
r=""
for i in l:
tmp=0
for num in i:
tmp+=int(num)
r+=origin[tmp-1]
return r
栅栏密码
密钥只有一个数字
将明文分成k组,取每组第一个字符依次连接
m=flagisxxhaha
k=4
flag isxx haha
即 fih lsa axh gxa
加密
def zhalan_encrypt(m,k):
chip=[]
for i in range(0,len(m),k):
if i+k>=len(m):
tmp_m=m[i:]
else:
tmp_m=m[i:i+k]
chip.append(tmp_m)
c=""
for i in range(k):
for tmp_m in chip:
if i < len(tmp_m):
c+=tmp_m[i]
return c
解密
def zhalan_decrypt(c,k):
l=len(c)
partnum=l/k
if l%k!=0:
partnum+=1
m=[""]*l
for i in range(0,l,partnum):
if i+partnum>=len(c):
tmp_c=c[i:]
else:
tmp_c=c[i:i+partnum]
for j in range(len(tmp_c)):
m[j*k+i/partnum]=tmp_c[j]
return "".join(m)
替代密码
密钥就是替代表
有单表和多表
攻击方式 词频分析
1、单表
凯撒
加密
def caesar_encrypt(m,k):
r=""
for i in m:
r+=chr((ord(i)+k)%128