使用Python语言实现凯撒密码的加密和解密

使用Python语言实现凯撒密码的加密和解密

介绍

在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

扫盲:大写字母A至Z对应的十进制ASCII编码为65至90,小写字母a至z对应的十进制ASCII编码为97至122。

方法一

chr()函数用一个范围在range(256)内的(就是0~255)整数作参数,返回一个对应的字符。返回值是当前整数对应的ASCII字符。该函数的返回值为字符串形式,例如输入chr(90),输出为 ‘Z’ 。
ord()函数与chr()函数对应,输入ASCII字符表中字符的字符串形式,返回为其在字符表中的排序位次。例如输入ord(‘a’),输出为97。

加密

str=input("请输入明文:")
n=int(input("请输入密钥:"))
str_encrypt=""
for letter in str:
    if letter==" ":  #遇到空格选择不加密
        letter_encrypt=" "
    else:
        letter_encrypt=chr((ord(letter)-ord("a") +n) %26 +ord("a"))
    str_encrypt += letter_encrypt
print("密文为:",str_encrypt)

在这里插入图片描述

解密

str=input("请输入密文:")
n=int(input("请输入密钥:"))
str_decrypt=""
for word in str:
    if word==" ":  #遇到空格选择不解密
        word_decrypt=" "
    else:
        word_decrypt=chr((ord(word)-ord("A") -n) %26 +ord("A"))
    str_decrypt = str_decrypt+word_decrypt
print("明文为:",str_decrypt)

在这里插入图片描述

高阶

我们嵌入一个多分支结构,使得程序能够同时判定大小写字母,这里只列出加密代码,解密只需将“+n”替换为“-n”即可。

str=input("请输入明文:")
n=int(input("请输入密钥:"))
str_encrypt=""
for letter in str:
    if "a"<=letter<="z":
        str_encrypt +=chr((ord(letter)-ord("a") +n) %26 +ord("a"))
    elif "A"<=letter<="Z":
        str_encrypt +=chr((ord(letter)-ord("A") +n) %26 +ord("A"))
    else:
        str_encrypt += letter
print("密文为:",str_encrypt)

在这里插入图片描述

方法二

利用多分支结构在同一程序里执行大小写字母判定、加密、解密等命令。

str = input("请输入一段英文:")
key = int(input("请输入密钥:"))
enc = int(input("0 - 解密\n1 - 加密\n请选择 0 或者 1: "))
str_enc = ""
str_dec = ""

if enc == 1:  #加密
    for i in str:  #用i进行遍历
        if i.isupper():  #isupper函数判断i是否为大写字母
            i_unicode = ord(i)  #找到“i”对应的Unicode码
            i_index = ord(i) - ord("A")  #计算字母“i”到A(起始)的间距
            new_index = (i_index + key) % 26
            new_unicode = new_index + ord("A")
            new_character = chr(new_unicode)  #将Unicode码转换为字符
            str_enc += new_character
        elif i.islower():  #如果“i”为小写字母
            i_unicode = ord(i)
            i_index = ord(i) - ord("a")
            new_index = (i_index + key) % 26
            new_unicode = new_index + ord("a")
            new_character = chr(new_unicode)
            str_enc = str_enc + new_character
        else:  #数字或符号
            str_enc += i  #直接返回“i”
    print("密文为:",str_enc)

else:  #解密
    for k in str:
        if k.isupper():
            k_unicode = ord(k)
            k_index = ord(k) - ord("A")
            new_index = (k_index - key) % 26
            new_unicode = new_index + ord("A")
            new_character = chr(new_unicode)
            str_dec = str_dec + new_character
        elif k.islower():
            k_unicode = ord(k)
            k_index = ord(k) - ord("a")
            new_index = (k_index - key) % 26
            new_unicode = new_index + ord("a")
            new_character = chr(new_unicode)
            str_dec += new_character 
        else:
            str_dec += k
    print("明文为:",str_dec)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法三

利用函数实现凯撒密码的加密与解密。

