单表替换密码-实验报告

申明:本文用于个人学习记录,若有不足还请各位指点


 要求


从键盘上接收操作,1加密,2解密,0退出,在没有选择退出之前一直可以循环操作。从键盘上接收输入的映射字符串然后给出每一个字母的映射,比如明文A->密文C这种,然后再根据操作输入明文/密文进行加解密,最后输出结果。

如果做了输入映射字符串的校验,比如看看有没有重复的字母是否够26个字母之类的,有加分。


输出范例



代码尝试一:


 参考代码:4.一般单表替代加解密_亡月之莹的博客-CSDN博客_单表代换密码的密钥空间https://blog.csdn.net/weixin_44679038/article/details/106906609

加以修改后:

# 字母表LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
# 替代表REPLACE = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba'
# 加密
def encryption():
    print("您选择了代换加密!")
    message = input("请输入明文:")
    password = ''
    for i in message:
        if i in LETTERS:
            num = LETTERS.find(i)
            password += REPLACE[num]
        else:
            password += i
    print("加密后的结果是:"+password)
# 解密
def decryption():
    print("您选择了代换解密!")
    password = input("请输入密文:")
    message = ''
    for j in password:
        if j in REPLACE:
            num = REPLACE.find(j)
            message += LETTERS[num]
        else:
            message += j
    print("解密后的结果是:"+message)
def main():
    print("******1. 代换加密******")
    print("******2. 代换解密******")
    print("******0. 退出程序******")
    while True:
    choice = int(input("请输入您的选择:"))
    if choice == 1:
         encryption()
    elif choice == 2:
         decryption()
    elif choice == 0:
        print ("您已退出程序!")
        break
    else: print ("您的输入有误!请输入0~2进行选择!")

运行结果:

正常且成功

就是没有完全符合老师要求


 存在问题1


待解决:上述代码运行之后,def main()中的内容没有显示。

将def main()中的内容加到while True 可成功运行显示。但我不懂为什么def main()不行


存在问题2


待解决:明文字母对应密文字母的循环映射不会

对此的参考代码:

a_list = ['name1', 'name2', 'name3']
b_list = [54, 18, 34]
for a, b in zip(a_list, b_list):
    print(a, ':', b)

输出结果为:

 依葫芦画瓢尝试:

def miyao():

    alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    replace = ''
    replace=input("请输入密钥:")
    for alphabet, replace in zip(alphabet, replace):
        print('明文字母',alphabet, '->密文字母', replace)

完整代码如下:

# 字母表 LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
# 替代表 REPLACE = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba'


alphabet = ''
replace = ''

def miyao():

    alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
   # replace = '' 这个有没有都不影响代码运行。。
    replace=input("请输入密钥:")
    for alphabet, replace in zip(alphabet, replace):
        print('明文字母',alphabet, '->密文字母', replace)


# 加密
def encryption():
    print("您选择了代换加密!")
    mingwen = input("请输入明文:")
    miwen = ''
    miyao()
    for i in mingwen:
        if i in alphabet:
            num = alphabet.find(i)
            miwen += replace[num]
        else:
            miwen += i
    print("加密后的结果是:"+miwen)

# 解密
def decryption():
    print("您选择了代换解密!")
    miwen = input("请输入密文:")
    mingwen = ''
    miyao()
    for j in miwen:
        if j in replace:
            num = replace.find(j)
            mingwen += alphabet[num]
        else:
            mingwen += j
    print("解密后的结果是:"+mingwen)

    
while True:
    print("******1. 代换加密******")
    print("******2. 代换解密******")
    print("******0. 退出程序******")
    choice = int(input("请输入您的选择:"))
    if choice == 1: 
        encryption()
    elif choice == 2: 
        decryption()
    elif choice == 0:
        print ("您已退出程序!")
        break
    else: print ("您的输入有误!请输入0~2进行选择!")

运行结果(加解密不对)


存在问题3


待解决

加密和解密的结果一致!怎么回事!之前都不会这样!加了个miyao()咋就这样了呢 

如果我省略了题头的

 

 会报错:

 

 加上两个之后,运行仍然出错:

 当我改成了这样

