揭秘《庆余年算法番外篇》:范闲如何使用维吉尼亚密码解密二皇子密信

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!

  • 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注
    在这里插入图片描述

  • 导航

    • LeetCode解锁1000题: 打怪升级之旅:每题都包括3-5种算法,以及详细的代码实现,刷题面试跳槽必备
    • 漫画版算法详解:通过漫画的形式和动态GIF图片把复杂的算法每一步进行详细可视解读,看一遍就掌握
    • python源码解读:解读python的源代码与调用关系,快速提升代码质量
    • python数据分析可视化:企业实战案例:企业级数据分析案例与可视化,提升数据分析思维和可视化能力
    • 程序员必备的数学知识与应用:全面详细的介绍了工程师都必备的数学知识

期待与您一起探索技术、持续学习、一步步打怪升级 欢迎订阅本专栏❤️❤️

背景设定

在《庆余年》中,范闲不仅要面对复杂的政治斗争,还要应对各种阴谋和背叛。在某一集中,范闲截获了一封由二皇子发出的密文。密文中只有一串汉字,通过解密可以揭示重要情报。范闲需要利用维吉尼亚密码解密这封密文,从而揭露二皇子的阴谋。

场景描述

在这里插入图片描述

范闲在一个隐秘的地点,收到了一封由二皇子发出的密文。信中包含的密文是:

金 达 达 皇 皇 子 子

范闲知道,这些汉字是通过一种密码加密的,需要找到密钥才能解密出明文。

解密过程:使用维吉尼亚密码

维吉尼亚密码是一种经典的多表代替密码,通过使用一个密钥,将明文中的每个字符与密钥对应字符进行位移加密,生成密文。解密时则使用相同的密钥,将密文字母逆向位移还原为明文。

维吉尼亚密码的基本原理
  1. 密钥:维吉尼亚密码使用一个重复的密钥对明文进行加密。
  2. 加密过程:每个明文字母通过与密钥字母的位移相结合生成密文。
  3. 解密过程:解密时,需要使用相同的密钥,将密文字母逆向位移还原为明文。
    在这里插入图片描述

解密步骤

  1. 准备密文和密钥

    • 密文: 金 达 达 皇 皇 子 子
    • 密钥: 秘 密
  2. 将汉字转换为数字

    • 使用一个简单的映射,将汉字转换为数字:
      • -> 1, -> 2, -> 3, -> 4, -> 5, -> 6, -> 7
      • -> 1, -> 2
  3. 将密钥转换为数字

    • -> 1, -> 2
  4. 解密公式

    • 给定密文字符 ( C ) 和密钥字符 ( K ),明文字符 ( P ) 的计算公式如下:
      [ P = (C - K + N) \mod N ]
    • 其中 ( N ) 是汉字表的大小,这里假设 ( N = 7 )。

解密计算

我们假设汉字的映射为:

黄 -> 1
金 -> 2
送 -> 3
达 -> 4
二 -> 5
皇 -> 6
子 -> 7
秘 -> 1
密 -> 2

按照维吉尼亚密码的解密规则进行计算:

(2) - 秘 (1) = 1 -> 黄
达 (4) - 密 (2) = 2 -> 金
达 (4) - 秘 (1) = 3 -> 送
皇 (6) - 密 (2) = 4 -> 达
皇 (6) - 秘 (1) = 5 -> 二
子 (7) - 密 (2) = 5 -> 二
子 (7) - 秘 (1) = 6 ->

结果是:

密文:  金 达 达 皇 皇 子 子
密钥:  秘 密 秘 密 秘 密 秘
明文:  黄 金 送 达 二 二 皇

Python实现

以下是用Python代码实现的过程:

def vigenere_decrypt_chinese(cipher_text, key):
    # 汉字到数字的映射
    char_to_num = {
        '黄': 1, '金': 2, '送': 3, '达': 4, '二': 5, '皇': 6, '子': 7,
        '秘': 1, '密': 2
    }
    # 数字到汉字的映射
    num_to_char = {v: k for k, v in char_to_num.items()}

    decrypted_text = []
    key_length = len(key)
    
    for i, char in enumerate(cipher_text):
        if char in char_to_num:
            # 计算密文字母和密钥字母的偏移
            c = char_to_num[char]
            k = char_to_num[key[i % key_length]]
            # 解密公式
            p = (c - k + 7) % 7
            p = 7 if p == 0 else p  # 如果模运算结果是0,取7
            decrypted_text.append(num_to_char[p])
        else:
            decrypted_text.append(char)
    
    return ''.join(decrypted_text)

