鱼C论坛

 找回密码
 立即注册
查看: 1674|回复: 1

[技术交流] 做一个凯撒加密解密程序

[复制链接]
发表于 2021-1-29 03:21:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
上个学期在学校学习过网络安全的课,里面有一中古老的加密方法名为凯撒加密

在学习时曾制作过一个加密解密程序,后来重装系统给清理了

正好闲来无事写一下

话不多说,先简单的介绍一下凯撒密码吧

凯撒加密.png

凯撒密码的加密过程如上图所示,将字符串中的每一个字符在字母表对应的排序中向右移动指定的位数,得到的结果为密文

而解密则是将字符串中的每一个字符在字母表对应的排序中向左移动指定的位数

这种加密方式极容易受到频率分析的攻击,例如元音字符 aeiou 等出现的频率较高

另外也很容易受到暴力破解的攻击,只需要至多尝试 25 次偏移,即可得出正确的明文(英文字母共有 26 位)

好了,基本的已经介绍完了,更多内容可以自行百度

其实小甲鱼若干年前曾经录制过密码学的课程,不知道出于什么原因废弃了,或许是因为没什么人对这一方面感兴趣吧,应用范围也没有编程语言那么广泛

那么,上代码
small = 'abcdefghijklmnopqrstuvwxyz'
small_l = list(small)

digit = '0123456789'
digit_list = list(digit)

def transfer(cipher_text, margin):
    plain_text = ''
    cipher_list = list(cipher_text)
    for each in range(len(cipher_list)):
        if cipher_list[each].isalpha(): # 如果该字符是字母
            if cipher_list[each].islower(): # 如果是小写字母
                for every in range(len(small_l)):
                    if cipher_list[each] == small_l[every]:
                        plain_text += small_l[((every + margin) + 26) % 26] # 避免越距
            else:
                swap_to_small = cipher_list[each].lower()   # 转换为小写字母
                for every in range(len(small_l)):
                    if swap_to_small == small_l[every]:
                        plain_text += small_l[((every + margin) + 26) % 26].upper()
        elif cipher_list[each].isdigit():   # 如果该字符是数字
            for every in range(len(digit_list)):
                if cipher_list[each] == digit_list[every]:
                    plain_text += str(digit_list[((every + margin) + 10) % 10]) # 避免越距
        else:
            plain_text += cipher_list[each]   
    return plain_text

def decrypt(cipher_text):
    choose = input('请输入模式编号:\n1. 提供偏移量用来破解模式\n2. 暴力破解模式\n')
    if choose == '1':
        while True:
            enter_margin = input('请输入偏移量\n')
            if enter_margin.isdigit():
                if int(enter_margin) < 26:
                    margin = int(enter_margin)
                    break
        margin = - margin   # 向左偏移
        plain_text = transfer(cipher_text, margin)
        print(plain_text)
    elif choose == '2':
        for margin in range(1, 26):
            margin = - margin   # 向左偏移
            plain_text = transfer(cipher_text, margin)
            print(plain_text, end = ' ')
            print('偏移量为:' + str(-margin))
    else:
        decrypt(cipher_text)

def encrypt(plain_text, margin):
    cipher_text = transfer(plain_text, margin)
    print(cipher_text)

if __name__ == '__main__':
    decrypt('WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ')   # 解密(密文)
    encrypt('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG', 3)    # 加密(明文, 偏移量)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-2-23 02:03:11 | 显示全部楼层
自己顶一下这古老的帖子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 11:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表