Daniel_Zhang 发表于 2021-1-29 03:21:26

做一个凯撒加密解密程序

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

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

正好闲来无事写一下

话不多说,先简单的介绍一下凯撒密码吧{:10_248:}



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

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

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

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

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

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

那么,上代码

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.isalpha(): # 如果该字符是字母
            if cipher_list.islower(): # 如果是小写字母
                for every in range(len(small_l)):
                  if cipher_list == small_l:
                        plain_text += small_l[((every + margin) + 26) % 26] # 避免越距
            else:
                swap_to_small = cipher_list.lower()   # 转换为小写字母
                for every in range(len(small_l)):
                  if swap_to_small == small_l:
                        plain_text += small_l[((every + margin) + 26) % 26].upper()
      elif cipher_list.isdigit():   # 如果该字符是数字
            for every in range(len(digit_list)):
                if cipher_list == digit_list:
                  plain_text += str(digit_list[((every + margin) + 10) % 10]) # 避免越距
      else:
            plain_text += cipher_list   
    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)    # 加密(明文, 偏移量)

Daniel_Zhang 发表于 2021-2-23 02:03:11

自己顶一下这古老的帖子{:10_245:}
页: [1]
查看完整版本: 做一个凯撒加密解密程序