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

经典密码学和现代密码学的结构及其主要区别(2)维吉尼亚密码—附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.lryc.cn/news/2387455.html

相关文章:

  • Elasticsearch 节点角色详解及协调节点请求策略
  • 视频逐帧提取图片的工具
  • 数据结构第1章编程基础 (竟成)
  • 互联网大厂Java求职面试:AI大模型与云原生架构融合中的挑战
  • msql的乐观锁和幂等性问题解决方案
  • Python 实现桶排序详解
  • 大模型(5)——编码器(Encoder)、解码器(Decoder)
  • Web3怎么本地测试连接以太坊?
  • Vue-02 (使用不同的 Vue CLI 插件)
  • 理解vue-cli 中进行构建优化
  • 理解计算机系统_线程(九):线程安全问题
  • vue3基本类型和对象类型的响应式数据
  • 3.8.4 利用RDD实现分组排行榜
  • python web flask专题-Flask入门指南:从安装到核心功能详解
  • C语言中的“类框架”工具
  • 【HW系列】—web组件漏洞(Strtus2和Apache Log4j2)
  • 第六十八篇 从“超市收银系统崩溃”看JVM性能监控与故障定位实战
  • Debian 11 之使用hostapd与dnsmasq进行AP设置
  • 有铜半孔的设计规范与材料创新
  • 机器学习知识体系:从“找规律”到“做决策”的全过程解析
  • STM32之FreeRTOS移植(重点)
  • 做好测试用例设计工作的关键是什么?
  • R语言科研编程-标准偏差柱状图
  • 未来教育考试答题软件4.0【自用链接备份】
  • OpenGL Chan视频学习-11 Uniforms in OpenGL
  • Flink系列文章列表
  • GitLab 从 17.10 到 18.0.1 的升级指南
  • 产业集群间的专利合作关系
  • PyQt学习系列02-模型-视图架构与数据管理
  • redis主从复制架构安装与部署