密码综合实战

news/2025/1/8 16:43:24/文章来源:https://www.cnblogs.com/o-O-oO/p/18660079

这种加密本质上是换汤不换药的,我们需要有所创新,下面是我的想法(key{A}和key{B}表示的是A和B独有的秘钥):

假设现在有服务器192.168.1.1,本机扮演角色A,服务器扮演角色B,进行如下逻辑:A拥有A的专属秘钥(汉字秘钥)进行一次加密发送给B,B接受到后再用B的专属秘钥再次加密发送给A,然后A接受到有两次加密的内容后用A的秘钥解开一次内容再发给B,B接收到后用B的秘钥解开查看内容,以helloword为内容,代码如下:

加密解密函数模块

#include <iostream>
#include <unordered_map>
#include <string>// 定义角色 A 和 B 的专属秘钥
std::unordered_map<char, std::string> AKey = {{'h', "海"}, {'e', "恩"}, {'l', "兰"}, {'o', "欧"}, {'w', "威"},{'r', "荣"}, {'d', "达"}, {'H', "汉"}, {'E', "尔"}, {'L', "理"},{'O', "奥"}, {'W', "王"}, {'R', "日"}, {'D', "德"}, {' ', " "},
};std::unordered_map<char, std::string> BKey = {{'h', "鸿"}, {'e', "艺"}, {'l', "雷"}, {'o', "欧"}, {'w', "文"},{'r', "仁"}, {'d', "东"}, {'H', "和"}, {'E', "恩"}, {'L', "流"},{'O', "奥"}, {'W', "沃"}, {'R', "瑞"}, {'D', "大"}, {' ', " "},
};// 打表加密函数
std::string encrypt(const std::string& input, const std::unordered_map<char, std::string>& key) {std::string encryptedText = "";for (char c : input) {if (key.find(c) != key.end()) {encryptedText += key.at(c); // 查表加密} else {encryptedText += c; // 未定义字符直接保留}}return encryptedText;
}// 打表解密函数(反向映射)
std::string decrypt(const std::string& input, const std::unordered_map<char, std::string>& key) {// 构造反向映射表std::unordered_map<std::string, char> reverseKey;for (const auto& pair : key) {reverseKey[pair.second] = pair.first;}std::string decryptedText = "";std::string buffer = ""; // 用于存储汉字缓冲for (char c : input) {if ((unsigned char)c >= 0x80) { // 判断是否为汉字(中文多字节编码)buffer += c;// 完成一个汉字if (buffer.size() == 3) {if (reverseKey.find(buffer) != reverseKey.end()) {decryptedText += reverseKey[buffer]; // 查表解密} else {decryptedText += buffer; // 未定义字符直接保留}buffer.clear();}} else {decryptedText += c; // 非汉字字符直接追加}}return decryptedText;
}

角色 A 的代码

角色 A 扮演客户端,连接到服务器 B,发送和接收数据。

#include <iostream>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include "encryption_module.h" // 包含加密解密逻辑#define SERVER_IP "127.0.0.1" // 或者替换为 "192.168.1.1"
#define SERVER_PORT 8080int main() {// 创建 Socketint clientSocket = socket(AF_INET, SOCK_STREAM, 0);if (clientSocket < 0) {std::cerr << "Socket creation failed!" << std::endl;return -1;}// 设置服务器地址sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(SERVER_PORT);inet_pton(AF_INET, SERVER_IP, &serverAddr.sin_addr);// 连接服务器if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {std::cerr << "Connection to server failed!" << std::endl;close(clientSocket);return -1;}// 原始消息std::string message = "helloworld";std::cout << "原始消息: " << message << std::endl;// A 使用 AKey 加密std::string encryptedByA = encrypt(message, AKey);send(clientSocket, encryptedByA.c_str(), encryptedByA.size(), 0);std::cout << "A 加密后发送: " << encryptedByA << std::endl;// 接收 B 的加密消息char buffer[1024] = {0};int bytesReceived = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);std::string encryptedByB(buffer, bytesReceived);std::cout << "A 收到双重加密消息: " << encryptedByB << std::endl;// A 解密一次std::string decryptedByA = decrypt(encryptedByB, AKey);std::cout << "A 解密后发送给 B: " << decryptedByA << std::endl;send(clientSocket, decryptedByA.c_str(), decryptedByA.size(), 0);// 关闭连接close(clientSocket);return 0;
}

角色 B 的代码

角色 B 扮演服务器,接收来自 A 的消息,加密后再发送回去。

#include <iostream>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include "encryption_module.h" // 包含加密解密逻辑#define SERVER_PORT 8080int main() {// 创建 Socketint serverSocket = socket(AF_INET, SOCK_STREAM, 0);if (serverSocket < 0) {std::cerr << "Socket creation failed!" << std::endl;return -1;}// 绑定地址和端口sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(SERVER_PORT);serverAddr.sin_addr.s_addr = INADDR_ANY;if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {std::cerr << "Bind failed!" << std::endl;close(serverSocket);return -1;}// 监听连接if (listen(serverSocket, 1) < 0) {std::cerr << "Listen failed!" << std::endl;close(serverSocket);return -1;}std::cout << "等待客户端连接..." << std::endl;// 接受连接sockaddr_in clientAddr;socklen_t clientLen = sizeof(clientAddr);int clientSocket = accept(serverSocket, (sockaddr*)&clientAddr, &clientLen);if (clientSocket < 0) {std::cerr << "Accept failed!" << std::endl;close(serverSocket);return -1;}std::cout << "客户端已连接!" << std::endl;// 接收 A 的加密消息char buffer[1024] = {0};int bytesReceived = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);std::string encryptedByA(buffer, bytesReceived);std::cout << "B 收到 A 的消息: " << encryptedByA << std::endl;// B 使用 BKey 加密std::string encryptedByB = encrypt(encryptedByA, BKey);send(clientSocket, encryptedByB.c_str(), encryptedByB.size(), 0);std::cout << "B 加密后发送: " << encryptedByB << std::endl;// 接收 A 解密后的消息bytesReceived = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);std::string decryptedByA(buffer, bytesReceived);std::cout << "B 收到 A 解密后的消息: " << decryptedByA << std::endl;// B 解密std::string finalMessage = decrypt(decryptedByA, BKey);std::cout << "B 解密后的消息: " << finalMessage << std::endl;// 关闭连接close(clientSocket);close(serverSocket);return 0;
}

