密码学基本知识+古典密码学

重要概念

一般使用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)
当铺密码

汉字笔画数对应数字几

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值