古典暗码算法实验

打印 上一主题 下一主题

主题 905|帖子 905|积分 2715

实验名称

  
古典暗码算法

  
、实验目的及要求

  
1.实验目的:

  
通过编程实现替换暗码算法和置换暗码算法,加深对古典暗码体制的了解。

  
2.实验要求:

  
根据实验内容完成任务,暗码算法的加密和解密过程,要求加密过程的明文和密钥、解密过程的密文和密钥由用户手动任意输入,并且以包含本人姓名的字符串作为明文输入,凯撒暗码的密钥数字为本人学号的后两位,矩阵换位暗码的密钥为下一学号学生的姓名去重复全凭,分别演示加密算法和解密算法的执行结果。 

  
、实验环境

  
Windows10,Pycharm

  四、实验设计
  内容要求:
  

  • 实验原理与内容
  
古典暗码算法曾被广泛应用, 大都比较简单, 利用手工和机械操作来实现加密和解密。

  
(1)替换暗码

  
替换暗码算法的原理是利用替换法进行加密,就是对明文中的字符用其他字符替换后形 成密文。比方, 明文字母 a, b, c, d,  用 d, e, f , g 做对应替换后形成密文。

  
替换暗码包括多种类型, 如单表替换暗码,多表替换暗码,多字母替换暗码等。 试编程 实现一种典型的单表替换暗码—凯撒(Caesar) 暗码。它的加密方法是将明文中的每个字母 用此字符在字母表中背面的第 k 个字母替换。它的加密过程可以表示为下面的函数:

  
E(k)=(m+k)modn

  
其中, m 为明文字母在字母表中的位置数,n 为字母表中的字母个数, k 为密钥, E(k) 为密文字母在字母表中对应的位置数。

  
解密过程类推。

  
(2)置换暗码

  
置换暗码算法的原理是不改变明文字符, 只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换暗码也叫换位暗码。

  
试编程实现矩阵换位暗码。它的加密方法是将明文中的字母按照给定的顺序安排在一个 矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,形成密文。比方,明文为 attack begins at five,密钥为 cipher,将明文按照每行 6 个字母的形式排在矩阵中, 如下形式:

  
a      t     t      a     c      k

  
b      e     g      i     n      s

  
a      t     f      i     v      e

  
根据密钥 cipher 中各字母在字母表中出现的先后顺序,给定一个置换:

  

  
根据上面的置换,将原有矩阵中的字母按照第 1 、4、5 、3、2、6 的顺序排列,则有下

列形式:

a      a      c      t     t      k

b      i      n      g      e      s

a      i      v      f     t      e

从而得到密文: aacttkbingesaivfte

解密过程类推。


  • 实验步调
(1)根据实验原理部分对替换暗码算法的先容,自己创建明文信息,并选择一个密钥k,编写替换暗码算法的实现步调,实现加密和解密操作。 

(2)根据实验原理部分对置换暗码算法的先容,自己创建明文信息,并选择一个密钥,编写置换暗码算法的实现步调,实现加密和解密操作。

3实验结果

  (1)替换暗码

加密:


 

解密:


 
置换暗码:

加密:


 


解密:


 

4、实验总结

通过本次实验,把握了古典暗码算法的根本原理,在本次实验中,我们学习了替换暗码和置换暗码两种古典暗码算法,并进行了加密和解密的实验。
通过本次实验,我了解到古典暗码算法的根本原理和加密过程。凯撒暗码是一种简单的替换暗码,通过将明文中的每个字母按照肯定的偏移量进行替换,得到密文。而置换暗码则是将明文中的每个字母先辈行一次线性变更,再进行一次替换,得到密文。这两种算法都有肯定的安全性,但是随着计算机技术的发展,它们的安全性已经被攻击者所破解。
在实验中,我还学习了Python语言的根本语法和编程技巧,把握了Python实现替换暗码和置换暗码的方法。通过编写代码,我深入理解了算法的实现过程和原理,同时也提高了自己的编程能力。
总的来说,本次实验让我对古典暗码算法有了更深入的了解,同时也提高了我的编程能力。在今后的学习和工作中,我将继续学习和把握更多的暗码算法和编程技巧,为保障信息安全做出自己的贡献。

替换暗码:

  1. # 加密
  2. def encrypt():
  3.     print("-------------加密过程-------------")
  4.     text = input("请输入明文:")
  5.     s = int(input("请输入秘钥:"))
  6.     result = ""
  7.     # transverse the plain text
  8.     for i in range(len(text)):
  9.         char = text[i]
  10.         # Encrypt uppercase characters in plain text
  11.         if (char.isupper()):
  12.             result += chr((ord(char) + s-65) % 26 + 65)
  13.         # Encrypt lowercase characters in plain text
  14.         else:
  15.             result += chr((ord(char) + s - 97) % 26 + 97)
  16.     print("加密后的结果为:",result)
  17.     print("--------------------------------")
  18.     return result
  19. # 解密
  20. def decrypt():
  21.     print("-------------解密过程-------------")
  22.     text = input("请输入密文:")
  23.     s = int(input("请输入秘钥:"))
  24.     result = ""
  25.     # transverse the plain text
  26.     for i in range(len(text)):
  27.         char = text[i]
  28.         # Encrypt uppercase characters in plain text
  29.         if (char.isupper()):
  30.             result += chr((ord(char) - s - 65) % 26 + 65)
  31.         # Encrypt lowercase characters in plain text
  32.         else:
  33.             result += chr((ord(char) - s - 97) % 26 + 97)
  34.     print("解密后的结果为:", result)
  35.     print("--------------------------------")
  36.     return result
  37. # 主函数
  38. def main():
  39.     x = input("请选择模式(1.加密 2.解密 3.退出):")
  40.     while True:
  41.         if x == "1":
  42.             encrypt()
  43.             x = input("请选择模式(1.加密 2.解密 3.退出):")
  44.         elif x == "2":
  45.             decrypt()
  46.             x = input("请选择模式(1.加密 2.解密 3.退出):")
  47.         elif x == "3":
  48.             break
  49.         else:
  50.             break
  51. if __name__ == '__main__':
  52.     main()
