ToB企服应用市场:ToB评测及商务社交产业平台
标题: 古典暗码算法实验 [打印本页]
作者: 数据人与超自然意识 时间: 2024-6-11 08:58
标题: 古典暗码算法实验
一、实验名称
古典暗码算法
二、实验目的及要求
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实现替换暗码和置换暗码的方法。通过编写代码,我深入理解了算法的实现过程和原理,同时也提高了自己的编程能力。
总的来说,本次实验让我对古典暗码算法有了更深入的了解,同时也提高了我的编程能力。在今后的学习和工作中,我将继续学习和把握更多的暗码算法和编程技巧,为保障信息安全做出自己的贡献。
替换暗码:
- # 加密
- def encrypt():
- print("-------------加密过程-------------")
- text = input("请输入明文:")
- s = int(input("请输入秘钥:"))
- result = ""
- # transverse the plain text
- for i in range(len(text)):
- char = text[i]
- # Encrypt uppercase characters in plain text
- if (char.isupper()):
- result += chr((ord(char) + s-65) % 26 + 65)
- # Encrypt lowercase characters in plain text
- else:
- result += chr((ord(char) + s - 97) % 26 + 97)
- print("加密后的结果为:",result)
- print("--------------------------------")
- return result
- # 解密
- def decrypt():
- print("-------------解密过程-------------")
- text = input("请输入密文:")
- s = int(input("请输入秘钥:"))
- result = ""
- # transverse the plain text
- for i in range(len(text)):
- char = text[i]
- # Encrypt uppercase characters in plain text
- if (char.isupper()):
- result += chr((ord(char) - s - 65) % 26 + 65)
- # Encrypt lowercase characters in plain text
- else:
- result += chr((ord(char) - s - 97) % 26 + 97)
- print("解密后的结果为:", result)
- print("--------------------------------")
- return result
- # 主函数
- def main():
- x = input("请选择模式(1.加密 2.解密 3.退出):")
- while True:
- if x == "1":
- encrypt()
- x = input("请选择模式(1.加密 2.解密 3.退出):")
- elif x == "2":
- decrypt()
- x = input("请选择模式(1.加密 2.解密 3.退出):")
- elif x == "3":
- break
- else:
- break
- if __name__ == '__main__':
- main()
复制代码 置换暗码:
- #调用的包
- from copy import deepcopy
- # 处理密钥获取密钥的长度及顺序
- def processSecretKey(s):
- sLength = len(s)
- tempList = []
- for i in range(len(s)):
- char = s[i]
- # tempList存入密钥单词中字母的ascii码值
- tempList.append(ord(char))
- # tempList2用于存储密钥单词每个字母在列表的顺序
- sKey = []
- # sort_tempList用于存储排序后的tempList
- sort_tempList = sorted(tempList)
- for index_,value in enumerate(tempList):
- sKey.append(sort_tempList.index(value)+1)
- return sKey,sLength
- # 加密
- def encrypt():
- print("-------------加密过程-------------")
- text = input("请输入明文:")
- s = str(input("请输入秘钥:"))
- # 除去明文中的空格
- tempList = text.split(" ")
- newText = "".join(tempList)
- # 获取处理后明文的长度
- textLength = len(newText)
- # print("text:",newText)
- # 获取密钥及密钥长度
- sKey,sLength = processSecretKey(s)
- # print(f"sLength:{sLength}")
- # print(f"sKey:{sKey}")
- # 对于长度不够处理后的明文进行补A处理
- while textLength % sLength != 0:
- newText+="X"
- textLength = textLength + 1
- # 更新处理后明文的长度
- textLength = len(newText)
- # print(f"textLength:{textLength}")
- # 根据密钥的长度对明文进行分割
- counter = 1
- temp = []
- tmp = []
- for item_ in newText:
- if (counter % (sLength) != 0):
- tmp.append(item_)
- counter+=1
- elif (counter % (sLength) == 0):
- tmp.append(item_)
- temp.append(tmp)
- tmp=[]
- counter+=1
- print("明文矩阵为:")
- # 根据密钥对明文进行移位
- for item_ in temp:
- print(item_)
- item_copy = deepcopy(item_)
- # print("加密前:",item_)
- for i in range(len(item_)):
- item_[i] = item_copy[sKey[i]-1]
- # print("加密后:",item_)
- # 对移位后的明文进行拼接形成密文
- print("加密后的密文矩阵为:")
- string = ''
- for item_ in temp:
- print(item_)
- string+="".join(item_)
- print("加密后的结果为:", string)
- print("--------------------------------")
- # 解密
- def decrypt():
- print("-------------解密过程-------------")
- text = input("请输入密文:")
- s = str(input("请输入秘钥:"))
- # 获取密钥及密钥长度
- sKey, sLength = processSecretKey(s)
- # print(f"sLength:{sLength}")
- # print(f"sKey:{sKey}")
- # 根据密钥的长度对密文进行分割
- newText = text
- counter = 1
- temp = []
- tmp = []
- for item_ in newText:
- if (counter % (sLength) != 0):
- tmp.append(item_)
- counter += 1
- elif (counter % (sLength) == 0):
- tmp.append(item_)
- temp.append(tmp)
- tmp = []
- counter += 1
- # print(temp)
- print("密文矩阵为:")
- # 根据密钥对密文进行移位复原
- for item_ in temp:
- print(item_)
- item_copy = deepcopy(item_)
- # print("解密前:",item_)
- for i in range(len(item_)):
- item_[sKey[i] - 1] = item_copy[i]
- # print("解密后:",item_)
- # 对移位复原后的密文进行拼接形成明文
- print("解密后的明文矩阵为:")
- string = ''
- for item_ in temp:
- print(item_)
- string += "".join(item_)
- # 除去尾部可能出现的X
- string.strip("X")
- print("解密后的结果为:", string)
- print("--------------------------------")
- def main():
- x = input("请选择模式(1.加密 2.解密 3.退出):")
- while True:
- if x == "1":
- encrypt()
- x = input("请选择模式(1.加密 2.解密 3.退出):")
- elif x == "2":
- decrypt()
- x = input("请选择模式(1.加密 2.解密 3.退出):")
- elif x == "3":
- break
- else:
- break
- if __name__ == '__main__':
- main()
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) |
Powered by Discuz! X3.4 |