密码学--仿射密码
一、实验目的
1、通过实现简单的古典密码算法,理解密码学的相关概念
2、理解明文、密文、加密密钥、解密密钥、加密算法、解密算法、流密码与分组密码等。
二、实验内容
1、题目内容描述
①随机生成加密密钥,并验证密钥的可行性
②从plain文件读入待加密明文
③进行仿射密码加密
④将加密后得到的密文放入cipher文件
⑤根据加密密钥计算解密密钥
⑥进行解密运算
⑦将解密后的文本放入plain_decrypted文件,与明文进行对比
2、关键代码的设计、实现与执行
设计思路:
先以时间产生随机数作为加密密钥a,b,但是这里要通过求最大公因数的方式来验证加密密钥a的可行性,即密钥a和N的最大公因数为1,即a,N互质(其中N为定义在Zn上的N):
下面代码是运用Euclid算法计算最大公因数的关键代码:
while(b!=0)//此处的b是N,也就是此实验的26,
{
temp=a%b;//得到的余数部分
a=b;//b做被模数
b=temp;//得到的余数做模数
}
return a;//求得的最大公因数
下面代码是随机生成密钥a,并通过调用最大公因数的函数验证密钥a可行性的关键代码部分:
while(gcd(a,N)!=1)//循环判断密钥a的可行性
{
srand(time(NULL));//以时间随机生成种子
a=rand()%N; //a随机生成,b也以同样的方式生成,但是不用判断可行性,只需进行一次随机生成
}
得到加密密钥后,从文件读入已经准备好的加密明文(也可通过记事本修改),下面代码是以读的方式打开文件,并判断是否在文件夹中存在命名的文件的关键代码部分:
FILE *plain_file = fopen("plain.txt", "r");//以读的方式打开
if (plain_file == NULL) {
printf("无法打开明文文件!\n");//判断无法打开给出提示
exit(1);//无法打开只能以异常终止结束运行
}
其中分析明文中的大小写字母,大写字母的ASCII码是从65到90,小写字母的ASCII码是从97到122,如实符号则不进行加密解密,直接返回,对字母利用放射加密y=ax+b mod q进行加密,下面代码是根据ASCII码将大小写代码转换,并进行加密的关键代码部分:
if(ch>='a'&&ch<='z')//ascii码转换,ch>=97&&ch<=122
{
ch-=97;
}
else if(ch>='A'&&ch<='Z')//ascii码转换,ch>=65&&ch<=90
{
ch-=65;
}
else
return ch;//如果是字符就直接跳过加密解密部分
return (ch*a+b)%N+97;//最后解密后的文件得到小写的字母
在得到加密后的密文后放入密文cipher文件,关键代码部分如下:
while ((ch = fgetc(plain_file)) != EOF) {
cipher_text=(char)encrypt(ch,a,b); //加密后直接将返回的密文放入文件中
fputc(cipher_text, cipher_file);
运用扩展Euclid算法求逆元a1,就可以得到解密密钥a模N的逆元a1,以及密钥c=b*a1
下面代码是运用扩展Euclid算法求a的逆元a1的关键代码部分:
while(b!=0) {//此处最开始的b也是N,就是此实验的26
int r = a%b;
int q = (a-r)/b;
int x2 = x0-x1*q;
int y2 = y0-y1*q;
a=b;
b=r;
x0=x1;
y0=y1;
x1=x2;
y1=y2;
}//当b==0时,判断是否a2>b2,若是,逆元应该是y0,若不是逆元应该是x0
最后对密文进行解密,步骤基本一样,只是密钥变成了a1和c。
最后将解密得到的文本放入plain_decrypted文件中,关键代码部分如下:
while ((ch = fgetc(cipher_file)) != EOF)
{
plain_text = (char)encrypt(ch,a1,c);
fputc(plain_text, plain_file);
}
实验结果截图:
- 实验结果分析
首先测试结果可见上图,可以看到对明文的加密结果以及对密文的解密结果,解密结果和明文是一致的,证明中间算法没有问题,然后在运行中也给了相关信息,如加密密钥和解密密钥以及文件命名等,且在明文中可以任意输入大小写字母,最后统一为小写字母,即最后return时加上97,结果如下:
当然也可以不统一为小写,或者统一为大写字母,只需要在加密encrypt函数处分类返回就行,也就是在小写字母处返回多加97,在大写字母处返回多加65,此处只是为了好看。
也可同一为大写字母如下,且有符号位:
对密文的解密也可以不统一为大写或小写,只需要各自return就行,得到结果如下:
特别的是关于符号以及空格等处理,并未对它们进行处理,而是相应的直接返回原始值,不对它们进行任何加密解密操作。
三、实验思考
1、实验过程总结
在刚开始进行编写程序的时候,由于基础理论知识不扎实,误将加密密钥直接代入解密式子中进行计算,一直出错,后来发现并及时解决了。特别是在符号及空位等的处理方式上,最开始是直接在代码中列出了常见符号的ASCII码,把它们从明文中单独提出来,然后不对它们进行加密解密操作,后来仔细看了实验视频,才发现直接用一个else就可以直接避免对所有的字符进行加密解密。
通过此次实验使我加深了对仿射密码的理解,也更清晰仿射密码加密解密每一步的原理,也加强了我自己的代码能力。
2、回答实验指导书最后提出的问题
①改进将仿射密码定义在Z29上,明密文空间除26个英文字母还包括空格、句号和引号。
这个方案与传统定义在Z26上的仿射密码相比有何优点?
②如果要实现此方案,你的程序应该如何进行调整?
①相对引用Z(26)的仿射密码Z(29)的仿射密码覆盖的范围更广,范围更广也就意味着有着更大的加密范围,意味着算法的安全性更高。
②首先要将宏定义的N改为29,然后加/解密过程对多出来的三个特殊符号进行单独的加/解密。
相关文章:

密码学--仿射密码
一、实验目的 1、通过实现简单的古典密码算法,理解密码学的相关概念 2、理解明文、密文、加密密钥、解密密钥、加密算法、解密算法、流密码与分组密码等。 二、实验内容 1、题目内容描述 ①随机生成加密密钥,并验证密钥的可行性 ②从plain文件读入待…...
生成式图像水印研究综述
生成式图像水印研究综述 一、引言二、生成式图像水印研究背景三、生成式图像水印算法研究进展3.1 基于流模型的方案3.2 基于生成对抗网络的方案3.3 基于扩散模型的方案3.3.1 修改图像数据3.3.2 调整生成模型3.3.3 修改隐变量空间四、算法的性能与评价指标五、常用数据集六、本章…...
TCP协议详细讲解及C++代码实例
目录 一. TCP协议详细讲解及C代码实例1、TCP协议概述2、TCP通信流程1) 三次握手2) 数据传输3) 四次挥手 3、关键点解析1) 套接字创建2) 三次握手实现3) 数据传输4) 四次挥手实现 4、TCP与UDP对比 一. TCP协议详细讲解及…...
深度剖析:Vue2 项目兼容第三方库模块格式的终极解决方案
当我们为 Vue2 项目引入某些现代 JavaScript 库时,常常会遇到这样的报错: error in ./node_modules/some-lib/lib/index.mjs Cant import the named export xxx from non EcmaScript module这类问题的本质是模块格式的世纪之争 —— ES Moduleÿ…...
APISQL免费版安装教程(视频)
APISQL 一款通用的API开发管理软件,支持将主流数据库中的表、视图、SQL语句、存储过程等快速封装为标准的 RESTful API,支持多种安全认证方式和可视化管理界面。适用于接口开发、系统集成、数据共享等场景。 支持主流数据库的表、视图、自定义函数、存储…...

