文章详情
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 特点:
- 快速查找:通过哈希函数将键映射到桶(bucket),使得查找操作的时间复杂度平均为 O(1)。
- 无序存储:元素在容器中的存储顺序是无序的,即插入顺序和存储顺序无关。
- 唯一键:每个键在 std::unordered_map 中是唯一的,不允许重复键。
- 动态扩容:当元素数量超过当前桶的数量时,std::unordered_map 会自动扩容以保持高效的性能。
- 可以看到加解密中并没有像其他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
....- ---.. -.... ..... -.... -.-. -.... -.-. -.... ..-. ..--- . ..... --... -.... ..-. --... ..--- -.... -.-. -.... ....- .- ...-- -... ..-. .- ...-- -... ..-. .- ...-- -... ..-.
//总结:加密方式千千万,这种纯属瞎扯淡😉,
一般用于特殊内容加密,类似我的卡密账号验证等,操作不频繁,从内存看起来很是装13,
可以看到加密后的字符长度明显倍增。
*转载请注明出处:原文链接:https://cpp.vin/page/30.html