def encrypt(str, key):
    ciphertext=""
    for word in str: 
        if word.isupper():
            ciphertext += chr((ord(word) - 65 + key) % 26 + 65)
        elif word.islower():
            ciphertext += chr((ord(word) - 97 + key) % 26 + 97)
        else:
            ciphertext = ciphertext + word
    return ciphertext

def decrypt(str, key):
    plaintext=""
    for word in str: 
        if word.isupper():
            plaintext += chr((ord(word) - 65 - key) % 26 + 65)
        elif word.islower():
            plaintext += chr((ord(word) - 97 - key) % 26 + 97)
        else:
            plaintext = plaintext + word
    return plaintext

option = int(input("请选择0(解密)或1(加密): "))
if option == 1:
    text1=input("请输入明文:")
    s1=int(input("请输入密钥:"))
    print("密文为:", encrypt(text1, s1))
else:
    text2=input("请输入密文:")
    s2=int(input("请输入密钥:"))
    print("明文为:", decrypt(text2, s2))

在这里插入图片描述
在这里插入图片描述

方法四

通过函数使用其他算法进行加密,并且将空格与符号也进行加密。

def option():
    while True:
        print("请输入enc(加密)或dec(解密),退出请输入q")
        mode=input("选择:").lower()
        if mode in "enc dec q".split():
            return mode
        else:
            print("请输入正确选项!")

def getKey(mode):
    key=0
    while key<=0 or key>=26:
        try:
            key=int(input("请输入密钥(1-26):"))
        except:
            print("请输入正确密钥!")
    if mode=="dec":
        key=-key  #对密钥进行变换
    return key

def getMessage(key):
    text=input("请输入一段英文:")  
    message=""
    for i in text:
        num=ord(i)
        num=num+key
        if i.isupper():
            if num>ord("Z"):
                num=num-26
            elif num<ord("A"):
                num=num+26
        elif i.islower():
            if num>ord("z"):
                num=num-26
            elif num<ord("a"):
                num=num+26
        message += chr(num)
    return message

mode = option()
if mode == "q":
    print("欢迎下次使用!")
elif mode == "enc":
    key=getKey(mode)
    str1=getMessage(key)
    print("密文为:",str1)
elif mode == "dec":
    key=getKey(mode)
    str2=getMessage(key)
    print("明文为:",str2)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

暴力破解凯撒密码方式一

LETTERS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
LETTERS1="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LETTERS2="abcdefghijklmnopqrstuvwxyz"

text=input("请输入密文:")
for key in range(len(LETTERS)):
    str=""
    for i in text:
        if i in LETTERS:
            if i.isupper():  #密文字母为大写
                num = LETTERS1.find(i)  #在字母里搜索到密文字符的位置
                num = num - key
                if num<0:
                    num = num + len(LETTERS1)
                str = str + LETTERS1[num]  #将解密后字符追加到字符串末尾
            elif i.islower():  #密文字母为小写
                num = LETTERS2.find(i)  #在字母里搜索到密文字符的位置
                num = num - key
                if num<0:
                    num = num + len(LETTERS2)
                str = str + LETTERS2[num]  #将解密后字符追加到字符串末尾
        else:
            str = str + i  #如果密文中内容不在字母里则不解密,直接追加
    print('第%d把钥匙的结果是%s' %(key, str))  #显示每一个可能的值

在这里插入图片描述

暴力破解凯撒密码方式二

def unlock(text):
    for i in text:
        if 65+key<=ord(text)<92 or 97+key<=ord(text)<123:
            text=chr(ord(text)-key)
        elif 65<=ord(text)<65+key or 97<=ord(text)<97+key:
            text=chr(ord(text)-key+26)
        else:
            text=text
    return text

text=input("请输入密文:")
plaintext=""
for key in range(1,27):
    for k in list(map(unlock,text)):
        plaintext=plaintext+k
    print("第%d把钥匙的结果是%s"%(key,plaintext))
    plaintext=""

在这里插入图片描述
以上。

猜你喜欢

转载自blog.csdn.net/m0_66309026/article/details/126671036