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

news2025/7/19 21:47:45

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.coloradmin.cn/o/2387455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频逐帧提取图片的工具

软件功能:可以将视频逐帧提取图片,可以设置每秒提取多少帧,选择提取图片质量测试环境:Windows 10软件设置:由于软件需要通过FFmpeg提取图片,运行软件前请先设置FFmpeg,具体步骤 1. 请将…

数据结构第1章编程基础 (竟成)

第 1 章 编程基础 1.1 前言 因为数据结构的代码大多采用 C 语言进行描述。而且,408 考试每年都有一道分值为 13 - 15 的编程题,要求使用 C/C 语言编写代码。所以,本书专门用一章来介绍 408 考试所需的 C/C 基础知识。有基础的考生可以快速浏览…

msql的乐观锁和幂等性问题解决方案

目录 1、介绍 2、乐观锁 2.1、核心思想 2.2、实现方式 1. 使用 version 字段(推荐) 2. 使用 timestamp 字段 2.3、如何处理冲突 2.4、乐观锁局限性 3、幂等性 3.1、什么是幂等性 3.2、乐观锁与幂等性的关系 1. 乐观锁如何辅助幂等性&#xf…

理解计算机系统_线程(九):线程安全问题

前言 以<深入理解计算机系统>(以下称“本书”)内容为基础&#xff0c;对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 接续理解计算机系统_线程(八):并行-CSDN博客,内容包括12.7…

vue3基本类型和对象类型的响应式数据

vue3中基本类型和对象类型的响应式数据 OptionsAPI与CompstitionAPI的区别 OptionsAPI Options API • 特点&#xff1a;基于选项&#xff08;options&#xff09;来组织代码&#xff0c;将逻辑按照生命周期、数据、方法等分类。• 结构&#xff1a;代码按照 data 、 methods…

3.8.4 利用RDD实现分组排行榜

本实战任务通过Spark RDD实现学生成绩的分组排行榜。首先&#xff0c;准备包含学生成绩的原始数据文件&#xff0c;并将其上传至HDFS。接着&#xff0c;利用Spark的交互式环境或通过创建Maven项目的方式&#xff0c;读取HDFS中的成绩文件生成RDD。通过map操作将数据映射为二元组…

python web flask专题-Flask入门指南:从安装到核心功能详解

Flask入门指南&#xff1a;从安装到核心功能详解 Flask作为Python最流行的轻量级Web框架之一&#xff0c;以其简洁灵活的特性广受开发者喜爱。本文将带你从零开始学习Flask&#xff0c;涵盖安装配置、项目结构、应用实例、路由系统以及请求响应处理等核心知识点。 1. Flask安…

【HW系列】—web组件漏洞(Strtus2和Apache Log4j2)

本文仅用于技术研究&#xff0c;禁止用于非法用途。 文章目录 Struts2Struts2 框架介绍Struts2 历史漏洞汇总&#xff08;表格&#xff09;Struts2-045 漏洞详解 Log4j2Log4j2 框架介绍Log4j2 漏洞原理1. JNDI 注入2. 利用过程 Log4j2 历史漏洞JNDILDAP 反弹 Shell 流程 Strut…

机器学习知识体系:从“找规律”到“做决策”的全过程解析

你可能听说过“机器学习”&#xff0c;觉得它很神秘&#xff0c;像是让电脑自己学会做事。其实&#xff0c;机器学习的本质很简单&#xff1a;通过数据来自动建立规则&#xff0c;从而完成预测或决策任务。 这篇文章将用通俗的语言为你梳理机器学习的知识体系&#xff0c;帮助…

STM32之FreeRTOS移植(重点)

RTOS的基本概念 实时操作系统&#xff08;Real Time Operating System&#xff09;的简称就叫做RTOS&#xff0c;是指具有实时性、能支持实时控制系统工作的操作系统&#xff0c;RTOS的首要任务就是调度所有可以利用的资源来完成实时控制任务的工作&#xff0c;其次才是提高工…

