密码学基础古典密码

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

相关文章

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文件

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念