运行说明

先启动角色 B(服务器)。
再启动角色 A(客户端)。
角色 A 和角色 B 会进行多轮消息加密、解密和传输,最终在角色 B 的终端上看到解密后的原始消息helloworld。

结果示例

A 发送加密消息:海恩兰兰欧威欧荣兰达
B 接收到后再次加密:鸿艺雷雷欧文欧仁雷东
A 解密后发送给 B:海恩兰兰欧威欧荣兰达
B 最终解密得到原文:helloworld

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

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

相关文章

FrontEnd性能优化.md

性能优化 性能优化\浏览器渲染原理 Get Started有这样几个问题,我们来思考下:1.我们平常浏览的网页是否是应用?2.在操作系统中的应用是如何运行的3.浏览器究竟是什么4.webkit和浏览器的关系5.浏览器是如何呈现网页的6.经典问题:从浏览器的地址栏输入一个网址直到网页内容呈…

Tita OKR 应用技巧:OKR 评分

OKR 评分价值 OKR(目标与关键成果)评分主要有以下几方面价值: 一、目标管理方面明确目标完成程度OKR评分可以直观地展现目标的达成情况。例如,一个产品团队设定了提升用户满意度的目标,通过OKR评分,可以清楚地看到用户满意度指标从初始的60%提升到了75%还是80%等具体数值…

ArmSoM RK3588/RK3576核心板,Rockchip Display 使用