R语言科研编程-标准偏差柱状图

生成随机数据 在R中&#xff0c;可以使用rnorm()生成正态分布的随机数据&#xff0c;并模拟分组数据。以下代码生成3组&#xff08;A、B、C&#xff09;随机数据&#xff0c;每组包含10个样本&#xff1a; set.seed(123) # 确保可重复性 group_A <- rnorm(10, mean50, sd…

OpenGL Chan视频学习-11 Uniforms in OpenGL

bilibili视频链接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站&#xff1a; docs.gl 说明&#xff1a; 1.之后就不再单独整理网站具体函数了&#xff0c;网站直接翻译…

GitLab 从 17.10 到 18.0.1 的升级指南

本文分享从 GitLab 中文本 17.10.0 升级到 18.0.1 的完整过程。 升级前提 查看当前安装实例的版本。有多种方式可以查看&#xff1a; 方式一&#xff1a; /help页面 可以直接在 /help页面查看当前实例的版本。以极狐GitLab SaaS 为例&#xff0c;在浏览器中输入 https://ji…

产业集群间的专利合作关系

需要准备的文件&#xff1a; 全国的专利表目标集群间的企业名单 根据专利的共同申请人&#xff0c;判断这两家企业之间存在专利合作关系。 利用1_filter_patent.py&#xff0c;从全国的3000多万条专利信息中&#xff0c;筛选出与目标集群企业相关的专利。 只要专利的申请人包…

KT6368A通过蓝牙芯片获取手机时间详细说明,对应串口指令举例

一、功能简介 KT6368A双模蓝牙芯片支持连接手机&#xff0c;获取手机的日期、时间信息&#xff0c;可以同步RTC时钟 1、无需安装任何app&#xff0c;直接使用系统蓝牙即可实现 2、同时它不影响音频蓝牙&#xff0c;还支持一些简单的AT指令进行操作 3、实现的方式&#xff1…

计算机网络实验课(二)——抓取网络数据包,并实现根据条件过滤抓取的以太网帧,分析帧结构

文章目录 一、添加控件二、代码分析2.1 代码2.2 控件初始化2.3 打开和关闭设备2.4 开始和结束捕获2.5 设置捕获条件2.6 捕获数据包 三、运行程序四、结果分析 提要&#xff1a;如果你通过vs打开.sln文件&#xff0c;然后代码界面或者前端界面都没找到&#xff0c;视图里面也没找…

78. Subsets和90. Subsets II

目录 78.子集 方法一、迭代法实现子集枚举 方法二、递归法实现子集枚举 方法三、根据子集元素个数分情况收集 方法四、直接回溯法 90.子集二 方法一、迭代法实现子集枚举 方法二、递归法实现子集枚举 方法三、根据子集元素个数分情况收集 方法四、直接回溯法 78.子集…

ElasticSearch整合SpringBoot

ElasticSearch 整合SpringBoot ES官方提供了各种不同语言的客户端。用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过HTTP请求发送给ES。 设计索引库 跟据数据库的表结构进行ES索引库的创建时。如果字段需要进行倒排索引的时候请为它指定分词器。如果该字段不是…

2025上半年软考高级系统架构设计师经验分享

笔者背景 笔者在成都工作近7年&#xff0c; 一直担任研发大头兵&#xff0c;平日工作主要涵盖应用开发&#xff08;Java&#xff09;与数仓开发&#xff0c;对主流数据库、框架等均有涉猎&#xff0c;但谈不上精通。 最近有一些职业上的想法&#xff0c;了解到软考有那么一丁点…

uni-app学习笔记十二-vue3中创建组件

通过组件&#xff0c;可以很方便地实现页面复用&#xff0c;减少重复页面的创建&#xff0c;减少重复代码。一个页面可以引入多个组件。下面介绍在HBuilder X中创建组件的方法&#xff1a; 一.组件的创建 1.选中项目&#xff0c;右键-->新建目录(文件夹)&#xff0c;并将文…