可以成功运行,但是加解密结果是一样的o(╥﹏╥)o 

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
凯撒密码(caeser)是罗马扩张时期朱利斯•凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。 古罗马随笔作家修托尼厄斯在他的作品中披露,凯撒常用一种“密表”给他的朋友写信。这里所说的密表,在密码学上称为“凯撒密表”。用现代的眼光看,凯撒密表是一种相当简单的加密变换,就是把明文中的每一个字母用它在字母表上位置后面的第三个字母代替。古罗马文字就是现在所称的拉丁文,其字母就是我们从英语中熟知的那26个拉丁字母。因此,凯撒密表就是用d代a,用e代b,……,用z代w。这些代替规则也可用一张表格来表示,所以叫“密表”。 基本原理 在密码学中存在着各种各样的置换方式,但所有不同的置换方式都包含2个相同的元素。密钥和协议(算法)。凯撒密码的密钥是3,算法是将普通字母表中的字母用密钥对应的字母替换。置换加密的优点就在于它易于实施却难于破解. 发送方和接收方很容易事先商量好一个密钥,然后通过密钥从明文中生成密文,即是敌人若获取密文,通过密文直接猜测其代表的意义,在实践中是不可能的。 凯撒密码的加密算法极其简单。其加解密过程如下: 加密解密算法 凯撒密码替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左或向右移动一个固定数目的位置。例如,当偏移量是左移3的时候(解密时的密钥就是3): 明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC 使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。例如: 明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ 凯撒密码的加密、解密方法还能够通过同余数的数学方法进行计算。首先将字母用数字代替,A=0,B=1,...,Z=25。此时偏移量为n的加密方法即为: E (x)= (x+n) mod 26 解密就是: D (x)= (x-n) mod 26
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> <script type="text/javascript" src="script/jquery-1.8.1.min.js"></script> </head> <body> <p title="选择你最喜欢的水果。">你最喜欢的水果是?</p> <ul> <li title="苹果">苹果</li> <li title="橘子">橘子</li> <li title="菠萝">菠萝</li> </ul> </body> <script type="text/javascript"> //这里输入替换的代码 </script> </html> var $li=$("ul li:eq(1)"); var li_txt=$li.text(); alert(li_txt); var $para=$("p"); var p_txt=$para.attr("title"); alert(p_txt); var $li_1=$("<li>香蕉</li>"); var $li_2=$("<li>雪梨</li>"); $("ul").append($li_1); $("ul").append($li_2); var $li_1=$("<li title='香蕉'>香蕉</li>"); var $li_2=$("<li title='雪梨'>雪梨</li>"); var $li_3=$("<li title='其它'>其它</li>"); var $parent=$("ul"); var $two_li=$("ul li:eq(1)"); $parent.append($li_1); $parent.prepend($li_2); $li_3.insertAfter($two_li); var $one_li=$("ul li:eq(1)"); var $two_li=$("ul li:eq(2)"); $two_li.insertBefore($one_li); $("ul li:eq(1)").appendTo("ul"); $("ul li").remove("li[title!=菠萝]"); $("ul li:eq(1)").empty(); $("ul li").click(function(){ $(this).clone().appendTo("ul"); }) $("p").replaceWith("<strong>你最喜欢的水果是</strong>"); 将<p>元素的HTML代码改成 <p title="选择你最喜欢的水果。"><strong>你最喜欢的水果是?</strong></p> var p_html=$("p").html(); alert(p_html) var p_text=$("p").text(); alert(p_text) <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <script src="script/jquery-1.8.1.min.js" type="text/javascript"></script> </head> <body> <input type="text" id="address" value="请输入邮箱地址"/><br><br> <input type="text" id="password" value="请输入邮箱密码"/><br><br> <input type="button" value="登录"/> </body> <script> $(function(){ //对地址框进行操作 $("#address").focus(function(){ var txt_value=$(this).val(); if(txt_value=="请输入邮箱地址"){ $(this).val(""); } }); $("#address").blur(function(){ var txt_value=$(this).val(); if(txt_value=="
燕山大学 Linux技术上机实验指导 实验一 Linux系统安装与简单配置 一、实验目的 1.掌握Linux系统安装的分区准备。 2.掌握Linux系统的安装步骤。 3.掌握Linux系统分区的挂载和卸载。 4.掌握Linux系统的启动和关闭操作。 二、实验内容 1.安装VMware虚拟机,设置光盘驱动器,为Linux系统安装做准备。 2.在虚拟机下安装Linux操作系统(如Ubuntu桌面版本)。 3.配置Linux系统运行环境。 4.利用空闲分区创建新的Linux系统分区。 5.将新的Linux系统分区挂载到系统中;卸载新挂载的分区,重新挂载到目录树中的其 他位置。 三、主要的实验步骤 1.制定安装系统的分区计划。 2.配置光驱引导镜像文件iso,启动系统,开始安装过程。 3.根据安装计划,对磁盘空间进行分区设置。 4.根据系统安装指导,完成Linux系统的安装过程。 5.安装成功后,退出系统,重新启动虚拟机,登陆Linux操作系统。 6.对Linux系统进行配置,如网络设备等。 7.利用磁盘使用工具和mount,将新创建的Linux系统分区挂载到系统中。将新挂载的分 区卸载,并重新挂载到目录树的其他位置。 实验二 Linux常用命令使用 一、实验目的 1.掌握Linux一般命令格式。 2.掌握有关文件和目录操作的常用命令。 3.熟练使用man命令。 二、实验内容 1.熟悉cd、date、pwd、cal、who、echo、clear、passwd等常用命令。 2.在用户主目录下对文件进行操作:复制一个文件、显示文件内容、查找指定内容、排 序、文件比较、文件删除等。 3.对目录进行管理:创建和删除子目录、改变和显示工作目录、列出和更改文件权限、 链接文件等。 4.利用man命令显示date、echo等命令的手册页。 5.显示系统中的进程信息。 三、主要实验步骤 1.登陆进入系统,修改个人密码。 使用简单命令:date、cal、who、echo、clear等,了解Linux命令格式。 Date: Cal: Who、who am i: Echo: Clear: 3.浏览文件系统; 1) 运行pwd命令,确定当前工作目录。 2) 运行ls –l命令,理解各字段含义。 3) 运行ls –ai命令,理解各字段含义。 4) 使用cd命令,将工作目录改到根(/)上。运行ls –l命令,结合教材中图2.2,了解各个目录的作用。 5) 直接使用cd,通过pwd指令验证目录位置。 6) 用mkdir建立一个子目录subdir。 7) 将工作目录更改到subdir。 4.文件操作: 1) 验证当前工作目录在subdir。 2) 运行date>file1,然后运行cat file1,看到什么信息? 3) 运行cat subdir,会出现什么结果?为什么? 4) 利用man命令显示date命令的使用说明。 5) 运行man date>>file1,看到什么信息?运行cat file1,看到什么信息? 6) 利用ls –l file1,了解链接计数是多少?运行ln file1 ../fa,再看看链接计数有什么变化?用cat命令显示fa文件内容。 7) 显示file1的当前10行,后19行。 8) 运行cp file1 file2,然后ls –l,看到什么信息?运行mv file2 file3,然后ls –l,看到什么信息?运行cat f*,结果如何? 9) 运行rm file3,然后ls –l,结果如何? 10) 在/etc/passwd文件中查找合适你的注册名的行。 11) 运行ls –l,理解各文件的权限是什么? 12) 用两种方式改变file1的权限。 13) 统计file1文件的行数、字数。 14) 运行 man ls"more,显示结果是什么?运行cat file1"head -20"teefile5,结果如何?运行cat file5"wc,结果如何? 实验三 vi编辑器的使用 一、实验目的 1.学习使用vi编辑器建立、编辑、显示及加工处理文本文件。 二、实验内容 1.进入和推出vi编辑器。 2.利用文本插入方式建立一个文件。 3.在新建的文本文件上移动光标位置。 4.对该文件执行删除、复原、修改、替换等操作。 三、主要实验步骤 1.进入vi编辑器。 建立一个文件,如file.c。进入插入方式,输入一个C语言程序的各行内容,故意制造几 处错误。最后,将该文件存盘。回到shell状态下。 运行gcc file.c –o myfile,编译该文件,会发现错误提示。理解其含义。 重新进入vi编辑器,对该文件进行修改。然后存盘,退出vi编辑器。重新编译该文件, 如果编译通过了,可以利用./myfile运行该程序。 运行man date > file1
单表置换密码是一种简单的加密方法,它通过将明文中的每个字母替换为另一个字母来实现加密。这个加密过程需要一个密钥,即替换表。在这个替换表中,每个字母都对应着另一个字母。下面是一个使用C#实现的单表置换密码加密程序: ``` using System; class Program { static void Main(string[] args) { string plaintext = "hello world"; string key = "qwertyuiopasdfghjklzxcvbnm"; // 替换表 string ciphertext = Encrypt(plaintext, key); Console.WriteLine(ciphertext); string decryptedText = Decrypt(ciphertext, key); Console.WriteLine(decryptedText); } static string Encrypt(string plaintext, string key) { string ciphertext = ""; foreach (char c in plaintext) { if (Char.IsLetter(c)) { int index = Char.ToLower(c) - 'a'; if (index >= 0 && index < key.Length) { char encryptedChar = key[index]; if (Char.IsUpper(c)) encryptedChar = Char.ToUpper(encryptedChar); ciphertext += encryptedChar; } } else { ciphertext += c; } } return ciphertext; } static string Decrypt(string ciphertext, string key) { string plaintext = ""; foreach (char c in ciphertext) { if (Char.IsLetter(c)) { int index = key.IndexOf(Char.ToLower(c)); if (index >= 0 && index < 26) { char decryptedChar = (char)('a' + index); if (Char.IsUpper(c)) decryptedChar = Char.ToUpper(decryptedChar); plaintext += decryptedChar; } } else { plaintext += c; } } return plaintext; } } ``` 在这个程序中,我们定义了一个替换表key,然后使用Encrypt方法将明文plaintext加密成密文ciphertext。在加密过程中,我们遍历明文的每个字符,如果它是一个字母,我们就查找它在替换表中的位置,并将其替换替换表中对应的字母。最后,我们返回加密后的密文。 在Decrypt方法中,我们将密文解密为明文。在解密过程中,我们遍历密文的每个字符,如果它是一个字母,我们就查找它在替换表中的位置,并将其替换替换表中对应的原字母。最后,我们返回解密后的明文。 请注意,这个加密方法并不安全,因为替换表可以轻松地被破解。在实际应用中,我们需要使用更加安全的加密方法来保护数据的安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值