密码学基础古典密码

2024-04-02 14:44
文章标签 基础 密码 密码学 古典

本文主要是介绍密码学基础古典密码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

古典密码学有两种基本方法,置换密码和替代密码,置换密码指的是,密文和明文的字母是一样的,只是顺序不一样而已,而替代密码指的是,有一张对应的表,将明文中的字符替换成另一个字符。达到生成密文的效果。

替换密码

替换密码有凯撒密码,维吉尼亚密码,佛娜姆密码

置换密码

这里用到列置换密码

凯撒密码就是一个位移,根据给出的秘钥进行位移 下面是一种可能的代码

# 定义一个查询表
def encryption(str, k):result = ""for i in range(len(str)):if str[i].isupper():result += chr((ord(str[i]) + k - 65) % 26 + 65)else:result += chr((ord(str[i]) + k - 97) % 26 + 97)return resultdef decryption(str, k):result = ""for i in range(len(str)):if str[i].isupper():result += chr((ord(str[i]) - k - 65) % 26 + 65)else:result += chr((ord(str[i]) - k - 97) % 26 + 97)return resultif __name__ == '__main__':while True:choice = input("加密or解密 a 加密 b 解密 c 退出\n")if choice == 'a':str = input("需要加密的字符串")k = int(input("加密密钥"))print("加密后的字符串为", encryption(str, k))elif choice == 'b':str = input("需要姐密的字符串")k = int(input("解密密钥"))print("解密后的字符串为", decryption(str, k))elif choice == 'c':breakelse:print("输入错误 重试")continue

接下来是列变换代码

# 古典密码 置换密码 列置换密码
def substitution_cipher_encryption(plaintext, key):# 列的个数n = len(key)# 行的个数 向上取整m = -(-len(plaintext) // n)# 然后生成m 行 n 列的矩阵 python是先写列再写行matrix = [['' for i in range(n)] for j in range(m)]# 明文填入矩阵中 长度不够填充为@for i in range(len(plaintext)):matrix[i // n][i % n] = plaintext[i]for i in range(len(plaintext), m * n):matrix[i // n][i % n] = '@'# 按照秘钥中字符的相对顺序进行读取矩阵列数 比如说  秘钥是 bagc 那么读取顺序是1032key_index = sorted(range(n), key=lambda k: key[k])  # 牛逼 我看不懂 我记得当时写哪个题去了 就是 bagc  他们原本位置是0123 排序后是1032 然后在原来对应数组填充1032# 按读取顺序按列读取矩阵ciphertext = ''for i in key_index:for j in range(m):ciphertext += matrix[j][i]return ciphertext# 解密
def substitution_cipher_decryption(ciphertext, key):n = len(key)m = -(-len(ciphertext) // n)key_index = sorted(range(n), key=lambda k: key[k])# 因为我们这里没有去除空格密文一定是m行n列的 所以我们先成矩阵m行n列matrix = [['' for i in range(n)] for j in range(m)]index = 0# 然后按照秘钥的顺序填充矩阵 比如说秘钥是1032  密文是bfcgdhhaee 因为有m行,所以我们每次将m个字符填充 先将bf 填充到矩阵的第一列 cg填充进第0列 以此类推for i in key_index:for j in range(m):matrix[j][i] = ciphertext[index]index += 1# 然后按照行读取矩阵plaintext = ''for i in range(m):for j in range(n):plaintext += matrix[i][j]# 去除填充的@plaintext = plaintext.replace('@', '')return plaintextif __name__ == '__main__':# 1. 置换密码# 明文# 输入秘钥while (True):choice = input("请输入你的选择:\n1.加密\n2.解密\n 3.退出\n")if choice == '1':plaintext = input("请输入明文:")key = input("请输入秘钥:")# 加密ciphertext = substitution_cipher_encryption(plaintext, key)print("密文为:", ciphertext)continueelif choice == '2':ciphertext = input("请输入密文:")key = input("请输入秘钥:")# 解密plaintext = substitution_cipher_decryption(ciphertext, key)print("明文为:", plaintext)continueelif choice == '3':breakelse:print("输入错误,请重新输入")continue

列变换就是根据给出的秘钥然后进行读取,解密同理

这篇关于密码学基础古典密码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/870261

相关文章

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件