复制代码
置换暗码:
  1. #调用的包
  2. from copy import deepcopy
  3. # 处理密钥获取密钥的长度及顺序
  4. def processSecretKey(s):
  5.     sLength = len(s)
  6.     tempList = []
  7.     for i in range(len(s)):
  8.         char = s[i]
  9.         # tempList存入密钥单词中字母的ascii码值
  10.         tempList.append(ord(char))
  11.     # tempList2用于存储密钥单词每个字母在列表的顺序
  12.     sKey = []
  13.     # sort_tempList用于存储排序后的tempList
  14.     sort_tempList = sorted(tempList)
  15.     for index_,value in enumerate(tempList):
  16.         sKey.append(sort_tempList.index(value)+1)
  17.     return sKey,sLength
  18. # 加密
  19. def encrypt():
  20.     print("-------------加密过程-------------")
  21.     text = input("请输入明文:")
  22.     s = str(input("请输入秘钥:"))
  23.     # 除去明文中的空格
  24.     tempList = text.split(" ")
  25.     newText = "".join(tempList)
  26.     # 获取处理后明文的长度
  27.     textLength = len(newText)
  28.     # print("text:",newText)
  29.     # 获取密钥及密钥长度
  30.     sKey,sLength = processSecretKey(s)
  31.     # print(f"sLength:{sLength}")
  32.     # print(f"sKey:{sKey}")
  33.     # 对于长度不够处理后的明文进行补A处理
  34.     while textLength % sLength != 0:
  35.         newText+="X"
  36.         textLength = textLength + 1
  37.     # 更新处理后明文的长度
  38.     textLength = len(newText)
  39.     # print(f"textLength:{textLength}")
  40.     # 根据密钥的长度对明文进行分割
  41.     counter = 1
  42.     temp = []
  43.     tmp = []
  44.     for item_ in newText:
  45.         if  (counter % (sLength) != 0):
  46.             tmp.append(item_)
  47.             counter+=1
  48.         elif  (counter % (sLength) == 0):
  49.             tmp.append(item_)
  50.             temp.append(tmp)
  51.             tmp=[]
  52.             counter+=1
  53.     print("明文矩阵为:")
  54.     # 根据密钥对明文进行移位
  55.     for item_ in temp:
  56.         print(item_)
  57.         item_copy = deepcopy(item_)
  58.         # print("加密前:",item_)
  59.         for i in range(len(item_)):
  60.             item_[i] = item_copy[sKey[i]-1]
  61.         # print("加密后:",item_)
  62.     # 对移位后的明文进行拼接形成密文
  63.     print("加密后的密文矩阵为:")
  64.     string = ''
  65.     for item_ in temp:
  66.         print(item_)
  67.         string+="".join(item_)
  68.     print("加密后的结果为:", string)
  69.     print("--------------------------------")
  70. # 解密
  71. def decrypt():
  72.     print("-------------解密过程-------------")
  73.     text = input("请输入密文:")
  74.     s = str(input("请输入秘钥:"))
  75.     # 获取密钥及密钥长度
  76.     sKey, sLength = processSecretKey(s)
  77.     # print(f"sLength:{sLength}")
  78.     # print(f"sKey:{sKey}")
  79.     # 根据密钥的长度对密文进行分割
  80.     newText = text
  81.     counter = 1
  82.     temp = []
  83.     tmp = []
  84.     for item_ in newText:
  85.         if (counter % (sLength) != 0):
  86.             tmp.append(item_)
  87.             counter += 1
  88.         elif (counter % (sLength) == 0):
  89.             tmp.append(item_)
  90.             temp.append(tmp)
  91.             tmp = []
  92.             counter += 1
  93.     # print(temp)
  94.     print("密文矩阵为:")
  95.     # 根据密钥对密文进行移位复原
  96.     for item_ in temp:
  97.         print(item_)
  98.         item_copy = deepcopy(item_)
  99.         # print("解密前:",item_)
  100.         for i in range(len(item_)):
  101.             item_[sKey[i] - 1] = item_copy[i]
  102.         # print("解密后:",item_)
  103.     # 对移位复原后的密文进行拼接形成明文
  104.     print("解密后的明文矩阵为:")
  105.     string = ''
  106.     for item_ in temp:
  107.         print(item_)
  108.         string += "".join(item_)
  109.     #  除去尾部可能出现的X
  110.     string.strip("X")
  111.     print("解密后的结果为:", string)
  112.     print("--------------------------------")
  113. def main():
  114.     x = input("请选择模式(1.加密 2.解密 3.退出):")
  115.     while True:
  116.         if x == "1":
  117.             encrypt()
  118.             x = input("请选择模式(1.加密 2.解密 3.退出):")
  119.         elif x == "2":
  120.             decrypt()
  121.             x = input("请选择模式(1.加密 2.解密 3.退出):")
  122.         elif x == "3":
  123.             break
  124.         else:
  125.             break
  126. if __name__ == '__main__':
  127.     main()
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

数据人与超自然意识

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表