c# 完成恩尼格玛加密扩展

c# 完成恩尼格玛加密扩展

  • 恩尼格玛
  • 扩展为可见字符
    • 恩尼格玛的设备
      • 原始字符顺序
      • 转子的设置
      • 反射器的设置
      • 连接板的设置
    • 初始数据的设置
      • 第一版 C# 代码
      • 第二版 C# 代码
  • 总结

恩尼格玛

在之前,我们使用 python 实现了一版恩尼格玛的加密算法,但是这一版,转子的字符仅仅只支持26个字母,且无大小写的区分,所以适用范围就相当有限了。

具体的恩尼格玛的说明,可以参考文章:https://blog.csdn.net/weixin_30807779/article/details/98515455

具体来说,恩尼格玛实现了加密和解密使用的是同一套算法,关键就在于有一个反射器,在使用相同转子的情况下,按照相同的顺序输入加密前和加密后的字符就可以得到互换后的字符,且一一对应。

CSDN 文盲老顾的博客,https://blog.csdn.net/superwfei
老顾的个人社区,https://bbs.csdn.net/forums/bfba6c5031e64c13aa7c60eebe858a5f?category=10003&typeId=3364713

扩展为可见字符

为了使恩尼格玛的算法适用范围更广,我们需要将所有的可见 ASCII 码都加入到编码之中。

恩尼格玛的设备

原始字符顺序

这个字符顺序,算是一个基本设置,毕竟 ASCII 从 32 到 127 的顺序还是有点不太习惯,当然,按照这个顺序也没有问题,也可以自己定义字符顺序

// abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789`~!@#$%^&*()-_=+[{]}\|;:'",./<>? 

转子的设置

对于恩尼格玛的转子来说,其实就是原始字符串中,第一个字符对应打乱后转子字符里的第一个字符,第二个字符对应第二个字符。

如果是多个转子,需要注意,不是第一个转子的第一个字符对应第二个转子的字符,而是原始字符的第一个字符,对应第二个转子的第一个字符哦。

反射器的设置

反射器,是一个比较特殊的路径,它是将所有字符两两对应的关系,这个反射器,我们也可以用字符串来进行描述,比如第一个字符对应最后一个字符,如果是双数数量的字符就没什么毛病,如果是单数数量的字符,那么中间的字符对应它自身即可。

连接板的设置

同理,连接板和反射板差不多,这里使用的是和反射器一样的设置,即字符两两对应,如果想增加复杂度,也可以和转子一样,不按照两两对应的方式,这个之后我们再讨论

初始数据的设置

那么,对于恩尼格玛的算法来说,我们需要一个初始字符串,然后一个反射板,一个连接板,至少一个转子这样的数据。

那么,我们就只需要一个原始字符串,然后将原始字符串随机打乱至少3次,每次打乱的数据作为原始数据存放到一个数组中。

这个数组至少是四个元素,第一个元素,就是原始字符串,第二个元素作为连接板的数据,第三个元素作为反射器的设置,第四个及之后的所有元素,作为转子的数据即可。

第一版 C# 代码