# 示例
cipher_text = "金达达皇皇子子"
key = "秘密"

decrypted_text = vigenere_decrypt_chinese(cipher_text, key)
print("解密后的明文:", decrypted_text)

场景细节

  1. 范闲收到密文:范闲在书房中仔细阅读密文,密文内容是“金达达皇皇子子”。
  2. 范闲识别密钥:范闲知道二皇子惯用的密钥是“秘密”。
  3. 范闲使用维吉尼亚密码进行解密:范闲使用密钥“秘密”对密文进行解密。
  4. 解密后的明文:通过维吉尼亚密码解密,范闲得到了明文“黄金送达二皇子”。

总结

本故事纯属虚构,如有雷同,纯属胡编乱造。通过这个具体场景,我们展示了如何使用维吉尼亚密码解密“金达达皇皇子子”,并将其转换为明文“黄金送达二皇子”。这种加密和解密过程使得原文更加复杂,增加了破解难度。在《庆余年》的场景中,范闲可以通过破解维吉尼亚密码解密出二皇子的阴谋。这个例子不仅增强了故事的紧张感和趣味性,也让读者更好地理解经典密码学算法在实际中的应用。希望这些详细的步骤和算法展示能够帮助读者更好地理解和应用这些技术。

🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)

❤️❤️关注公众号 数据分析螺丝钉 回复 学习资料 领取高价值免费学习资料❥(^_-)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/644837.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有趣的css - 加减动态多选框

大家好,我是 Just,这里是「设计师工作日常」,今天分享的是用 css 实现一个适用树形菜单场景的加减动态多选框。 最新文章通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面…

SQL SERVER 我没有消失,SQL SERVER下一个版本是2025 (功能领先大多数数据库)

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2320人左右 1 …

github加速访问及资源一秒代理下载

如果你想加速打开github网页,可以采用以下方法,仅需一个插件。 1.代理加速访问 打开gitee网站,搜索dev-sidecar关键字,然后找到星星最多的项目 可以阅读项目说明,找到感兴趣的内容或是直接下载DevSidecar桌面应用程序…

C语言笔记21 •模拟atoi函数•

1.atoi的使用 atoi是将字符串转化为int类型数字的一个库函数 int main() { char str[] "123568"; int a; a atoi(str); /*将字符串转化为int型的数字*/ printf("%d\n", a); } 2.模拟atoi函数 #define _CRT_SECURE_NO_WARNINGS…

MyBatis-Plus 从入门到精通

MyBatis-Plus 从入门到精通 前言快速入门创建一个SpringBoot项目导入依赖配置数据库创建一个实体类创建一个mapper接口在SpringBoot启动类上配置mapper接口的扫描路径在数据库中创建表编写一个SpringBoot测试类 核心功能注解CRUD接口Mapper CRUD接口Service CRUD 接口条件构造器…

通过Kafka-Logger插件收集流量进行漏洞扫描

通过Kafka-Logger插件收集流量进行漏洞扫描 方案 可以通过APISIX kafka-logger 插件将日志作为 JSON 对象推送到 Apache Kafka 集群中,消费Kafka里的数据格式化后添加到MySQL。 方案详情 1、登录APISIX,启用内置的kafka-logger 插件: 2…

PyQt6--Python桌面开发(34.QStatusBar状态栏控件)

QStatusBar状态栏控件 self.statusBar.showMessage(q.text()菜单选项被点击了,5000)

当HR问你是否单身时,该怎么回答?

知识星球(星球名:芯片制造与封测技术社区,星球号:63559049)里的学员问:我是晶圆厂厂务工程师,最近在面试新工作,但是几乎每家HR都会问我同一个问题:你结婚没有&#xff1…

