密码学

因为事情繁多没有得好好写文章了,记下这两天课上写的密码学脚本~~~

反向密码

# -*- coding: utf-8 -*-
# @Time : 2020-12-01 9:26
# @File : 22.py
# @Author : mirror
# @Software: PyCharm

mingwen = input("请输入反向加密的密文:\n")
print("反向加密后的密文:" + mingwen[::-1])
miwen = mingwen[::-1]
print("解密后的明文:" + miwen[::-1])

凯撒密码

# -*- coding: utf-8 -*-
# @Time : 2020-12-01 9:26
# @File : 22.py
# @Author : mirror
# @Software: PyCharm

from sympy import *

def Ksencrypt(m,key) :                  #加密函数
    re = ''
    for i in m:
        if i in b:                      #如果该字符在字符串b中就返回相应的下标
            num = b.find(i)
            re +=b[Mod(num+key,26)]     #加相应的key再mod26
    return re                           #返回加密后的密文

def Ksdecrypt(m,key) :                  #解密函数,过程同加密,只是相应的key+3变成-3
    re = ''
    for i in m:
        if i in b:
            num = b.find(i)
            re +=b[Mod(num-key,26)]
    return re

if __name__ == '__main__':
    m, key = input("请输入明文和密钥,明文和密钥中间用空格分开:").split(' ')
    m = m.lower()
    b = "abcdefghijklmnopqrstuvwxyz"
    key = int(key)
    c = Ksencrypt(m,key)
    print("加密后密文为:" + c)
    m = Ksdecrypt(c,key)
    print("解密后明文为:" + m)

仿射密码

# -*- coding: utf-8 -*-
# @Time : 2020-12-01 9:26
# @File : 22.py
# @Author : mirror
# @Software: PyCharm

from sympy import *
import gmpy2

def FsFsencrypt(m, a, b):
    re = ''
    for i in m:
        if i in dictstr:  # 如果该字符在字符串b中就返回相应的下标
            num = dictstr.find(i)
            re += dictstr[Mod(num * a + b, 26)]  # 乘以相应的a加上偏移量再mod26
    return re  # 返回加密后的密文


def Qiua_ni(a, n):          #求逆元函数
    a_ni = gmpy2.invert(a, n)
    return a_ni


def Fsdecrypt(c, a_ni, b):
    re = ''
    for i in c:
        if i in dictstr:  # 如果该字符在字符串b中就返回相应的下标
            num = dictstr.find(i)
            re += dictstr[Mod(a_ni * (num - b), 26)]  # 逆元乘以减去偏移量的密文再mod26
    return re


if __name__ == '__main__':
    print("-----------加密方程为a*x + b(mod 26)--------------")
    m = input("---请输入待加密的明文---:")
    a = int(input("---请输入a,a的范围是a ∈{1,3,5,7,9,11,15,17,19,21,23,25}---:"))
    b = int(input("---请输入b,b的范围是b<26---:"))
    m = m.lower()
    dictstr = "abcdefghijklmnopqrstuvwxyz"
    c = FsFsencrypt(m, a, b)
    print("---加密后密文为---:" + c)
    print("---a的逆元为----:" + str(Qiua_ni(5, 26)))
    a_ni = Qiua_ni(5, 26)
    m = Fsdecrypt(c, a_ni, b)
    print("---解密后明文为---:" + m)

维吉尼亚密码

# -*- coding: utf-8 -*-
# @Time : 2020-12-01 9:26
# @File : 22.py
# @Author : mirror
# @Software: PyCharm

from sympy import *

def Wnencrypt(keylen,ptlen) :
    ciphertext = ''
    i = 0
    while i < ptlen:
        j = i % keylen  #通过求余的方式来控制密钥的循环
        k = dictstr.find(key[j])
        m = dictstr.find(plaintext[i])
        ciphertext += dictstr[Mod(k + m,26)]  #位置下标相加再mod26
        i += 1
    return ciphertext

def Wndecrypt(keylen,ctlen) :
    plaintext = ""
    i=0
    while i < ctlen:
        j = i % keylen
        k = dictstr.find(key[j])
        m = dictstr.find(ciphertext[i])
        if m < k:
            m += 26
        plaintext += dictstr[m-k]
        i += 1
    return plaintext

if __name__ == '__main__':
    key = input("---请输入key---:")
    plaintext = input("---请输入待加密的明文(单词之间去掉空格再输入)---:")
    dictstr = 'abcdefghijklmnopqrstuvwxyz'
    keylen = len(key)
    ptlen = len(plaintext)
    print("---加密后密文为---:" + Wnencrypt(keylen,ptlen))
    ciphertext = Wnencrypt(keylen,ptlen)
    keylen = len(key)
    ctlen = len(ciphertext)
    print("---解密后明文为---:" + Wndecrypt(keylen,ctlen))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值