密码学原理精解【5】
这里写目录标题
- 移位密码
- 概述
- 代码
- 希尔密码( Z 256 Z_{256} Z256)
- 待加密长度被3整除
- 待加密长度不一定被3整除
- 加解密文件
移位密码
概述
以 z 26 运算为例 , k 为密钥 加密: e k ( x ) = ( x + k ) m o d 26 解密: d k ( x ) = ( x − k ) m o d 26 以z_{26} 运算为例,k为密钥 \\加密:e_k(x)=(x+k) mod 26 \\解密:d_k(x)=(x-k) mod 26 以z26运算为例,k为密钥加密:ek(x)=(x+k)mod26解密:dk(x)=(x−k)mod26
实际中,我们使用 Z 256 Z_{256} Z256运算(群的加法运算)
代码
#include <iostream>
#include <fstream>
#include<cstring>using namespace std;int main(){//加密写入ofstream fileOut;char helloTxt[]{"&9*&((@#$)((%#^^hello,world!\n123456789"};int txtLen{strlen(helloTxt)};fileOut.open("hello.data",ios::binary);int k=77;for(int i=0;i<txtLen;i++){fileOut<<char((helloTxt[i]+k) %256);}fileOut.close();//解密读出ifstream fileIn;char helloChar;fileIn.open("hello.data",ios::binary);while (fileIn.get(helloChar)){cout<<char((helloChar-k) %256);}fileIn.close();}
&9*&((@#$)((%#^^hello,world!
123456789
Process returned 0 (0x0) execution time : 0.120 s
Press any key to continue.
希尔密码( Z 256 Z_{256} Z256)
待加密长度被3整除
#include <iostream>
#include <fstream>
#include<cstring>
#include "e:/eigen/Eigen/Dense"using namespace std;
using namespace Eigen;int main(){//加密写入ofstream fileOut;char helloTxt[]{"123456789$#%(&Yoiu9"};int txtLen{strlen(helloTxt)};fileOut.open("hello.data",ios::binary);for(int i=0;i<txtLen;i+=3){Matrix<int,1,3> x{helloTxt[i],helloTxt[i+1],helloTxt[i+2]};Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};Matrix<int,1,3> e_data=x*k;for (int j=0;j<3;j++){fileOut<<char(int(e_data[j]) % 256);}}fileOut.close();//解密读出ifstream fileIn;char helloChar;fileIn.open("hello.data",ios::binary);char txtBuffer[4];for(int i=0;i<txtLen;i+=3){fileIn.read(txtBuffer,3);Matrix<int,1,3> y{txtBuffer[0],txtBuffer[1],txtBuffer[2]};Matrix<int,3,3> k_ni{{9,11, 227},{101 ,152 ,37},{134 ,248 ,127}};Matrix<int,1,3> e_data=y*k_ni;for (int j=0;j<3;j++){cout<<char(int(e_data[j]) % 256);}}fileIn.close();}
待加密长度不一定被3整除
继续完善程序,针对加密长度不一定是3的倍数。
#include <iostream>
#include <fstream>
#include<cstring>
#include "e:/eigen/Eigen/Dense"using namespace std;
using namespace Eigen;int main(){//加密写入ofstream fileOut;char helloTxt[]{"123456789p"};int txtLen{strlen(helloTxt)};fileOut.open("hello.data",ios::binary);for(int i=0;i<txtLen;i+=3){if ((txtLen-i)==1){Matrix<int,1,3> x{helloTxt[i],0,0};Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};Matrix<int,1,3> e_data=x*k;for (int j=0;j<3;j++){fileOut<<char(int(e_data[j]) % 256);}}else if ((txtLen-i)==2){Matrix<int,1,3> x{helloTxt[i],helloTxt[i+1],0};Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};Matrix<int,1,3> e_data=x*k;for (int j=0;j<3;j++){fileOut<<char(int(e_data[j]) % 256);}}else{Matrix<int,1,3> x{helloTxt[i],helloTxt[i+1],helloTxt[i+2]};Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};Matrix<int,1,3> e_data=x*k;for (int j=0;j<3;j++){fileOut<<char(int(e_data[j]) % 256);}}}fileOut.close();//解密读出ifstream fileIn;char helloChar;fileIn.open("hello.data",ios::binary);char txtBuffer[4];for(int i=0;i<txtLen;i+=3){fileIn.read(txtBuffer,3);Matrix<int,1,3> y{txtBuffer[0],txtBuffer[1],txtBuffer[2]};Matrix<int,3,3> k_ni{{9,11, 227},{101 ,152 ,37},{134 ,248 ,127}};Matrix<int,1,3> e_data=y*k_ni;char d_data[3];for (int j=0;j<3;j++){d_data[j]=char(int(e_data[j]) % 256);}if ((txtLen-i)==2 ){cout<<d_data[0]<<d_data[1];}else if((txtLen-i)==1 ){cout<<d_data[0];}else{for (int j=0;j<3;j++){cout<<d_data[j];}}}fileIn.close();}
123456789p
Process returned 0 (0x0) execution time : 0.376 s
Press any key to continue.
加解密文件
#include <iostream>
#include <fstream>
#include<cstring>
#include "e:/eigen/Eigen/Dense"using namespace std;
using namespace Eigen;int main(){//加密写入ifstream picfs("test.png", ios::ate|ios::binary);// 获取文件大小std::streampos picSize = picfs.tellg();picfs.close(); // 关闭文件std::cout << "文件长度: " << picSize << " 字节" << std::endl;ifstream ifs("test.png", ios::in|ios::binary);char *picData=new char[picSize+1];for (int i=0;i<picSize;i++){ifs.get(picData[i]);}ifs.close();int txtLen{picSize};ofstream fileOut;fileOut.open("pic.dat",ios::binary);for(int i=0;i<txtLen;i+=3){if ((txtLen-i)==1){Matrix<int,1,3> x{picData[i],0,0};Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};Matrix<int,1,3> e_data=x*k;for (int j=0;j<3;j++){fileOut<<char(int(e_data[j]) % 256);}}else if ((txtLen-i)==2){Matrix<int,1,3> x{picData[i],picData[i+1],0};Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};Matrix<int,1,3> e_data=x*k;for (int j=0;j<3;j++){fileOut<<char(int(e_data[j]) % 256);}}else{Matrix<int,1,3> x{picData[i],picData[i+1],picData[i+2]};Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};Matrix<int,1,3> e_data=x*k;for (int j=0;j<3;j++){fileOut<<char(int(e_data[j]) % 256);}}}fileOut.close();//解密读出ofstream deFileOut;deFileOut.open("test_d.png",ios::binary);ifstream fileIn;char helloChar;fileIn.open("pic.dat",ios::binary);char txtBuffer[4];for(int i=0;i<txtLen;i+=3){fileIn.read(txtBuffer,3);Matrix<int,1,3> y{txtBuffer[0],txtBuffer[1],txtBuffer[2]};Matrix<int,3,3> k_ni{{9,11, 227},{101 ,152 ,37},{134 ,248 ,127}};Matrix<int,1,3> e_data=y*k_ni;char d_data[3];for (int j=0;j<3;j++){d_data[j]=char(int(e_data[j]) % 256);}if ((txtLen-i)==2 ){deFileOut<<d_data[0]<<d_data[1];}else if((txtLen-i)==1 ){deFileOut<<d_data[0];}else{for (int j=0;j<3;j++){deFileOut<<d_data[j];}}}deFileOut.close();fileIn.close();delete[] picData;}
相关文章:
密码学原理精解【5】
这里写目录标题 移位密码概述代码 希尔密码( Z 256 Z_{256} Z256)待加密长度被3整除待加密长度不一定被3整除加解密文件 移位密码 概述 以 z 26 运算为例 , k 为密钥 加密: e k ( x ) ( x k ) m o d 26 解密: d k ( x ) ( x − k ) m o d 26 以z_{…...
Unity3D 资源管理YooAsset原理分析与详解
引言 Unity3D 是一款广泛应用于游戏开发、虚拟现实(VR)、增强现实(AR)等领域的强大游戏开发引擎。在开发过程中,资源管理是一项至关重要的任务,它直接影响到游戏的性能和用户体验。YooAsset 是一个基于 Un…...

npm install puppeteer 报错 npm ERR! PUPPETEER_DOWNLOAD_HOST is deprecated解决办法
npm install puppeteer 报错如下: npm ERR! PUPPETEER_DOWNLOAD_HOST is deprecated. Use PUPPETEER_DOWNLOAD_BASE_URL instead. npm ERR! Error: ERROR: Failed to set up Chrome v126.0.6478.126! Set "PUPPETEER_SKIP_DOWNLOAD" env variable to sk…...
浙大版PTA《Python 程序设计》题目集 参考答案
浙大版PTA《Python 程序设计》题目集 参考答案 本答案配套详解教程专栏,欢迎订阅: PTA浙大版《Python 程序设计》题目集 详解教程_少侠PSY的博客-CSDN博客 01第1章-1 从键盘输入两个数,求它们的和并输出 aint(input()) # 输入a的值 bint(…...

“拆分盘投资:机遇与风险并存
一、引言 随着互联网技术的日新月异,金融投资领域迎来了前所未有的变革,其中拆分盘作为一种新兴的投资模式,正逐渐进入公众的视野。其独特的价值增长逻辑和创新的投资机制,为投资者开辟了新的财富增值渠道。本文旨在深入探讨拆分…...
Java面试题系列 - 第2天
题目:Java中的线程池模型及其配置策略 背景说明:在Java多线程编程中,线程池是一种高效的线程复用机制,能够有效管理和控制线程的创建与销毁,避免频繁创建和销毁线程带来的性能开销。理解和掌握线程池的配置策略对于优…...

AGI|Transformer自注意力机制超全扫盲攻略,建议收藏!
一、前言 2017年,谷歌团队推出一篇神经网络的论文,首次提出将“自注意力”机制引入深度学习中,这一机制可以根据输入数据各部分重要性的不同而分配不同的权重。当ChatGPT震惊世人时,Transformer也随之进入大众视野。一夜之间&…...

QT+OpenCV在Android上实现人脸实时检测与目标检测
一、功能介绍 在当今的移动应用领域,随着技术的飞速发展和智能设备的普及,将先进的计算机视觉技术集成到移动平台,特别是Android系统中,已成为提升用户体验、拓展应用功能的关键。其中,目标检测与人脸识别作为计算机视…...
常见网络攻击方式及防御方法
1. DDOS攻击(分布式拒绝服务攻击) 概念:借助于C/S(客户端/服务器)技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDOS攻击,从而成倍地提高拒绝服务攻击的威力。防护方…...
使用 ESP32 实现无线对讲机功能涉及音频采集、音频传输以及音频播放等多个方面。实现无线对讲机功能的基本步骤和示例代码。
硬件准备 两个 ESP32 开发板两个 MAX9814 麦克风模块(或其他兼容的模拟麦克风模块)两个 MAX98357A DAC 模块(或其他兼容的音频放大器模块)扬声器 接线 麦克风模块 -> ESP32 ADC 引脚ESP32 DAC 引脚 -> 音频放大器模块 -&…...
SpringBoot项目,配置文件pom.xml的结构解析
pom.xml 是 Maven 项目对象模型(Project Object Model)的配置文件,它定义了 Maven 项目的基本设置和构建过程。以下是 pom.xml 文件的基本结构和一些常见元素的解析: 项目声明 (<project>): <modelVersion>: 通常设置…...
教程:Spring Boot中集成Memcached的详细步骤
教程:Spring Boot中集成Memcached的详细步骤 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代应用开发中,缓存是提升性能和扩展性…...

Websocket通信实战项目(图片互传应用)+PyQt界面+python异步编程(async) (上)服务器端python实现
Rqtz : 个人主页 共享IT之美,共创机器未来 Sharing the Beauty of IT and Creating the Future of Machines Together 目录 项目背景 编辑专有名词介绍 服务器GUI展示 功能(位置见上图序号) 客户端GUI展示(h5cssjs…...

实验一 MATLAB \ Python数字图像处理初步
一、实验目的: 1.熟悉及掌握在MATLAB\Python中能够处理哪些格式图像。 2.熟练掌握在MATLAB\Python中如何读取图像。 3.掌握如何利用MATLAB\Python来获取图像的大小、颜色、高度、宽度等等相关信息。 4.掌握如何在M…...

echarts柱状选中shadow阴影背景宽度设置
使用line,宽度增大到所需要的宽度,设置下颜色透明度就行 tooltip: {trigger: axis,//把阴影的层级往下降z:-15,axisPointer: {type: line,lineStyle: {color: rgba(150,150,150,0.3),width: 44,type: solid,},}, }, series: [{type: bar,barWidth:20,//…...
ArrayBuffer 对象常见的几个用途
ArrayBuffer 在 JavaScript 中的用途广泛,主要用于处理二进制数据。 ArrayBuffer 对象、 TypedArray 视图和 DataView 视图是 JavaScript 操作二进制数据的一个接口。本文介绍ArrayBuffer 对象的常见的一些用法。 1. 网络传输二进制数据 使用方法:通过 …...

STC89C52RC单片机设计的FM收音机+自动搜台+存储电台(程序+原理图+PCB)
资料下载地址:STC89C52RC单片机设计的FM收音机自动搜台存储电台(程序原理图PCB) 1、实物图 2、部分程序 #include <reg52.h> #include "tea5767.h" #include "delay.h" #include "lcd1602.h" //K1:上一台 K2:下一…...
【若依】关闭当前标签页并跳转路由到其他页面
使用场景如:当在新增/编辑路由页面提交成功后,需要关闭当前页,并跳转回列表页。 实现代码: this.$store.dispatch("tagsView/delView", this.$route); //关闭当前页 this.$router.replace({ path: "/xxx/xxx"…...

防爆智能手机如何解决危险环境下通信难题?
在化工厂、石油行业、矿山等危险环境中,通信安全一直是难题。传统手机因不具备防爆功能,可能引发火花、爆炸等安全风险,让工作人员在关键时刻难以及时沟通。但如今,防爆智能手机的出现彻底改变了这一现状! 安全通信&am…...

软件测试最全面试题及答案整理(2024最新版)
1、你的测试职业发展是什么? 测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年积累测试经验,按如何做好测试工程师的要点去要求自己,不断…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...
【大厂机试题解法笔记】矩阵匹配
题目 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式 N M K N*M矩阵 输…...