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

实验五、古典密码(中)

实验目的和原理简介参见博客:古典密码(上)

一、实验内容

1、弗纳姆密码(Vernam Cipher)

(1)、算法原理

加密原理:
加密过程可以用方程 ci = pi (+) ki 表示,其中 pi 是明文第 i 个二进制位,ki 是密钥第 i 个二进制位,ci 是密文第 i 个二进制位,(+) 是异或运算符。密文是通过对明文和密钥的逐位异或而成的。

解密原理:
根据异或运算的性质,解密过程可以用方程 pi = ci (+) ki 表示,其中 pi 是明文第 i 个二进制位,ki 是密钥第 i 个二进制位,ci 是密文第i个二进制位,(+) 是异或运算符。

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

使用文件进行读/写,而非从终端中直接输入明/密文。(此程序存在bug,正在修复中)

#include <stdio.h>
#include <string.h>char plaintext[10010] = { 0 };  // 明文
char ciphertext[10010] = { 0 };  // 密文char key[10010] = { 0 };  // 密钥void encrypt(char plaintext[], char key[]);  // 加密函数
void decrypt(char ciphertext[], char key[]);  // 解密函数int main()
{char a;int i = 0;printf("该程序实现弗纳姆密码。请输入密钥:\n");gets(key);int input;printf("请输入选项:1为加密;2为解密\n");scanf("%d", &input);if(input == 1){// 加密printf("******加密中******\n\n");encrypt(plaintext, key);printf("******加密完成******\n");}else if(input == 2){// 解密printf("******解密中******\n\n");decrypt(ciphertext, key);printf("******解密完成******\n");}elseprintf("错误的选项(只能为1或2)。程序退出。");return 0;
}void encrypt(char plaintext[], char key[])
{FILE *in, *out;in = fopen("input1.txt", "r");out = fopen("output1.txt", "w");char a;int i;int j;while((a = fgetc(in)) != EOF){plaintext[i ++] = a;}for(j = 0;j < i;j ++){ciphertext[j] = plaintext[j] ^ key[j % strlen(key)];}fputs(ciphertext, out);fclose(in);fclose(out);return;
}void decrypt(char ciphertext[], char key[])
{FILE *in, *out;in = fopen("input2.txt", "r");out = fopen("output2.txt", "w");char a;int i;int j;while((a = fgetc(in)) != EOF){ciphertext[i ++] = a;}for(j = 0;j < i;j ++){plaintext[j] = ciphertext[j] ^ key[j % strlen(key)];}fputs(plaintext, out);fclose(in);fclose(out);return;	
}

(3)、算法测试

加密过程演示:

明文:(位于input1.txt中):

Here lies a toppled god - His fall was not a small one. We did but build his pedestal, A narrow and a tall one. - Tleilaxu Epigram

(语出弗兰克·赫伯特 Frank Herbert 的《沙丘:救世主 Dune: Messiah》,简单翻译过来是:这里躺着一个被推翻的神明——他轰然倒下。我们未曾有他助——只是将他供奉起来,让他如履薄冰。)

密钥:crucible (考验)

(插一句,借鉴(特别是二战)历史和经典谍战电影,双方在加密通信时使用某本书中约定好的某个单词,这里crucible是《沙丘:救世主》(原)书第125页的第1个单词。)

密文:(位于output1.txt中,为非打印(可见)字符。)

运行截图:

在这里插入图片描述

解密过程演示(恢复明文):

密文:(位于input2.txt中,内容为加密后的输出)

密钥:crucible(和加密过程所用密钥相同)

明文:(位于output2.txt中):

Here lies a toppled god - His fall was not a small one. We did but build his pedestal, A narrow and a tall one. - Tleilaxu Epigram

运行截图:

在这里插入图片描述

2、栅栏密码(Fence Cipher)

(1)、算法原理

加密原理:
栅栏密码按照列的顺序将明文(去掉空格)写入m行n列的数组,按照行的顺序将字符重新组合得到密文,这种方式称为m栏栅栏密码。

解密原理:
首先将密文分成n组,n为数组的行数,然后按照列的顺序将密文进行重新组合,最后将组合后的字符拼接起来,得到密文。

直观举例:

明文:
One Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them…

(语出J.R.R. 托尔金《魔戒 The Lord of the Rings》卷首,拙劣翻译为:一戒统御众人,一戒寻其踪迹,一戒召其而来,将其束于黑暗。)

首先去掉标点,变成:
OneRingtorulethemallOneRingtofindthemOneRingtobringthemallandinthedarknessbindthem,一个长“单词”,共82个字母:

在这里插入图片描述

写成一个10行9列(多余2个字母)的矩阵,竖读为明文,横读为密文:

在这里插入图片描述

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

#include <stdio.h>
#include <string.h>char plaintext[10010] = { 0 };
char ciphertext[10010] = { 0 };
char table[10010][10010] = { '*' };void encrypt(char plaintext[], int n);
void decrypt(char ciphertext[], int n);int n;  //行数 
int i, j, k;
int a, b; //len = a * n + b
int len;  //明文、密文的长度 int main()
{	int input;printf("该程序实现栅栏密码。请输入选项:1为加密;2为解密\n");scanf("%d", &input);if(input == 1){// 加密printf("请输入要加密的明文:\n");scanf("%s", plaintext);printf("请输入行数:\n");scanf("%d", &n);printf("加密结果:\n");encrypt(plaintext, n);}else if(input == 2){// 解密printf("请输入要解密的密文:\n");scanf("%s", ciphertext);printf("请输入行数:\n");scanf("%d", &n);printf("解密结果:\n");decrypt(ciphertext, n);}elseprintf("错误的选项(只能为1或2)。程序退出。");return 0;
}void encrypt(char plaintext[], int n)
{for(j = 0;j < n;j ++){for(i = 0;i < strlen(plaintext);i ++){if(i % n == j){putchar(plaintext[i]);}}}return;
}void decrypt(char ciphertext[], int n)
{k = 0;len = strlen(ciphertext);a = len / n;b = len - a * n;//printf("%d %d", a, b);for(i = 0;i < b;i ++){for(j = 0;j < a + 1;j ++){table[i][j] = ciphertext[k ++];}}for(i = b;i < n;i ++){for(j = 0;j < a;j ++){table[i][j] = ciphertext[k ++];}}for(j = 0;j < a;j ++){for(i = 0;i < n;i ++){putchar(table[i][j]);}}for(i = 0;i < b;i ++){putchar(table[i][a]);}return;
}

(3)、算法测试

使用上述例子中的明文进行测试,n(行数)为10.

加密过程:

在这里插入图片描述

解密过程:

在这里插入图片描述

成功恢复出明文。

二、参考文献

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

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

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

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

相关文章

【跳槽面试】Redis中分布式锁的实现

分布式锁常见的三种实现方式&#xff1a; 数据库乐观锁&#xff1b;基于Redis的分布式锁&#xff1b;基于ZooKeeper的分布式锁。 本地面试考点是&#xff0c;你对Redis使用熟悉吗&#xff1f;Redis中是如何实现分布式锁的。 在Redis中&#xff0c;分布式锁的实现主要依赖于R…

对比一下HelpLook和Bloomfire知识库软件:谁更胜一筹?

在当今知识经济的浪潮中&#xff0c;知识库工具作为企业不可或缺的利器&#xff0c;对于提高工作效率、加强团队协作和优化员工培训等方面起着至关重要的作用。HelpLook和Bloomfire是众多知识库工具中的两款佼佼者&#xff0c;它们各自拥有独特的优势和特点。 一、HelpLook&…

解决 java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader 报错

在使用POI导出Excel表格的时候&#xff0c;本地运行导出没问题&#xff0c;但是发布到服务器后提示 “java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader” 下面是pom.xml中的配置 <dependency><groupId>org.apache.poi</groupId><art…

Linux查找二进制文件命令——whereis

whereis whereis 命令是一个 Linux/Unix 系统下的命令行命令&#xff0c;用于查询指定命令或程序的二进制文件、源代码文件和帮助文件的位置。 whereis 命令的语法如下&#xff1a; whereis [options] command其中&#xff0c;command 为要查询的命令或程序名称&#xff0c;…

【算法详解】力扣162.寻找峰值

​ 目录 一、题目描述二、思路分析 一、题目描述 力扣链接&#xff1a;力扣162.寻找峰值 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个…

大创项目推荐 深度学习验证码识别 - 机器视觉 python opencv

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x…

Webpack5入门到原理15:提取 Css 成单独文件

提取 Css 成单独文件 Css 文件目前被打包到 js 文件中&#xff0c;当 js 文件加载时&#xff0c;会创建一个 style 标签来生成样式 这样对于网站来说&#xff0c;会出现闪屏现象&#xff0c;用户体验不好 我们应该是单独的 Css 文件&#xff0c;通过 link 标签加载性能才好 …

gin介绍及helloworld

1. 介绍 Gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确&#xff0c;具有快速灵活&#xff0c;容错方便等特点 对于golang而言&#xff0c;web框架的依赖要远比Python&#xff0c;Java之类的要小。自身的net/http足够简单&…

未来 AI 可能给哪些产业带来哪些进步与帮助?

AI时代如何要让公司在创新领域领先吗&#xff1f;拥抱这5种创新技能&#xff0c;可以帮助你的公司应对不断变化。包括人工智能、云平台应用、数据分析、 网络安全和体验设计。这些技能可以帮助你提高业务效率、保护公司知识资产、明智决策、满足客户需求并提高销售额。 现在就加…

Redis 面试题 | 01.精选Redis高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Java 代理模式详解

1. 代理模式 代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问&#xff0c;这样就可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能。 代理模式的主要作用是扩展目标对象…

低代码技术杂谈

一、探讨低代码的定义 “Low-Code”是什么&#xff1f;身为技术人员听到这种技术名词&#xff0c;咱们第一反应就是翻看维基百科 或者其他相关技术论文&#xff0c;咱们想看维基百科的英文介绍&#xff1a; A low-code development platform (LCDP) provides a development env…

AI辅助编程工具—Github Copilot

一、概述 Copilot是一种基于Transformer模型的神经网络&#xff0c;具有12B个参数。是GitHub和OpenAPI共同开发的编程辅助工具。GitHubCopilot是一款由人工智能驱动的结对编程编辑器&#xff0c;旨在帮助开发人员更加高效地工作。它利用OpenAICodex技术&#xff0c;将开发…

数据仓库简介

一、数仓概念 数据仓库&#xff0c;英文名称为Data Warehouse&#xff0c;可简写为DW或DWH。数据仓库&#xff0c;是为企业所有级别的决策制定过程&#xff0c;提供所有类型数据支持的战略集合。它是单个数据存储&#xff0c;出于分析性报告和决策支持目的而创建。 为需要业务…

套接字通信(附带单线程TCP套接字通信代码)

套接字-Socket 1. 概念 1.1 局域网和广域网 局域网&#xff08;LAN&#xff09;和广域网&#xff08;WAN&#xff09;是两种不同范围的计算机网络&#xff0c;它们用于连接多台计算机以实现数据共享和通信。 局域网&#xff08;LAN&#xff09;&#xff1a; 定义&#xff1…

这是一款关于网页自动化操作的软件

背景 有开发这款软件的想法是因为工作中有部分任务重复性太多&#xff0c;作为开发工程师&#xff0c;一开始自己写了脚本完成了这些任务。换个思路&#xff0c;各行各业中也会遇到重复性工作&#xff0c;但是并不是每个人都会开发&#xff0c;那本人就想有没有一种软件也可以…

基于JavaWeb+SSM+Vue基于微信小程序生鲜云订单零售系统的设计和实现

基于JavaWebSSMVue基于微信小程序生鲜云订单零售系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计…

[C++开发 03 _ 模板(167)]

知识点1&#xff1a;模板 1.1模板的概念 模板的特点&#xff1a; 模板不可以直接使用&#xff0c;它只是一个框架模板的通用并不是万能的 1.2函数模板 1.2.1函数模板语法 函数模板的引入&#xff1a; 函数模板的举例&#xff1a; 总结&#xff1a; 函数模板利用关键字template…

git使用的常用指令

git作为一个版本控制工具&#xff0c;和maven并合称为实习的两大杀手工具。今天我来给大家介绍一下git的常用指令&#xff0c;帮助大家在实习和多人协同开发的时候提供一些帮助。 找到git管理的文件夹 命令1 git init 这个命令是为了初始化本地库 命令2 查看当前的git状态…

C# 程序结构

文章目录 前言一、C# 程序结构命名空间&#xff08;Namespace&#xff09;类&#xff08;Class&#xff09;方法&#xff08;Method&#xff09;语句&#xff08;Statement 二 、简单的C#程序结构示例示例代码分析第一个Hello World 程序总结 前言 C#基础学习入门系列- C# 程序…