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
繁體地址,請注明出處:http://hk.pswp.cn/news/909173.shtml
英文地址,請注明出處:http://en.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;主要用于排查…