【网络安全】【密码学】【北京航空航天大学】实验四、古典密码(上)【C语言实现】

实验四、古典密码(上)

一、实验目的

1、 通过本次实验,了解古典加密算法的主要思想,掌握常见的古典密码。
2、 学会应用古典密码,掌握针对部分古典密码的破译方法

二、原理简介

古典密码的编码方法主要有两种:置换代替置换密码重新排列明文中字符的顺序,不改变字符本身;代替密码不改变明文中的字符顺序,而是将字符替换成其他字符。置换密码通常主要包括列置换周期置换 2种,代替密码则主要包括单表代替密码和多表代替密码2种。

三、实验内容

1、仿射密码(Affine Cipher)

(1)、算法原理

加密原理:
由式 c = (k * p + b) mod 26 可得,仿射密码的加密原理为,先将明文进行0~25字母编码,再按照该式计算出密文对应位置的字母编码,最后从密文的字母编码还原出密文对应位置的字母,得到密文。

解密原理:
c = (k * p + b) mod 26p = (c – b) * (1/k) mod 26,其中1/kk在模26下的逆元。先将密文进行0~25字母编码,再按照该式计算出明文对应位置字母的编码,最后从明文的字母编码还原出明文字母,得到明文。

(2)、算法流程

本算法的大致流程如下图所示:

在这里插入图片描述

在这里插入图片描述

(3)、算法的代码实现(C语言)

