C++實現Atbash密碼

詳細說明 埃特巴什密碼是一種替換密碼,在該密碼中字母表中的字母是反向對應的。例如,A 會被替換為 Z,B 會被替換為 Y,依此類推。

#include <cassert>   /// for assert
#include <iostream>  /// for IO operations
#include <map>       /// for std::map
#include <string>    /// for std::string/** \namespace ciphers* \brief Algorithms for encryption and decryption*/
namespace ciphers {/** \namespace atbash* \brief Functions for the [Atbash* Cipher](https://en.wikipedia.org/wiki/Atbash) implementation*/namespace atbash {std::map<char, char> atbash_cipher_map = {{'a', 'z'}, {'b', 'y'}, {'c', 'x'}, {'d', 'w'}, {'e', 'v'}, {'f', 'u'},{'g', 't'}, {'h', 's'}, {'i', 'r'}, {'j', 'q'}, {'k', 'p'}, {'l', 'o'},{'m', 'n'}, {'n', 'm'}, {'o', 'l'}, {'p', 'k'}, {'q', 'j'}, {'r', 'i'},{'s', 'h'}, {'t', 'g'}, {'u', 'f'}, {'v', 'e'}, {'w', 'd'}, {'x', 'c'},{'y', 'b'}, {'z', 'a'}, {'A', 'Z'}, {'B', 'Y'}, {'C', 'X'}, {'D', 'W'},{'E', 'V'}, {'F', 'U'}, {'G', 'T'}, {'H', 'S'}, {'I', 'R'}, {'J', 'Q'},{'K', 'P'}, {'L', 'O'}, {'M', 'N'}, {'N', 'M'}, {'O', 'L'}, {'P', 'K'},{'Q', 'J'}, {'R', 'I'}, {'S', 'H'}, {'T', 'G'}, {'U', 'F'}, {'V', 'E'},{'W', 'D'}, {'X', 'C'}, {'Y', 'B'}, {'Z', 'A'}, {' ', ' '}};/*** @brief atbash cipher encryption and decryption* @param text Plaintext to be encrypted* @returns encoded or decoded string*/std::string atbash_cipher(const std::string& text) {std::string result;for (char letter : text) {result += atbash_cipher_map[letter];}return result;}}  // namespace atbash
}  // namespace ciphers/*** @brief Self-test implementations* @returns void*/
static void test() {// 1st teststd::string text = "Hello World";std::string expected = "Svool Dliow";std::string encrypted_text = ciphers::atbash::atbash_cipher(text);std::string decrypted_text = ciphers::atbash::atbash_cipher(encrypted_text);assert(expected == encrypted_text);assert(text == decrypted_text);std::cout << "Original text: " << text << std::endl;std::cout << ", Expected text: " << expected << std::endl;std::cout << ", Encrypted text: " << encrypted_text << std::endl;std::cout << ", Decrypted text: " << decrypted_text << std::endl;std::cout << "\nAll tests have successfully passed!\n";
}/*** @brief Main function* @returns 0 on exit*/
int main() {test();  // run self-test implementationsreturn 0;
}

代碼詳細逐句解釋

1.?命名空間定義
namespace ciphers {namespace atbash {

定義了嵌套的命名空間 ciphers::atbash,用于組織和封裝Atbash加密算法。

2.?映射表定義
std::map<char, char> atbash_cipher_map = {{'a', 'z'}, {'b', 'y'}, {'c', 'x'}, {'d', 'w'}, {'e', 'v'}, {'f', 'u'},{'g', 't'}, {'h', 's'}, {'i', 'r'}, {'j', 'q'}, {'k', 'p'}, {'l', 'o'},{'m', 'n'}, {'n', 'm'}, {'o', 'l'}, {'p', 'k'}, {'q', 'j'}, {'r', 'i'},{'s', 'h'}, {'t', 'g'}, {'u', 'f'}, {'v', 'e'}, {'w', 'd'}, {'x', 'c'},{'y', 'b'}, {'z', 'a'}, {'A', 'Z'}, {'B', 'Y'}, {'C', 'X'}, {'D', 'W'},{'E', 'V'}, {'F', 'U'}, {'G', 'T'}, {'H', 'S'}, {'I', 'R'}, {'J', 'Q'},{'K', 'P'}, {'L', 'O'}, {'M', 'N'}, {'N', 'M'}, {'O', 'L'}, {'P', 'K'},{'Q', 'J'}, {'R', 'I'}, {'S', 'H'}, {'T', 'G'}, {'U', 'F'}, {'V', 'E'},{'W', 'D'}, {'X', 'C'}, {'Y', 'B'}, {'Z', 'A'}, {' ', ' '}
};

這個映射表定義了每個字母(包括大寫和小寫)及其對應的Atbash加密字母之間的映射關系。例如:

  • 小寫字母 'a' 映射到 'z'

  • 大寫字母 'A' 映射到 'Z'

  • 空格 ' ' 映射到自身。

3.?加密/解密函數
std::string atbash_cipher(const std::string& text) {std::string result;for (char letter : text) {result += atbash_cipher_map[letter];}return result;
}
  • 參數

    • text:輸入的待加密或解密的字符串。

  • 功能

    • 遍歷輸入字符串的每個字符。

    • 使用 atbash_cipher_map 查找每個字符的對應值,并將其追加到結果字符串 result 中。

  • 返回值

    • 返回加密或解密后的結果字符串。

4.?測試函數
static void test() {// 1st teststd::string text = "Hello World";std::string expected = "Svool Dliow";std::string encrypted_text = ciphers::atbash::atbash_cipher(text);std::string decrypted_text = ciphers::atbash::atbash_cipher(encrypted_text);assert(expected == encrypted_text);assert(text == decrypted_text);std::cout << "Original text: " << text << std::endl;std::cout << ", Expected text: " << expected << std::endl;std::cout << ", Encrypted text: " << encrypted_text << std::endl;std::cout << ", Decrypted text: " << decrypted_text << std::endl;std::cout << "\nAll tests have successfully passed!\n";
}
  • 功能

    • 測試 atbash_cipher 函數的正確性。

    • 使用示例文本 "Hello World" 進行加密和解密測試。

    • 驗證加密結果是否與預期一致,并驗證解密后的文本是否與原始文本一致。

  • 斷言

    • assert(expected == encrypted_text):確保加密結果正確。

    • assert(text == decrypted_text):確保解密結果與原始文本一致。

  • 輸出

    • 打印原始文本、預期文本、加密文本和解密文本。

代碼執行流程

  1. 測試函數調用

    • main 函數中調用 test 函數。

  2. 加密測試

    • "Hello World" 作為輸入,調用 atbash_cipher 進行加密。

  3. 解密測試

    • 將加密后的字符串再次作為輸入,調用 atbash_cipher 進行解密。

  4. 驗證結果

    • 使用斷言驗證加密和解密的正確性。

  5. 輸出結果

    • 打印測試結果。

示例

假設輸入文本為 "Hello World"

  • 加密過程

    • 'H' → 'S'

    • 'e' → 'v'

    • 'l' → 'o'

    • 'l' → 'o'

    • 'o' → 'l'

    • ' ' → ' '

    • 'W' → 'D'

    • 'o' → 'l'

    • 'r' → 'i'

    • 'l' → 'o'

    • 'd' → 'w'

  • 加密結果為 "Svool Dliow"

  • 解密過程