安全设计 | CISA:构建不可侵犯的代码,软件安全设计的未来之路

软件制造商在产品设计和开发过程中应采取安全设计原则和方法,以减少网络安全风险,并转变责任重心,使产品在设计时就内置安全特性,而不是依赖于后期的补丁和修复。为此CISA发布了《软件安全设计的原则和方法》,帮助软件…

Windows11平台在VS2022上通过CMake安装C++绘图库ROOT库

Root库是一个功能强大的开源软件框架,用于数据分析、可视化和存储。它最初是为高能物理实验设计的,但现在已经广泛应用于各种科学领域和工程应用中。Root库使用C编写,提供了许多用于数据处理和分析的工具和算法。它的核心功能包括数据存储、数…

6.Redis之String命令

1.String类型基本介绍 redis 所有的 key 都是字符串, value 的类型是存在差异的~~ 一般来说,redis 遇到乱码问题的概率更小~~ Redis 中的字符串,直接就是按照二进制数据的方式存储的. (不会做任何的编码转换【讲 mysql 的时候,知道 mysql 默认的字符集, 是拉丁文,插入中文…

等保2.0看这一篇就够了

一、等级保护介绍 1.1什么是等级保护 网络安全等级保护是指对国家重要信息、法人和其他组织及公民的专有信息以及信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实行按等级管理,对信息系统中发生的信息安…

微火问答:全域外卖和本地生活服务是同个项目吗?

当前,本地生活赛道火爆程度不断升级,作为其主要板块之一的团购外卖也持续迸发出新的活力。而全域运营的出现无疑是给团购外卖这把正在熊熊燃烧的烈火,又添了一把新柴! 所谓全域运营,简单来说,就是指所有领…

SAP-技巧篇实现GUI免密码登录

做为上千万的软件怎么会没有免密码登录呢 01 — 背景需求 如何实现SAP GUI免密码登录,不输入密码实现系统自动登录。 免责声明:谨慎设置,因免密登录导致数据泄密,作者概不负责。 02 — 实现 客户端要求:SAP G…

VMware创建虚拟机

1.自定义 2.选择硬件兼容性 3.创建一个空白硬盘 4.选择操作系统和版本 5.设置虚拟机名称以及安装位置 6.处理器配置 7.设置虚拟机内存 8.设置网络类型 8.选择IO控制器 9.选择磁盘类型 10.创建一个新硬盘 11.设置磁盘容量以及磁盘个数 12.设置磁盘文件名称(默认) 13.点击完成创建…

从0开始学统计-P值

1.P值是什么? P值(P-value)是假设检验中的一个重要指标,用于衡量样本数据对于零假设的支持程度。具体来说,P值表示在假设零假设为真的情况下,观察到的样本数据或更极端情况出现的概率。 通常情况下&#…

蓝桥杯-班级活动

题目描述 小明的老师准备组织一次班级活动。班上一共有 ( n ) 名(( n ) 为偶数)同学,老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 ( n ) 以内的正整数作为 id,第 …

KVM热迁移虚拟机+KSM内存页合并

KVM高级功能部署 文章目录 KVM高级功能部署资源列表基础环境一、静态迁移1.1.在源宿主机上准备虚拟机1.1.1、调试VNC1.1.2、创建虚拟机test011.1.3、console登录test01虚拟机1.1.4、标记虚拟机test01当前IP地址 2.1、提取磁盘和配置文件2.2.1、查看虚拟机test01当前状态2.2.2、…

vue+iview tabs context-menu 弹出框怎么修改样式

今天遇到一个需求说页面顶部的菜单右键弹出框离得有点远 代码是这样 <Tabs type"card" closable class"main-tags-col-tabs" v-model"activeTab" on-click"handleClickTag" :before-remove"handleBeforeRemove" capt…

没有telnet情况下判断主机端口是否开放的方法

没有telnet情况下判断主机端口是否开放的方法 方式一 ssh -v 101.132.64.231 -p 80显示结果 如果有显示 debug1: Connection established. 就说明端口是开放的 端口未开放的情况是显示 方式二 echo >/dev/tcp/101.132.64.231/3306效果如下 如果没有任何输出&#xff0c;…