1.替代密码,必须有密码本,加密时将加密的明文依次替换为密文
2.摩斯密码一般都是“."”_"来表示,也有“0”,’1“,在对摩斯密码加解密时,先确定分隔符,分隔符一般为空格,也可以为"/"
3.在用工具进行解密时,若遇到“0”,“1”,则要进行转换,记事本→编辑→替换,随机替换成“.","_",直至最终的解密结果顺眼。
4.写脚本时,要使密码表内所含字符较多。
具体操作:(1)定义key的变量,把密码字典赋值给它,用txt接收用户输入的数据,用strip去掉密文左右两侧的空格,用split作为分隔符。
(2)用get方法取字典中的值,因为若取得键在字典中不存在,会产生异常,而get不会产生异常,print(key.get(i),end=' ')
5.让脚本既能解是"._"的密文,也能解"01"的密文
(1). table = ' '.maketrans('01','._')
txt.translate(table)
(2). table = ' '.maketrans('.-','01')
txt.translate(table)
(3). 列表不能用translate方法来转换,此时对字符串不能分割,
先转换为01或._再进行分割
if '.' in txt:
table = ' .maketrans('._','01')
txt = txt .translate(table).split()
else:
txt = txt.split()
(4).别忘了用split方法进行分割!! ! ! !
6.注意形式 flag{ }
凯撒密码
1.把英文字母在字母表中向前或向后移相同的位数,且只对英文字母进行移位,数字,符号标点不变,字母大小写不变,密钥只有25种可能,即[0,25],最后找寻到最有实际意义的答案。
2.x代表明文,y代表密文,k代表密钥
(1).加密:(x+k)%26 也可用mod求模
(2).解密:(y-k)%26
(3).负数取模: -4%26=22 即-4+26=22%26=22
3.chr(97+(ord(i)+n-97)%26) 中n为秘钥。
使用ord(i)+n-97让其位于[0,25]内,以便求余。
4.脚本上总体上要完成的要求
(1)区分大小写
(2)如果不是大小写,则原样输出
(3)分析解出的明文是否含有flag,ctf,the,is,to,no,for等关键字
使用如下:key = ('flag','ctf','key','the','is','no','for')
for m in key:
if m in mi:
print(‘明文可能是: ',ming)
print( )
break
若用户不需要程序推荐,则如下:
txt = input('请输入密文: ').strip( )
n = input('您是否需要推荐明文(Y/N)').strip()
...................
if n.lower() =='y':
key = ('flag','ctf','key','the','is','no','for')
for m in key:
if m in mi:
print(‘明文可能是: ',ming)
print( )
break
elif n.lower() =='n':
print(ming)
print()
以防一个语句中因有多个关键字而多次输出,故要运用 break
5.写脚本时,区分大小写,
for j in txt :
if j. is lower():
使用的表达式为chr(97+(ord(j)-i-97)%26)
elif j.isupper():
使用的表达式为chr(65+(ord(j)-i-65)%26)
6.一个绝绝子的方法:
运用替换方式
lower = 'abcdefghijklmnopqrstuvwxyz'
upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in range(1,26): 此处定义了密钥的范围
xiao = lower[i:]+lower[:i] 此处按照密钥将字母顺序进行了整体后移
da = upper[i:]+upper[:i] 运用了切片
ming = ' ' 起始定义为空字符串
table = ' '.maketrans(xiao+da,lower+upper)
for i in txt:
print(ming)