密码学基础古典密码

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

相关文章

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的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

c++基础版

c++基础版 Windows环境搭建第一个C++程序c++程序运行原理注释常亮字面常亮符号常亮 变量数据类型整型实型常量类型确定char类型字符串布尔类型 控制台输入随机数产生枚举定义数组数组便利 指针基础野指针空指针指针运算动态内存分配 结构体结构体默认值结构体数组结构体指针结构体指针数组函数无返回值函数和void类型地址传递函数传递数组 引用函数引用传参返回指针的正确写法函数返回数组