重要概念
一般使用Alice和bob为传递信息的两个人,eve为从密文中窃取明文信息的人
明文 m&p 密文 c 密钥 k
攻击方法:穷举攻击,统计分析攻击,数学求解分析
编码:二进制(0b)八进制(0O)十进制(0d)十六进制(0x)
古典密码
密码编码学
ASCII码
Base家族
- base16(0-9,A-F)
- base32(A-Z, 2-7)
- base64(A-Z,a-z,0-9,+,/)
import base64 m = 'abc' s = base64.b64encode(m.encode()) print(s)
摩尔斯电码
通过电流的时通时断
Unicode
\u...\u...
URL
http%...%...%...
Caesar(凯撒密码)
一般解密(加密相似)
c = input('请输入密文')
k = input('请输入密钥')
c = c.upper()
k = int(k)
m = ''
for i in c:
m += chr(((ord(i)-ord('A') - k) % 26) + ord('A'))
print('明文为:' + m)
爆破代码
c = input('请输入密文')
c = c.upper()
for k in range(26):
m = ''
for i in c:
m += chr(((ord(i)-ord('A') - k) % 26) + ord('A'))
print('当k='+str(k)+'时,明文为 ' + m)
变异凯撒:
c = input()
##Python解决方案
# 输入被解密的字符串string 和 初始相差位数begin_num
def KaiSa(string, begin_num):
string_list = list(string)#把字符串转化为char数组
result = "" #存放
for char in string_list:
# num = ord(char)#转化为ASCII格式
# num += begin_num#增加相差位数值
begin_num += 1#相差位数值逐渐递增
# char = chr(num)#转化为字符
# result += char#拼接结果字符到结果中
result += chr(((ord(char) - ord('A') - begin_num) % 26) + ord('A'))
return result
print(KaiSa(c, 6))
c ="zpvepoudbsgcdqwvjgocqg|rxrqo|feviefsyx}szwt|skqfl?NKIZLYZUVfU|jslhyfzmiom"
m = ''
for i in range(len(c)):
shift = 1 + i // 10
m += chr(ord(c[i]) - shift)
print(m)
c ="zpvepoudbsgcdqwvjgocqg|rxrqo|feviefsyx}szwt|skqfl?NKIZLYZUVfU|jslhyfzmiom"
for i in range(len(c)):
shift = 1 + i // 10
# m += chr(ord(c[i]) - shift)
print(chr(ord(c[i]) - shift),end="")
单表替换
不能爆破,但可以尝试根据英文字母出现频率特征判断可能性
维吉尼亚密码(多表密码)
相当于对应明文与密钥对应(密钥不够长则再次循环)ord相加求出位置,过大模26得出在字母表中的位置
加密代码
m = input('请输入明文:')
k = input('请输入密钥:')
m = m.lower()
c = ''
for i in range(len(m)):
c += chr((ord(m[i]) - ord('a') + ord(k [i % len(k)])-ord('a')) % 26 + ord('a'))
print('密文为:'+ c)
解密代码
c = input('请输入密文:')
k = input('请输入密钥:')
c = c.lower()
m = ''
for i in range(len(c)):
m += chr((ord(c[i]) - ord(k [i % len(k)])) % 26 + ord('a'))
print('密文为:'+ m)
栅栏密码
按照密钥排列为n个一组,把每组第一个字母连起来,成一段无规则的话
加密代码
m = input('请输入明文')
k = int(input('请输入密钥'))
c = ''
for i in range(k):
for j in range(len(m)// k + 1):
if j * k + i < len(m):
c += m[j*k+i]
print('密文为:'+ c)
解密代码
c = input('请输入密文')
k = int (input('请输入密钥'))
m = ''
t = len(c) % k#判断最后一列元素个数
for i in range(len(c)//k+1):
for j in range(k):
if j < t:
m += c[j * (len(c)//k + 1) + i]
else:
if i != len(c) // k:
m +=c[j * (len(c)//k) + i + t]
print('明文为:'+ m)
爆破代码
c = input('请输入密文')
for i in range(1,len(c)):
m = decrypto(c, i)
print('当密钥为'+str(i)+'时,解密得到:'+ m)
当铺密码
汉字笔画数对应数字几