    • 再次調用 atbash_cipher 對加密結果進行解密,應得到原始文本 "Hello World"

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78161.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78161.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78161.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QuecPython+GNSS:實現快速定位

概述 QuecPython 結合 GNSS&#xff08;全球導航衛星系統&#xff09;模塊為物聯網設備提供開箱即用的定位能力解決方案。該方案支持 GPS/北斗/GLONASS/Galileo 多系統聯合定位&#xff0c;為物聯網開發者提供從硬件接入到云端服務的全棧式定位解決方案。 優勢特點 多體系定…

leetcode刷題日記——逆波蘭表達式求值

[ 題目描述 ]&#xff1a; [ 思路 ]&#xff1a; 借助棧的特性&#xff0c;遇見數字就將這個數壓入棧內&#xff0c;遇見符號&#xff0c;就從棧中彈出兩個數&#xff0c;進行相應的運算&#xff0c;然后將結果壓入棧中運行如下 int evalRPN(char** tokens, int tokensSize…

firewalld 詳解

firewalld 詳解 firewalld 是 Linux 系統中一個動態防火墻管理工具&#xff0c;取代了傳統的 iptables&#xff0c;提供更靈活、動態的規則配置&#xff0c;支持運行時修改且無需重載服務。以下是其核心概念、常用操作及示例指南&#xff1a; 一、核心概念 區域&#xff08;Zo…

面向高性能運動控制的MCU:架構創新、算法優化與應用分析

摘要&#xff1a;現代工業自動化、汽車電子以及商業航天等領域對運動控制MCU的性能要求不斷提升。本文以國科安芯的MCU芯片AS32A601為例&#xff0c;從架構創新、算法優化到實際應用案例&#xff0c;全方位展示其在高性能運動控制領域的優勢與潛力。該MCU以32位RISC-V指令集為基…

支付寶小程序組件與頁面構造器使用指南:從頁面到組件的正確遷移

引言 在支付寶小程序開發中&#xff0c;我們經常會遇到需要將頁面組件化的情況。本文將通過一個實際案例&#xff08;將 /pages/plugin/device 從頁面遷移到組件&#xff09;&#xff0c;深入分析支付寶小程序中頁面和組件的區別&#xff0c;以及正確的遷移方式。我們將從問題…

26-算法打卡-字符串-右旋字符串-第二十六天

1 題目說明 字符串的右旋轉操作是把字符串尾部的若干個字符轉移到字符串的前面。給定一個字符串 s 和一個正整數 k&#xff0c;請編寫一個函數&#xff0c;將字符串中的后面 k 個字符移到字符串的前面&#xff0c;實現字符串的右旋轉操作。 例如&#xff0c;對于輸入字符串 &qu…

fastbev mmdetection3D 角度和方向損失

角度/方向損失 sin(a?b)sinacosb?cosasinb config參數 dir_offset0.7854, # pi/4 dir_limit_offset0, box編解碼 # Copyright (c) OpenMMLab. All rights reserved. import torchfrom mmdet.core.bbox import BaseBBoxCoder from mmdet.core.bbox.builder import BBOX_COD…

極狐GitLab 如何 cherry-pick 變更?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 揀選(cherry-pick)更改 (BASIC ALL) 在 Git 中&#xff0c;cherry-pick 是從一個分支獲取一個提交并將其添加為另一個分支的…

java多線程(7.0)

目錄 ?編輯 定時器 定時器的使用 三.定時器的實現 MyTimer 3.1 分析思路 1. 創建執行任務的類。 2. 管理任務 3. 執行任務 3.2 線程安全問題 定時器 定時器是軟件開發中的一個重要組件. 類似于一個 "鬧鐘". 達到一個設定的時間之后, 就執行某個指定好的…

優化非線性復雜系統的參數

非線性項組合的系統 對于系統中的每一個復雜擬合&#xff0c;即每一個殘差函數&#xff0c;都能表示為非線性方程的趨勢&#xff0c;例如較為復雜的系統函數組&#xff0c; from optimtool.base import sp, np x sp.symbols("x1:5") res1 0.5*x[0] 0.2*x[1] 1.…

清華LeapLab開源Cooragent框架:一句話構建本地智能體服務群,讓AGI真正觸手可及

引言&#xff1a;智能體革命&#xff0c;從復雜到簡單 在人工智能發展的浪潮中&#xff0c;Agent&#xff08;智能體&#xff09; 技術被視為實現通用人工智能&#xff08;AGI&#xff09;的關鍵路徑。然而&#xff0c;傳統智能體的開發與協作始終面臨兩大痛點&#xff1a;依賴…

云原生--核心組件-容器篇-1-Docker和云原生關系(Docker是云原生的基石)

1、基本概念 &#xff08;1&#xff09;、云原生&#xff08;Cloud Native&#xff09; 是一種構建和運行應用程序的方法論&#xff0c;旨在充分利用云計算環境&#xff08;公有云、私有云、混合云&#xff09;的特性&#xff0c;通過容器化、微服務、服務網格、聲明式API等技…

問答頁面支持拖拽和復制粘貼文件,MaxKB企業級AI助手v1.10.6 LTS版本發布

2025年4月24日&#xff0c;MaxKB開源企業級AI助手正式發布v1.10.6 LTS版本。這一版本主要進行了一些功能優化和問題修復。 功能優化 ■ 應用&#xff1a;文件上傳支持上傳其他自定義的文件類型&#xff0c;該類型文件需要自行寫入函數解析&#xff1b; ■ 問答頁面&#xff…

用戶案例--慧眼科技

作者&#xff1a;算力魔方創始人/英特爾創新大使劉力 每個行業都有其獨特的需求&#xff0c;算力魔方推出了全面的定制化服務&#xff0c;從概念到產品化&#xff0c;滿足各行各業&#xff0c;用戶可以根據具體應用需求定制更多接口或更強圖形處理的需求&#xff0c;且算力魔方…

apple 個人開發者轉公司經驗

1、在apple開發者官網申請 2、收到郵件后&#xff0c;回復準備了開始遷移 3、收到填寫遷移資料的郵件 4、開始填寫資料 Sign In - Applehttps://developer.apple.com/enroll/type/edit To complete this change, you will need: 要完成此更改&#xff0c;您需要&#xff1a; L…

【ESP32-IDF筆記】20-配置以太網網絡(W5500)

環境配置 Visual Studio Code &#xff1a;版本1.98.2 ESP32&#xff1a;ESP32-S3 ESP-IDF&#xff1a;V5.4 模塊&#xff1a;W5500&#xff0c;SPI通訊協議 組件支持&#xff1a;esp_eth 官方的ethernet 以太網組件 W5500介紹 介紹 W5500 是一款全硬件 TCP/IP 嵌入式以太網…

衛星通信的基本概念

1 頻段 頻段 頻率范圍 技術特點 典型應用 優勢 局限性 最新進展 L 頻段 1-2 GHz 波長較長&#xff0c;穿透能力強&#xff0c;受天氣影響小&#xff0c;帶寬較窄&#xff08;<100 MHz&#xff09;。 衛星導航&#xff08;北斗 / GPS&#xff09;、海事通信&#x…

數據結構------C語言經典題目(7)

1.系統棧和數據結構中的棧有什么區別&#xff1f; 1.本質&#xff1a; 系統棧&#xff1a;由程序運行時由操作系統自動分配的一塊連續內存區域&#xff0c;用于存儲函數調用過程中的臨時數據&#xff08;參數、局部變量、返回地址&#xff09;&#xff0c;是程序運行的底層機制…

【Redis】一、redis的下載與安裝

目錄 一、redis下載 二、啟動服務 三、測試服務 四、可視化界面 五、設置reids密碼 今天起準備對redis進行學習&#xff0c;目標是掌握實際開發項目中如何應用redis等操作。首先在這里講將如何下載redis&#xff0c;方便以后查閱。 一、redis下載 可以去官網&#xff08…

vue3中nextTick的作用及示例

在Vue 3中&#xff0c;nextTick是一個用于處理DOM異步更新的工具函數&#xff0c;確保在數據變化后操作最新的DOM。以下是其作用的詳細解析&#xff1a; 核心作用 延遲回調到DOM更新后&#xff1a;Vue的響應式系統會將數據變更批量處理&#xff0c;異步更新DOM。nextTick允許你…