当前位置: 首页 > backend >正文

经典密码学和现代密码学的结构及其主要区别(1)维吉尼亚密码—附py代码

Vigenère cipher 维吉尼亚密码

维吉尼亚密码由布莱斯·德·维吉尼亚在 16 世纪发明,是凯撒密码的一个更复杂的扩展。它是一种多字母替换密码,使用一个关键字来确定明文中不同字母的多个移位值。

与凯撒密码不同,凯撒密码对所有字母都有固定的偏移量,而维吉尼亚密码使用一个重复的关键词为消息中的每个字母创建不同的偏移量。这使其更能抵御频率分析,但如果消息的一部分已知,它仍然容易受到已知明文攻击。维吉尼亚密码曾被认为相当安全,但用现代密码分析技术可以破解。

凯撒密码和维吉尼亚密码都是早期加密方法的历史实例。虽然它们易于理解,并在密码学史上发挥了重要作用,但它们缺乏现代加密应用所需的强大安全性,不适合保护敏感的数字信息。

维吉尼亚密码的主要特点

  • 密钥。维吉尼亚密码使用一个关键字或短语作为加密和解密消息的密钥。关键字可以是任意长度,并通常重复以匹配明文的长度。
  • 多字母表密码。与凯撒密码不同,凯撒密码对所有字符使用固定的移位值,维吉尼亚密码采用多字母表的方法。这意味着消息的不同部分可能会有不同的移位量,使其更复杂且更安全。
  • 字母表。为了执行加密和解密,使用维吉尼亚表(也称为维吉尼亚方阵或正方形表)。该表由多个字母表的行和列组成,每行代表不同的凯撒密码移位。

• 加密过程

  1. 要加密一条消息,您需要将明文和关键词对齐。
  2. 对于明文中的每个字母,您都要在维吉尼亚密码表中找到由密钥中相应字母所确定的行。
  3. 然后找到与你想要加密的明文字母相对应的那一列。
  4. 行与列的交叉点即为密文字母。
  5. 对明文中的每个字母重复此过程。

• 解密过程

  1. 用维吉尼亚密码进行解密的过程与加密正好相反。
  2. 将密文与关键词对齐,就像加密时那样。
  3. 对于密文中的每个字母,根据关键字中的相应字母在维吉尼亚密码表中找到对应的行。
  4. 找到包含密文字母的那一列。
  5. 行与列的交叉点给出的就是明文字母。
  6. 对密文中的每个字母都重复此过程。

维吉尼亚密码比简单的凯撒密码更安全,因为它通过密钥引入了变化性。这使得频率分析和暴力破解攻击更具挑战性。但维吉尼亚密码的安全性仍然有限,尤其是在使用较短密钥时。较长的密钥能提高安全性。它容易受到卡西斯基检验的攻击,一种能够帮助识别密文中重复模式的技术,并有可能揭示有关密钥长度的信息。

🔹🔹🔹

假设有 m = 7 ,且关键字为 PHYSICS。对应于数值等价 K = (8, 0, 17, 11, 1, 21, 11)。

C i = ( M i + K i m o d m ) m o d 26 C_i = (M_i + K_{i \mod m}) \mod 26 Ci=(Mi+Kimodm)mod26 其中 M i M_i Mi为明文字母数值(A=0), K j K_j Kj为密钥字母数值, m m m为密钥长度。

  • m m m:密钥长度(此处 m = 7 )
  • M i M_i Mi:明文中第 i 个字符的数值( a=0, b=1,…, z=25 )
  • K j K_j Kj:密钥中第j个字符的数值( j = i mod m )
  • C i C_i Ci:密文中第i个字符的数值

在这里插入图片描述
密文结果为:uaitvntclzlohtpazwfnncpyjtdnabfzl

解密时将使用相同的关键字,但要从密文中减去它,而不是加上它。

例如:

明文 m(索引: i = 0 ):

C i C_i Ci = (12 + 8) mod 26 = 20

密文是: u

py代码示例(仅供参考):

plaintext = "mariusiulianmihailescuphysicsbook"
key = [8, 0, 17, 11, 1, 21, 11]
ciphertext = []for i, char in enumerate(plaintext):# 将明文字符转换为0-25的数值p = ord(char) - ord('a')# 获取对应的密钥k = key[i % 7]# 加密并转换回字符encrypted_char = chr((p + k) % 26 + ord('a'))ciphertext.append(encrypted_char)# 将密文字符列表转换为字符串
ciphertext_str = ''.join(ciphertext)
print(ciphertext_str)

运行结果:
在这里插入图片描述

http://www.xdnf.cn/news/8541.html

相关文章:

  • 模拟交易新维度:如何通过自营交易考试实现策略收益双提升?
  • PTA L1系列题解(C语言)(L1_105 -- L1_112)
  • OCC导入进度显示
  • Makefile快速入门
  • 直播预告 | 共探“数字化转型新引擎”,蓝卓工业互联网+AI对话夜等你来
  • 数字计数--数位dp
  • C 语言学习笔记(指针4)
  • golang 垃圾收集机制
  • 防火墙NAT地址组NAT策略安全策略
  • 50 python Matplotlib之Seaborn
  • Python爬虫实战:研究Cola框架相关技术
  • 开发工具整理
  • Python初始Flask框架
  • 敦煌网测评从环境搭建到风控应对,精细化运营打造安全测评体系
  • 【自定义类型-结构体】--结构体类型,结构体变量的创建和初始化,结构体内存对齐,结构体传参,结构体实现位段
  • ComfyUI Chroma解锁文生图新维度;OpenMathReasoning数学推理数据集,首个专注数学推理的高质量数据集
  • 深入探索 CSS 中的伪类:从基础到实战​
  • 文件目录名称无效?数据恢复全流程与常见问题解析
  • CMA/CNAS认证电子签章审计追踪 质检 LIMS 系统应用要点
  • 电子电路:什么是滤波器,什么优势高通滤波器?
  • Cookie、Session、JWT
  • 吃出 “颈” 松:痉挛性斜颈的饮食调养之道
  • Redis从入门到实战 - 原理篇
  • lua脚本实战—— Redis并发原子性陷阱
  • I-CON: A UNIFYING FRAMEWORK FOR REPRESENTATION LEARNING
  • 从Android开发聊技术
  • Python打卡5.23(day24)
  • 【和春笋一起学C++】(十五)字符串作为函数参数
  • 快速开发平台如何选择?技术选型避坑指南与实践洞察
  • el-select中自定义 两组el-option,但是key不一样,并且点击需获取当前整个项的所有属性