L o a d i n g . . .
主打一个C++
文章详情

C++摩斯密码加密解密支持任意文本(现代版)

Posted on 2024-09-09 15:28:08 by 主打一个C++

摩斯密码(Morse Code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。它由美国人萨缪尔·摩尔斯及其助手阿尔弗雷德·维尔在1836年发明。

摩斯密码使用两种基本信号:点和划。点(·)表示短信号,划(-)表示长信号。字母和数字的编码是通过点和划的组合来实现的。例如,字母A的摩斯密码是“·-”,字母B的摩斯密码是“-···”。

为什么这叫现代版?因为支持任何字符🙃

除了标准表,当然也可以随意自定义,例如随意顶一个:

std::unordered_map<char, std::string> morseCode = {
    {'a', ".-"}, {'b', "-..."}, {'c', "-.-."}, {'d', "-.."}, {'e', "----"},{'f', "..-."}, {'g', "--."},
    {'h', "...."}, {'i', ".."}, {'j', ".---"},{'k', "-.-"}, {'l', ".-.."}, {'m', "--"}, {'n', "-."},
    {'o', "---"},{'p', ".--."}, {'q', "--.-"}, {'r', ".-."}, {'s', "..."}, {'t', "-"},
    {'u', "..-"}, {'v', "...-"}, {'w', ".--"}, {'x', "-..-"}, {'y', "-.--"},{'z', "--.."},
    {'0', "."}, {'1', ".----"}, {'2', "..---"}, {'3', "...--"},{'4', "....-"}, {'5', "....."}, {'6', "-...."}, {'7', "--..."},{'8', "---.."}, {'9', "----."}
};

//加密:

void MorseEncode(const unsigned char* _data, int length, std::string& _out) {
    unsigned char* data = (unsigned char*)_data;
    std::stringstream ss, code;
    for (int i = 0; i < length; ++i) {
        code << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(data[i]);
        ss << morseCode[(char)*code.str().substr(0, 1).c_str()] << " ";
        ss << morseCode[(char)*code.str().substr(1, 1).c_str()] << " ";
        code.str("");
    }
    _out = ss.str();
}

//解密有所不同,反转密码表,因为加密是字符,解密需要匹配密码

// 反向表
std::unordered_map<std::string, char> reverseMorseCode;
// 利用密码表初始化为反向表
void InitializeReverseMorseCode() {
    for (const auto& pair : morseCode) {
        reverseMorseCode[pair.second] = pair.first;
    }
}

//解密:

void MorseDecode(const std::string& _morse, std::string& _result) {
    std::stringstream result;
    std::stringstream ss(_morse);
    std::string code="";
    while (ss >> code) {
        result << reverseMorseCode[code];
    }
    code = result.str();
    int len = (int)code.length();
    int char_len = len / 2;
    _result.resize(char_len + 1);
    for (int i = 0; i < char_len; ++i) {
        std::string byteString = code.substr(i * 2, 2);
       
        _result[i] = (unsigned char)strtol(byteString.c_str(), nullptr, 16);
    }
    _result[char_len] = '';
}

//依赖文件:

#include <iostream>
#include <unordered_map>
#include <string>
#include <sstream>
#include <iomanip>

//std::unordered_map 特点:

      1. 快速查找:通过哈希函数将键映射到桶(bucket),使得查找操作的时间复杂度平均为 O(1)。
      2. 无序存储:元素在容器中的存储顺序是无序的,即插入顺序和存储顺序无关。
      3. 唯一键:每个键在 std::unordered_map 中是唯一的,不允许重复键。
      4. 动态扩容:当元素数量超过当前桶的数量时,std::unordered_map 会自动扩容以保持高效的性能。
      5. 可以看到加解密中并没有像其他map使用find等操作

//完整示例代码:

int main() {

    std::string text = "Hello World???";
    std::cout << "原始文本: 		" << text << std::endl;
    std::string out;
    //加密
    MorseEncode((const unsigned char*)text.c_str(), (int)text.length(), out);
    std::cout << "\n加密后的摩斯密码:  	" << out << std::endl;

    //反转密码表,用于解密
    InitializeReverseMorseCode();
    std::string out2;
    //解密
    MorseDecode(out, out2);
    std::cout << "\n解密后的文本: 		" << out2 << std::endl;

    return 0;
}

//加密结果,除了点就是杠,很是装13

....- ---.. -.... ..... -.... -.-. -.... -.-. -.... ..-. ..--- . ..... --... -.... ..-. --... ..--- -.... -.-. -.... ....- .- ...-- -... ..-. .- ...-- -... ..-. .- ...-- -... ..-.

image.png

//总结:加密方式千千万,这种纯属瞎扯淡😉,

           一般用于特殊内容加密,类似我的卡密账号验证等,操作不频繁,从内存看起来很是装13,

           可以看到加密后的字符长度明显倍增。


*转载请注明出处:原文链接:https://cpp.vin/page/30.html

作者近期文章
  • 随手笔记
  • 主打一个C++   2025-01-11 20:02:01
  • 都2000000025年了。还有不能随意访问guthub的,仔细看。在国内其实是可以正常访问的,gfw并没屏蔽。这里给出其中一个简单直接的方法稳定访问。1. 随便百度一个”dn
提示
×
确定
数据库执行: 7次 总耗时: 0.01s
页面加载耗时: 



wechat +447752296473
wechat cpp-blog