SpringBoot整合MQTT实战:基于EMQX实现双向设备通信(附源码)
简言: 在万物互联的时代,MQTT协议凭借其轻量级、高效率的特性,已成为物联网通信的事实标准。本教程将带领您在Ubuntu系统上搭建EMQX 5.9.0消息服务器,并使用Spring Boot快速实现两个客户端的高效通信。通过本指南,您将…...

从零开始掌握FreeRTOS(2)链表之节点的定义
目录 节点 节点定义 节点实现 根节点 根节点定义 精简节点定义 根节点实现 在上篇文章,我们完成了 FreeRTOS 的移植。在创建任务之前,我们需要先了解FreeRTOS的运转机制。 FreeRTOS是一个多任务系统,由操作系统来管理执行每个任务。这些任务全都挂载到一个双向循…...
Java的While循环写的出票简单程序
import java.util.Scanner;public class Hello {public static void main(String[] args) {Scanner in new Scanner(System.in);int balance 0;while(true){System.out.print("请投币: ");int amount in.nextInt();balance balance amount;if(balance >10 )…...
详解Windows(十一)——网络连接设置
Windows网络连接设置完全指南 1. Windows网络连接基础 网络连接类型 有线连接: 通过网线将电脑连接到路由器或调制解调器优点:连接稳定,速度快,延迟低适合:需要高速稳定网络的场景,如游戏、大文件下载、…...
多线程爬虫语言选择与实现
之前文中有人提到:想要一个简单易用、能快速实现多线程爬虫的方案,而且目标是小网站,基本可以确定对反爬虫措施要求不高,这些就比较简单了。 以往我肯定要考虑常见的编程语言中哪些适合爬虫。Python、JavaScript(Node…...

【数据结构】——双向链表
一、链表的分类 我们前面学习了单链表,其是我们链表中的其中一种,我们前面的单链表其实全称是单向无头不循环链表,我们的链表从三个维度进行分类,一共分为八种。 1、单向和双向 可以看到第一个链表,其只能找到其后一个…...
AI助力:零基础开启编程之旅
一、代码调试 三步解决BUG 1. 错误信息翻译 指令模板: 错误诊断模式我遇到【编程语言】报错“粘贴报错信息“ 请: 用小白能懂的话解释问题本质标注可能引发该错误的三个场景给出最可能的修复方案和其他备选方案 2. 上下文分析 进阶指令 结合上下文代…...

mybatis中${}和#{}的区别
先测试,再说结论 userService.selectStudentByClssIds(10000, "wzh or 11");List<StudentEntity> selectStudentByClssIds(Param("stuId") int stuId, Param("field") String field);<select id"selectStudentByClssI…...
【计算机组成原理】第二部分 存储器--分类、层次结构
文章目录 分类&层次结构0x01 分类按存储介质分类按存取方式分类按在计算机中的作用分类 0x02 层次结构 分类&层次结构 0x01 分类 按存储介质分类 半导体存储器磁表面存储器磁芯存储器光盘存储器 按存取方式分类 存取时间与物理地址无关(随机访问&#…...

抗量子计算攻击的数据安全体系构建:从理论突破到工程实践
在“端 - 边 - 云”三级智能协同理论中,端 - 边、边 - 云之间要进行数据传输,网络的安全尤为重要,为了实现系统总体的安全可控,将构建安全网络。 可先了解我的前文:“端 - 边 - 云”三级智能协同平台的理论建构与技术实…...
正则表达式: 从基础到进阶的语法指南
正则表达式语法详解 前言一、基础概念二、基础元字符2.1 字符匹配2.2 字符类2.3 预定义字符类 三、重复匹配3.1 贪婪与非贪婪匹配3.2 精确重复匹配 四、边界匹配4.1 行首与行尾匹配4.2 单词边界匹配 五、分组与引用5.1 分组5.2 反向引用5.3 命名分组 六、逻辑运算符6.1 或运算 …...

uniapp|实现手机通讯录、首字母快捷导航功能、多端兼容(H5、微信小程序、APP)
基于uniapp实现带首字母快捷导航的通讯录功能,通过拼音转换库实现汉字姓名首字母提取与分类,结合uniapp的scroll-view组件与pageScrollTo API完成滚动定位交互,并引入uni-indexed-list插件优化索引栏性能。 目录 核心功能实现动态索引栏生成联系人列表渲染滚动定位联动性…...

【Linux】基础IO(二)
📝前言: 上篇文章我们对Linux的基础IO有了一定的了解,这篇文章我们来讲讲IO更底层的东西: 重定向及其原理感受file_operation文件缓冲区 🎬个人简介:努力学习ing 📋个人专栏:Linux…...
SpringBoot异步处理@Async深度解析:从基础到高阶实战
一、异步编程基础概念 1.1 同步 vs 异步 特性同步异步执行方式顺序执行,阻塞调用非阻塞,调用后立即返回线程使用单线程完成所有任务多线程并行处理响应性较差,需等待前任务完成较好,可立即响应新请求复杂度简单直观较复杂&#…...

【生存技能】ubuntu 24.04 如何pip install
目录 原因解决方案说明关于忽略系统路径 在接手一个新项目需要安装python库时弹出了以下提示: 原因 这个报错是因为在ubuntu中尝试直接使用 pip 安装 Python 包到系统环境中,ubuntu 系统 出于稳定性考虑禁止了这种操作 这里的kali是因为这台机器的用户起名叫kali…...

SHAP分析!Transformer-GRU组合模型SHAP分析,模型可解释不在发愁!
SHAP分析!Transformer-GRU组合模型SHAP分析,模型可解释不在发愁! 目录 SHAP分析!Transformer-GRU组合模型SHAP分析,模型可解释不在发愁!效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于SHAP分析…...
Tcp 通信简单demo思路
Server 端 -------------------------- 初始化部分 ------------------------------- 1.创建监听套接字: 使用socket(协议家族,套接字的类型,0) 套接字类型有 SOCK_STREAM:表示面向连接的套接字(Tcp协议)&…...
MySQL 8.0安装(压缩包方式)
MySQL 8.0安装(压缩包方式) 下载安装包并解压 下载 https://dev.mysql.com/downloads/mysql/可关注“后端码匠”回复“MySQL8”关键字获取 解压(我解压到D:\dev\mysql-8.4.5-winx64目录下) 创建mysql服务 注意,这步之前一定要保证自己电…...
常见标签语言的对比
XML、JSON 和 YAML 是常见的数据序列化格式 相同点 结构化数据表示 三者均支持嵌套结构,能描述复杂的数据层级关系(如对象、数组、键值对)。跨平台兼容性 均为纯文本格式,可被多种编程语言解析,适用于跨系统数据交换…...

知名人工智能AI培训公开课内训课程培训师培训老师专家咨询顾问唐兴通AI在金融零售制造业医药服务业创新实践应用
AI赋能未来工作:引爆效率与价值创造的实战营 AI驱动的工作革命:从效率提升到价值共创 培训时长: 本课程不仅是AI工具的操作指南,更是面向未来的工作方式升级罗盘。旨在帮助学员系统掌握AI(特别是生成式AI/大语言模型…...

Qt Creator 配置 Android 编译环境
Qt Creator 配置 Android 编译环境 环境配置流程下载JDK修改Qt Creator默认android配置文件修改sdk_definitions.json配置修改的内容 Qt Creator配置 异常处理删除提示占用编译报错连接安卓机调试APP闪退 环境 Qt Creator 版本 qtcreator-16.0.1Win10 嗯, Qt这个开发环境有点难…...

智能手表蓝牙 GATT 通讯协议文档
以下是一份适用于智能手表的 蓝牙 GATT 通讯协议文档,适用于 BLE 5.0 及以上标准,兼容 iOS / Android 平台: 智能手表蓝牙 GATT 通讯协议文档 文档版本:V1.0 编写日期:2025年xx月xx日 产品型号:Aurora Wat…...
AWS EC2源代码安装valkey命令行客户端
sudo yum -y install openssl-devel gcc wget https://github.com/valkey-io/valkey/archive/refs/tags/8.1.1.tar.gz tar xvzf 8.1.1.tar.gz cd valkey-8.1.1/ make distclean make valkey-cli BUILD_TLSyes参考 Connecting to nodes...

RT-THREAD RTC组件中Alarm功能驱动完善
使用Rt-Thread的目的为了更快的搭载工程,使用Rt-Thread丰富的组件和第三方包资源,解耦硬件,在更换芯片时可以移植应用层代码。你是要RTT的目的什么呢? 文章项目背景 以STM32L475RCT6为例 RTC使用的为LSE外部低速32 .756k Hz 的…...
MySQL解决主从复制的报错问题
MySQL 8.4 非 GTID 模式部分数据库主从复制指南 在进行MySQL 8.4非GTID模式下部分数据库主从复制时,以下是详细的操作步骤以及对应的执行位置说明,还有报错处理方法介绍: 操作步骤 1. 备份主库指定数据库(db1、db2)…...