#include <stdio.h>
#include <string.h>char plaintext[10010] = { 0 };
char ciphertext[10010] = { 0 };
int plain[10010] = { 0 };
int cipher[10010] = { 0 };
int k, b;
void encrypt(char plaintext[], int k, int b);
void decrypt(char ciphertext[], int k, int b);
int euclid(int a, int b);
int inverse(int a);int main()
{int input;printf("请输入选项:1为加密;2为解密\n");scanf("%d", &input);printf("请输入k的值:\n");scanf("%d", &k);printf("请输入b的值:\n");scanf("%d", &b);printf("你输入的值为:k = %d, b = %d\n", k, b);if(input == 1){// 加密printf("请输入要加密的明文:");scanf("%s", plaintext);printf("加密结果:\n");encrypt(plaintext, k, b);}else if(input == 2){// 解密printf("请输入要解密的密文:");scanf("%s", ciphertext);printf("解密结果:\n");decrypt(ciphertext, k, b);}elseprintf("错误的选项(只能为1或2)。程序退出。");return 0;
}void encrypt(char plaintext[], int k, int b)
{int i;if(euclid(k, 26) != 1){printf("wrong k. try again\n");return;}else{for(i = 0;i < strlen(plaintext);i ++){plain[i] = plaintext[i] - 'a';cipher[i] = (plain[i] * k + b) % 26;ciphertext[i] = cipher[i] + 'a';}puts(ciphertext);return;}return;
}void decrypt(char ciphertext[], int k, int b)
{int i;for(i = 0;i < strlen(ciphertext);i ++){cipher[i] = ciphertext[i] - 'a';plain[i] = ((cipher[i] - b) * inverse(k)) % 26;if(plain[i] >= 0){plaintext[i] = plain[i] + 'a';}else{plaintext[i] = plain[i] + 26 + 'a';}}puts(plaintext);return;
}int euclid(int a, int b)
{if(b == 0){return a;}else{return euclid(b, a % b);}
}int inverse(int a)
{int i;for(i = 1;i < 26;i ++){if((a * i) % 26  == 1){return i;}}return -1;
}

(4)、算法测试

加密过程演示:

参数:k = 3, b = 3, 明文:ciphertext

运行截图:

在这里插入图片描述

得到的密文:jbwypcipui

解密过程演示:

参数:k = 3, b = 3, 密文:jbwypcipui

运行截图:

在这里插入图片描述

得到的明文:ciphertext

“鲁棒性”:

(1)、输入了错误的选项:

在这里插入图片描述

(2)、输入的k和26不互素:

在这里插入图片描述

2、单表代替密码(Substitution Cipher)

(1)、算法原理

加密原理:利用代替表,将明文中的每个字符映射到密文。
解密原理:通过对代替表进行反向查找,由密文映射回明文。

(2)、算法流程

加密流程:

在这里插入图片描述

解密流程:

在这里插入图片描述

(3)、算法的代码实现(C语言)

#include <stdio.h>
#include <string.h>char sub_table[26] = {'q','a','z','w','s','x','e','d','c','r','f','v','t','g','b','y','h','n','u','j','m','i','k','l','o','p'};
char plaintext[10010] = { 0 };
char ciphertext[10010] = { 0 };
int plain[10010] = { 0 };
int cipher[10010] = { 0 };void sub_encrypt(char plaintext[]);
void sub_decrypt(char ciphertext[]);int main()
{int input;printf("请输入选项:1为加密;2为解密\n");scanf("%d", &input);if(input == 1){// 加密printf("请输入要加密的明文:");scanf("%s", plaintext);printf("加密结果:\n");sub_encrypt(plaintext);}else if(input == 2){// 解密printf("请输入要解密的密文:");scanf("%s", ciphertext);printf("解密结果:\n");sub_decrypt(ciphertext);}elseprintf("错误的选项(只能为1或2)。程序退出。");return 0;
}// 加密函数
void sub_encrypt(char plaintext[])
{int i;for(i = 0;i < strlen(plaintext);i ++){plain[i] = plaintext[i] - 'a';ciphertext[i] = sub_table[plain[i]];}puts(ciphertext);return;
}// 解密函数
void sub_decrypt(char ciphertext[])
{int i, j;for(i = 0;i < strlen(ciphertext);i ++){for(j = 0;j < 26;j ++){if(ciphertext[i] == sub_table[j]){plaintext[i] = j + 'a';}}}puts(plaintext);
}

(4)、算法测试

加密过程演示:

明文:thisisastring
密文:jdcucuqujncge
运行截图:

在这里插入图片描述

解密过程演示:

密文:jdcucuqujncge
明文:thisisastring

运行截图:

在这里插入图片描述

3、维吉尼亚密码(Vigenere Cipher)

(1)、算法原理(及流程)

加密原理:加密过程的一般方程是 Ci = (pi + k(i mod m)) mod 26,通过该方程即可由明文得到密文;
解密原理:解密过程是加密过程的逆过程,解密过程的一般方程是pi = (Ci – k(i mod m)) mod 26.

(2)、算法的代码实现(C语言)

#include <stdio.h>
#include <string.h>char plaintext[10010] = { 0 };
char ciphertext[10010] = { 0 };
int plain[10010] = { 0 };
int cipher[10010] = { 0 };char key[20] = { 0 };void vig_encrypt(char plaintext[], char key[]);
void vig_decrypt(char ciphertext[], char key[]);int main(){printf("该程序实现维吉尼亚密码。请输入密钥:\n");gets(key);int input;printf("请输入选项:1为加密;2为解密\n");scanf("%d", &input);if(input == 1){// 加密printf("请输入要加密的明文:");scanf("%s", plaintext);printf("加密结果:\n");vig_encrypt(plaintext, key);}else if(input == 2){// 解密printf("请输入要解密的密文:");scanf("%s", ciphertext);printf("解密结果:\n");vig_decrypt(ciphertext, key);}elseprintf("错误的选项(只能为1或2)。程序退出。");return 0;
}// 加密函数
void vig_encrypt(char plaintext[], char key[])
{int i;for(i = 0;i < strlen(plaintext); i ++){plain[i] = plaintext[i] - 'a';cipher[i] = (plain[i] + (key[(i % strlen(key))] - 'a')) % 26;ciphertext[i] = cipher[i] + 'a'; }puts(ciphertext);return;
}// 解密函数
void vig_decrypt(char ciphertext[], char key[])
{int i;for(i = 0;i < strlen(ciphertext); i ++){cipher[i] = ciphertext[i] - 'a';plain[i] = cipher[i] - (key[(i % strlen(key))] - 'a');if(plain[i] < 0){plain[i] += 26;}plaintext[i] = plain[i] + 'a'; }puts(plaintext);return;	
}

(3)、算法测试

密钥:lemon
明文:defuzongxiangsihua
密文:oirimzrslvlrsgvsym

运行截图:

加密过程:

在这里插入图片描述

解密过程:

在这里插入图片描述

四、参考文献

1、《密码编码学与网络安全——原理与实践(第七版)》(Cryptography and Network Security, Principles and Practice, Seventh Edition),【美】威廉 斯托林斯 William Stallings 著,王后珍等 译,北京,电子工业出版社,2017年12月。

2、《密码学实验教程》,郭华 刘建伟等 主编,北京,电子工业出版社,2021年1月。

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

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

相关文章

第一个 OpenGL 程序:旋转的立方体(VS2022 / MFC)

文章目录 OpenGL API开发环境在 MFC 中使用 OpenGL初始化 OpenGL绘制图形重置视口大小 创建 MFC 对话框项目添加 OpenGL 头文件和库文件初始化 OpenGL画一个正方形OpenGL 坐标系改变默认颜色 重置视口大小绘制立方体使用箭头按键旋转立方体深度测试添加纹理应用纹理换一个纹理 …

【电商API接口】挖掘电商数据常用的方法

电子商务模式是一个连接线上用户和线下商家的多边平台商业模式。O2O 商业模式将实体经济与线上资源融合在一起&#xff0c;使网络成为实体经济延伸到虚拟世界的渠道; 线下商业可以到线上挖掘和吸引客源&#xff0c;而消费者可以在线上筛选商品和服务并完成支付&#xff0c;再到…

CMake 实战构建TcpServer项目 静态库/动态库

爱编程的大丙CMake&#xff1a; 20. 举例 - 下_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV14s4y1g7Zj?p20&spm_id_frompageDriver&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 hehedalinux:~/Linux/LinuxServerCpp$ ls Buffer.cpp Log.h Buffe…

基于Java SSM框架实现学生综合考评管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现学生学生综合考评管理系统演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 学生综合考评管理系统&#xff0c;主要的模块包括查看&#xff1b;管理员&#xff1b;个…

知识分享:一文读懂AIGC与大模型

什么是大模型&#xff1f; 关于大模型&#xff0c;有学者称之为“大规模预训练模型”(large pretrained language model&#xff09;&#xff0c;也有学者进一步提出”基础模型”(Foundation Models)的概念。 “小模型”&#xff1a;针对特定应用场景需求进行训练&a…

音频文件格式–celt

CELT介绍 CELT 是一种开放、免版税的有损音频压缩格式&#xff0c;也是一种免费软件编解码器&#xff0c;具有特别低的算法延迟&#xff0c;适用于低延迟音频通信。这些算法是公开记录的&#xff0c;并且可以不受软件专利限制地使用。 CELT 是一种基于改进的离散余弦变换 (MD…

你还没脱单,这些软件都得背锅

不管你是否认可情人节概念&#xff0c;是否会在这天与自己的那个ta相聚&#xff0c;每个成年人都会或多或少地思考自己的感情问题。 在互联网兴盛之前&#xff0c;人与人的交往大都依靠职场关系和熟人介绍来结识新的对象&#xff0c;但也有媒人、婚姻介绍所等专门的职业为适龄…

基于Jackson自定义json数据的对象转换器

1、问题说明 后端数据表定义的id主键是Long类型&#xff0c;一共有20多位。 前端在接收到后端返回的json数据时&#xff0c;Long类型会默认当做数值类型进行处理。但前端处理20多位的数值会造成精度丢失&#xff0c;于是导致前端查询数据出现问题。 测试前端Long类型的代码 …

安卓接入google的Firebase登录教程

1.https://console.firebase.google.com创建安卓项目 2.添加google登录 3.添加项目的SHA证书指纹 4. FireBase自动生成&#xff08;API和服务&#xff09; https://console.cloud.google.com/apis/credentials?authuser1&projectbattle-against-darkness 5.下载goog…

3.3.2 CSMA/ CD协议

3.3.2 CSMA/ CD协议 CSMA/CD&#xff08;Carrier Sense Multiple Access with Collision Detection&#xff09;&#xff1a;载波监听多点接入/碰撞检测。 检测到碰撞后&#xff1a; 适配器立即停止发送。&#xff08;碰撞点后面的信号会一直叠加&#xff09;等待一段随机时间…

使用cURL和wget在Linux上进行HTTP请求和下载

在Linux上&#xff0c;cURL和wget是两个常用的命令行工具&#xff0c;用于发送HTTP请求和下载文件。下面我将详细介绍如何使用这两个工具进行HTTP请求和下载操作。 首先&#xff0c;让我们了解一下cURL。cURL是一个功能强大的命令行工具&#xff0c;可以用来发送各种类型的HTT…

WinEdt运行latex文件有eps图片编译不通过,各种报错解决办法

一、背景 我们在使用Winedt编辑并且编译Latex文件时&#xff0c;一般会选择PDFTeXify格式一键编译和生成pdf&#xff0c;如下图所示的选项&#xff0c;这样确实很方便&#xff0c;但经常会出现bug&#xff0c;例如转圈卡死&#xff0c;或编译不通过&#xff0c;报错Unknown gr…

【翻译】在Qt Designer中创建主窗口(Main Windows)

原文地址&#xff1a;https://doc.qt.io/qt-6/designer-creating-mainwindows.html Qt Designer 可用于为不同用途创建用户界面&#xff0c;并为每个用户界面提供不同类型的模板。主窗口模板用于创建具有菜单栏、工具栏和停靠窗口部件的应用程序窗口。 通过打开文件菜单并选择…

外观模式介绍

目录 一、外观模式介绍 1.1 外观模式定义 1.2 外观模式原理 1.2.1 外观模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、外观模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 类图 2.2.2 具体实现 2.2.2.1 灯光类 2.2.2.2 电视类 2.2.2.3 空调类 2.2.2.4 外观面板类…

Spring Cloud微服务基础入门

文章目录 发现宝藏前言环境准备创建第一个微服务1. 创建Spring Boot项目2. 创建微服务模块3. 编写微服务代码4. 创建一个简单的REST控制器 运行微服务 总结好书推荐 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

【leetcode刷题】模拟专题

模拟 一、替换所有的问号1、题目链接2、解析3、代码 二、提莫攻击1、题目链接2、解析3、代码 三、Z字形变换1、题目链接2、解析3、代码 四、外观数列1、题目链接2、解析3、代码 五、数青蛙1、题目链接2、解析3、代码 一、替换所有的问号 1、题目链接 leetcode链接 2、解析 3、…

【开源】基于JAVA语言的网上药店系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 药品类型模块2.3 药品档案模块2.4 药品订单模块2.5 药品收藏模块2.6 药品资讯模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 药品表3.2.3 药品订单表3.2.4 药品收藏表3.2.5 药品留言表…

装饰器模式介绍

目录 一、装饰器模式介绍 1.1 装饰器模式定义 1.2 装饰器模式原理 1.2.1 模式类图 1.2.2 模式角色说明 1.2.3 举例代码 二、装饰器模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 类图 2.2.2 类图说明 2.2.3 具体实现 2.2.3.1 DataLoader类 2.2.3.2 BaseFileDataLoa…

初学者必知的微软.NET6开发环境相关技术介绍

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;我小时候喜欢看小人书&#xff08;连环画&#xff09;&#xff0c;在那个没有电视、没有手机的年代&#xff0c;这是…

企业数据挖掘平台哪家好?听听客户的真实反馈

泰迪大数据挖掘企业服务平台让数据创造更大的价值&#xff0c;具有拖曳式、免开发建模、可私有化部署、可提供源代码方便定制、全面培训服务丰富模型参考专业建模人员服务等特点。 听听客户真实反馈&#xff1a; 大数据挖掘企业服务平台包含四大产品服务&#xff0c;分别为&…