那么我们的第一版代码就可以根据之前我们的 py 代码进行构建了

        public static string Enigma(string keyword, string[] EnigmaRotors){string result = string.Empty;int l = EnigmaRotors.Length;int cl = EnigmaRotors[1].Length;if (l < 4){return keyword;}Hashtable link = new Hashtable();Hashtable reverser = new Hashtable();for (int i = 0; i < cl; i++){link[EnigmaRotors[1].Substring(i, 1)] = EnigmaRotors[1].Substring(cl - i - 1, 1);}for (int i = 0; i < cl; i++){reverser[EnigmaRotors[2].Substring(i, 1)] = EnigmaRotors[2].Substring(cl - i - 1, 1);}for (int i = 0; i < keyword.Length; i++){List<string> lst = new List<string>();for (int j = 0; j < EnigmaRotors.Length - 3; j++){lst.Add(EnigmaRotors[3 + j]);int t = (int)Math.Floor(i / Math.Pow(cl, j)) % cl;if (t > 0){// 正转lst[lst.Count - 1] = lst[lst.Count - 1].Substring(t) + lst[lst.Count - 1].Substring(0, t);// 反转//lst[lst.Count - 1] = lst[lst.Count - 1].Substring(cl - t) + lst[lst.Count - 1].Substring(0, cl - t);}}string r = keyword.Substring(i, 1);r = link[r].ToString();for (int j = 0; j < lst.Count; j++){string rotor = lst[j];r = rotor.Substring(EnigmaRotors[0].IndexOf(r), 1);}r = reverser[r].ToString();for (int j = 0; j < lst.Count; j++){string rotor = lst[lst.Count - j - 1];r = EnigmaRotors[0].Substring(rotor.IndexOf(r), 1);}r = link[r].ToString();result += r;}return result;}

在代码中,我们对于原始数据 EnigmaRotors 的长度进行了验证,当该数据至少有四个元素的时候,才进行加密算法。当然,我这里没有对每个元素的字符是否一致进行验证,其实基本上也不太需要。

其中,在方法中,link 就是连接板,reverser 就是反射器,我们使用 Hashtable 来代替字典。

int t = (int)Math.Floor(i / Math.Pow(cl, j)) % cl;

这一行来计算当前输入字符的顺序,是否需要对每个转子进行转动。

string r = keyword.Substring(i, 1);

而循环中,这行代码之前,为转子确定状态

之后,则是按照连接板,转子,反射器,转子,连接板的顺序,对字符进行替换的过程了。

不过,这一版需要传输一个非常大的 string[] 对象作为参数,实在是有点不太友好。

第二版 C# 代码

public static string Enigma(string keyword, string chars,int seed,int len = 1)

在这一版,我们可以不再输入一个长字符串数组当做参数了

我们只需要将原始字符串作为参数

然后给出一个随机函数的种子,用来限定每次使用随机函数打乱字符串的时候,可以得出相同的结果

最后,给出一个转子的数量,最低是1

这个版本,与上一版的区别就在于,EnigmaRotors 的数据,是由随机种子,原始字符串和转子数量来自动生成的。

即,我们使用一个 List 来存放临时数据,最后将该数据的 ToArray() 结果保存为 EnigmaRotors 即可。

Random rnd = new Random(seed);
List<string> lst = new List<string>();
// 原始字符串
lst.Add(chars);
// 连接版
lst.Add(Shuffle(rnd,chars));
// 反射器
lst.Add(Shuffle(rnd,chars));
for (int i=0;i<len;i++){// 增加转子lst.Add(Shuffle(rnd,chars));
}
EnigmaRotors = lst.ToArray();

以上代码,插入到第一版的代码中函数定义的开始部分即可。后续代码与第一版并无区别。

然后,我们还需要实现一个洗牌的函数 Shuffle,具体该怎么打乱字符串,自己简单实现一下即可

public string Shuffle(Random rnd,string chars){List<byte> result = new List<byte>();List<byte> lst = new List<byte>();lst.AddRange(Encoding.UTF8.GetBytes(chars));while (lst.Count > 0){int n = rnd.Next(lst.Count);result.Add(lst[n]);lst.RemoveAt(n);}return Encoding.UTF8.GetString(result);
}

总结

由于 c# 没有 python 那么多的语法糖,所以很多内容,需要自己靠循环一点点来实现,也因为 c# 没有那么多第三方包,类似洗牌,打乱字符串这种方法,也得自己来实现。

但其实这些内容都是基本内容,自己实现起来,也没有那么复杂。

总的来说,用 c# 来实现恩尼格玛加密,也是一件比较简单的事情。

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

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

相关文章

【Redisson】锁可重入原理

目录 一、基本原理 二、源码解析&#xff1a; &#xff08;2&#xff09;获取锁 &#xff08;1&#xff09;释放锁&#xff1a; 之前给大家介绍过redisson的分布式锁&#xff0c;用redisson来实现比自己手搓简单的分布式锁有很多好处&#xff0c;因为这些可重入、可重试的逻…

BERT 模型微调与传统机器学习的对比

BERT 微调与传统机器学习的区别和联系&#xff1a; 传统机器学习流程 传统机器学习处理文本分类通常包含以下步骤&#xff1a; 特征工程&#xff1a;手动设计特征&#xff08;如 TF-IDF、词袋模型&#xff09;模型训练&#xff1a;使用分类器&#xff08;如 SVM、随机森林、逻…

(12)-Fiddler抓包-Fiddler设置IOS手机抓包

1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求&#xff0c;也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Fiddler 能捕获Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。同理也可以截获iOS设备发出的请求&#xff0c;比如 iPhone、iPad 和 MacBook 等苹…

芯科科技Tech Talks技术培训重磅回归:赋能物联网创新,共筑智能互联未来

聚焦于Matter、蓝牙、Wi-Fi、LPWAN、AI/ML五大热门无线协议与技术 为年度盛会Works With大会赋能先行 随着物联网&#xff08;IoT&#xff09;和人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;越来越多的企业和个人开发者都非常关注最新的无线连接技术和应用…

docker-compose容器单机编排

docker-compose容器单机编排 开篇前言 随着网站架构的升级&#xff0c;容器的使用也越来越频繁&#xff0c;应用服务和容器之间的关系也越发的复杂。 这个就要求研发人员能更好的方法去管理数量较多的服务器&#xff0c;而不能手动挨个管理。 例如一个LNMP 架构&#xff0c;就…

LeetCode--29.两数相除

解题思路&#xff1a; 1.获取信息&#xff1a; 给定两个整数&#xff0c;一个除数&#xff0c;一个被除数&#xff0c;要求返回商&#xff08;商取整数&#xff09; 限制条件&#xff1a;&#xff08;1&#xff09;不能使用乘法&#xff0c;除法和取余运算 &#xff08;2&#…

中山大学GaussianFusion:首个将高斯表示引入端到端自动驾驶多传感器融合的新框架

摘要 近年来由于端到端自动驾驶极大简化了原有传统自动驾驶模块化的流程&#xff0c;吸引了来自工业界和学术界的广泛关注。然而&#xff0c;现有的端到端智驾算法通常采用单一传感器&#xff0c;使其在处理复杂多样和具有挑战性的驾驶场景中受到了限制。而多传感器融合可以很…

《哈希算法》题集

1、模板题集 满足差值的数字对 2、课内题集 字符统计 字符串统计 优质数对 3、课后题集 2006 Equations k倍区间 可结合的元素对 满足差值的数字对 异常频率 神秘数对 费里的语言 连连看 本题集为作者&#xff08;英雄哪里出来&#xff09;在抖音的独家课程《英雄C入门到精…

Cordova移动应用对云端服务器数据库的跨域访问

Cordova移动应用对云端服务器数据库的跨域访问 当基于类似 Cordova这样的跨平台开发框架进行移动应用的跨平台开发时&#xff0c;往往需要访问部署在公网云端服务器上的数据库&#xff0c;这时就涉及到了跨域数据访问的问题。 文章目录 Cordova移动应用对云端服务器数据库的跨…

mysql知识点3--创建和使用数据库

mysql知识点3–创建数据库 创建数据库 在MySQL中创建数据库使用CREATE DATABASE语句。语法如下&#xff1a; CREATE DATABASE database_name;其中database_name为自定义的数据库名称。例如创建名为test_db的数据库&#xff1a; CREATE DATABASE test_db;可以添加字符集和排…

林业资源多元监测技术守护绿水青山

在云南高黎贡山的密林中&#xff0c;无人机群正以毫米级精度扫描古树年轮&#xff1b;福建武夷山保护区&#xff0c;卫星遥感数据实时追踪着珍稀动植物的栖息地变化&#xff1b;海南热带雨林里&#xff0c;AI算法正从亿万条数据中预测下一场山火的风险……这些科幻场景&#xf…

一阶/二阶Nomoto模型(野本模型)为何“看不到”船速对回转角速度/角加速度的影响?

提问 图中的公式反映的是舵角和力矩之间的关系&#xff0c; 其中可以看到力矩&#xff08;可以理解为角加速度&#xff09;以及相应导致的回转角速度和当前的舵速&#xff08;主要由船速贡献&#xff09;有关&#xff0c;那么为什么一阶Nomoto模型&#xff08;一阶野本&#xf…

深入剖析 C++ 默认函数:拷贝构造与赋值运算符重载

目录 1. 简单认识C 类的默认函数 1.1 默认构造函数 1.2 析构函数 1.3 拷贝构造函数 2. 拷贝构造函数的深入理解 拷贝构造的特点: 实际运用 3. 赋值运算符重载的深入理解 3.1.运算符重载 3.2样例 1.比较运算符重载 2.算术运算符重载 3.自增和自减运算符重载 4.输…

板凳-------Mysql cookbook学习 (十--3)

5.16 用短语来进行fulltext查询 mysql> select count(*) from kjv where match(vtext) against(God); ---------- | count(*) | ---------- | 0 | ---------- 1 row in set (0.00 sec)mysql> select count(*) from kjv where match(vtext) against(sin); -------…

python爬虫ip封禁应对办法

目录 一、背景现象 二、准备工作 三、代码实现 一、背景现象 最近在做爬虫项目时&#xff0c;爬取的网站&#xff0c;如果发送请求太频繁的话&#xff0c;对方网站会先是响应缓慢&#xff0c;最后是封禁一段时间。一直是拒绝连接&#xff0c;导致程序无法正常预期的爬取数据…

【AIGC】Qwen3-Embedding:Embedding与Rerank模型新标杆

Qwen3-Embedding&#xff1a;Embedding与Rerank模型新标杆 一、引言二、技术架构与核心创新1. 模型结构与训练策略&#xff08;1&#xff09;多阶段训练流程&#xff08;2&#xff09;高效推理设计&#xff08;3&#xff09;多语言与长上下文支持 2. 与经典模型的性能对比 三、…

算法竞赛阶段二-数据结构(32)数据结构简单介绍

数据结构的基本概念 数据结构是计算机存储、组织数据的方式&#xff0c;旨在高效地访问和修改数据。它是算法设计的基础&#xff0c;直接影响程序的性能。数据结构可分为线性结构和非线性结构两大类。 线性数据结构 线性结构中&#xff0c;数据元素按顺序排列&#xff0c;每…

Windows桌面图标修复

新建文本文件&#xff0c;粘入以下代码&#xff0c;保存为.bat文件&#xff0c;管理员运行这个文件 duecho off taskkill /f /im explorer.exe CD /d %userprofile%\AppData\Local DEL IconCache.db /a start explorer.exe echo 执行完成上面代码作用是删除桌面图标缓存库&…

13.react与next.js的特性和原理

&#x1f7e1; 一句话总结 React 专注于构建组件&#xff0c;而 Next.js 是基于 React 的全栈框架&#xff0c;提供了页面路由、服务端渲染和全栈能力&#xff0c;让你能快速开发现代 Web 应用。 React focuses on building UI components, while Next.js is a full-stack fra…

全栈监控系统架构

全栈监控系统架构 可观测性从数据层面可分为三类&#xff1a; 指标度量(Metrics)&#xff1a;记录系统的总体运行状态。事件日志(Logs)&#xff1a;记录系统运行期间发生的离散事件。链路追踪(Tracing)&#xff1a;记录一个请求接入到结束的处理过程&#xff0c;主要用于排查…