密码学基础古典密码

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

相关文章

零基础学习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类型地址传递函数传递数组 引用函数引用传参返回指针的正确写法函数返回数组

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(