1. Display简介​ RK3588 的VOP (video output process)分为4个Port:port分辨率VP0 4KVP1 4KVP2 4KVP3 1080PRK3588 VP 和各显⽰接口的连接关系: 需要注意的是,RK3588 的 HDMI 和 DP ⽀持 8K 输出,但是在 8K 输出模式下,⼀个显⽰接口需要同时占⽤ VP0 和 VP1 。所以如果产…

JNI接口--实现Java调用C++

1、JNI原理概述 通常为了更加灵活高效地实现计算逻辑,我们一般使用C/C++实现,编译为动态库,并为其设置C接口和C++接口。用C++实现的一个库其实是一个或多个类的简单编译链产物,然后暴露其实现类的构造方法和纯虚接口类。这样就可以通过多态调用到库内部的实现类及其成员方法…

Leaflet 实现离线瓦片资源 + 飞线迁徙 + 自定义标记点位实现

npm install leaflet 注意构建webpack配置module: {rules: [{test: /\.(png|jpg|gif|jpeg|svg)$/,include: /node_modules[\\/]leaflet/,use: [{loader: url-loader,options: {outputPath: static/images}}]}] } 注意外部资源代理方式proxy: {/cdn: {target: https:// + ip + :…

Training Transformers with 4-bit Integers

目录概符号说明4-bit FQTLearned Step Size QuantizationHadamard QuantizationBit Splitting and Leverage Score Sampling代码Xi H., Li C., Chen J. and Zhu J. Training transformers with 4-bit integers. NeurIPS, 2023.概 本文针对 4-bit 中训练中一些特点 (针对 transf…

python SQLAlchemy ORM——从零开始学习 02简单的增删查改

02 简单的增删查改 前情提要:承接了01中的engine以及User类 2-1 了解会话机制个人理解 在SQLAlchemy 增删查改中是依赖会话(Session)这个机制进行操作的,我个人的理解是用“会话“进行连接数据库周期的一系列管理操作(以下是ai生成对此会话的理解)ai理解 在 SQLAlchemy 中…

YASKAWA机械手维修DX100示教器通电无反应

安川机器人DX100示教器通电无反应可能由多种原因导致,以下是一些常见的原因及对应的解决方法:可能原因电源问题:电源线破损或电源插座接触不良。 硬件故障:示教器内部电路板或元件(如内存条、处理器或显示屏等)损坏。 软件问题:软件发生错误或版本不匹配。 其他故障:…

春节电商爆单背后的协作黑科技!

每到春节,电商平台的交易额都会迎来新一轮爆发。但你是否思考过,支撑这一庞大运作的团队如何在高压之下确保高效协作?答案或许就藏在你忽略的细节里:在线文档协作。 春节购物高峰的背后:团队协作挑战重重 春节期间,消费者习惯于提前囤年货、抢促销,购物高峰往往集中爆发…

Transformer、编码器、解码器、全连接FFN、自注意力机制、嵌入向量、残差连接层归一化

一.提出背景 Transformer最早是Google在2017年的Attention Is All You Need论文中提出,用于解决解决传统的序列到序列(Seq2Seq)模型在处理可变长序列时遇到的问题。(序列到序列:指的是模型的输入是一段序列,模型输出也是序列;比如语音识别中给模型一段中文语音序列,让模…

JS-22 字符串的方法_concat()

concat方法用于链接两个字符串,返回一个新字符串,不改变原字符串 var s1=zifuchuan var s2=tow s1.concat(s2)//"zifuchuantow" s1//"zifuchuan" 该方法可以接受多个参数 two.concat(zifuchuan,three)//"zifuchuanthreetwo" 如果参数不是字符串…

年货抢购狂潮来袭,协作效率如何提升?

每年春节,都是电商企业竞争最激烈的战场。从年前的大促销到年后的物流爆单,作为电商团队的一员,你是否为节日期间高强度的工作节奏而焦虑?特别是在跨部门协作时,沟通不畅、任务延误、文档混乱等问题是否成为了团队效率的致命瓶颈? 在这一背景下,在线文档协作成为了提升春…