信息安全导论 实验一 古典密码学

article/2025/9/25 6:48:28

一、实验目的与原理

1.实现古典密码学中的移位密码算法和维吉尼亚算法。

2.了解两种算法的原理,并且编写出来。

3.使用语言为C++或者Python等。

二、实验内容与记录

位移密码算法:

移位密码算法

在加密的时候需要注意大小写的转换,这个可以调用c++的<sstream>库中的函数进行解决。

1) 算法原理

a) 移位密码就是对26个字母进行移位操作,可以移动任意位数,这样就实现了对明文的加密,移位操作简单易行,因此,加密解密比较简单。

b) 移位密码的基本思想:移位密码算法 c=m+k(mod 26),k可以使0<k<26的任意整数。加密算法:x=x+k(mod26),解密算法x=x-k(mod 26)。当K=3,时,为凯撒密码。

2) 算法参数

移位密码算法主要有c、m、k 三个参数。c 为密文,m 是明文,k 为密钥。

输入

第一行输入表明是加密还是解密,0是加密,1是解密;

第二行是加密或解密密钥,是0<k<26之间的一个整数;

第三行是明文或密文。

输出

输出是明文或密文。

输入样例1 

0
6
wearesztuers
1
6
CKGXKYFZAKXY

输出样例1

CKGXKYFZAKXY
wearesztuers

代码:

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<sstream>
using namespace std;
string fx1(string text, int x, int y) {char cha = ' ';string truein;if (y == 0) {x = -1 * x;}char location = 'a';int length = 26;for (int i = 0; i < text.length(); i++) {//最终返回的字符串bool pan = false;char str = text[i];//判断是否大小写if (isupper(str)) {pan = true;//大写字母转换为小写str = tolower(str);}//位置改变int prelocation = str - location;//算法执行int offset = (prelocation + x) % length;if (offset < 0) {offset += length;}cha = (char)(location + offset);//小写转换大写if (!pan) {cha = toupper(cha);}truein += cha;}return truein;
}
int main()
{for(int j=0;j<2;j++) {//way是加密或者解密,key是密钥,text1是密文 int way, key, temp;string text1;cin >> way >> key;cin >> text1;int cost;if (way == 0) {cost = 1;}else {cost = 0;}string text2=fx1(text1, key, cost);cout<<text2<<endl;text2=" ";}
}

维吉尼亚算法:

维吉尼亚算法与移位算法相近,维吉尼亚算法可以想象成:应用到一个二维表格,横坐标是密钥,纵坐标是明文,两者相交的点是密文。

1) 算法原理

a) Vigenere密码是由法国密码学家Blaise de Vigenere于1858年提出的一种代换密码,它是多表代换密码的典型代表。

b) 定义:设m为某一固定的正整数,P、C和K分别为明文空间、密文空间和密钥空间,并且P=K=C=(Z26)m,对一个密钥k=(k1,k2,…,km),定义维吉尼亚密码的加解密算法如下:

Vigenere密码加密算法: ek(x1,x2,…,xm)=(x1+k1,x2+k2,…,xm+km)

Vigenere密码解密算法: dk(y1,y2,…,ym)=(y1-k1,y2-k2,…,ym-km)。

其中k=(k1,k2,…,km)是一个长为m的密钥字,密钥空间的大小为26m,所以对一个相对小的m,穷举密钥也需要很长的时间。如m=7,则密钥空间大小超过8×109,所以手工搜索非常困难。当明文的长度超过m时,可将明文串按长度m分局,然后对每一组使用密钥k加密。

2) 算法参数

Vigenere密码算法主要有c、m、k三个个参数。c为密文,m是明文,k为密钥。

输入

第一行输入明文

第二行输入密钥

输出

第一行输出密文

第二行输出密文解密后得到的明文

输入样例1

xipuyangguang
best

输出样例1

ymhnzefzhysgh
xipuyangguang

代码:

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<sstream>
#include <algorithm>
using namespace std;
//加密函数 
string fx1(string x, string y, int temp) {string truein;char cha = ' ';//定义起始末尾,长度等 char location = 'a';int index = 0, length = 26;transform(y.begin(), y.end(), y.begin(), ::tolower);for (int i = 0; i < x.length(); i++) {bool pan = false;char str = x[i];//判断大小写字母 if (isupper(str)) {pan = true;str = tolower(str);}//计算相对长度 index %= y.length();int nextlocation = str - location;int way = y[index] - location;if (temp == 0) {way = way * -1;}int offset = (nextlocation + way) % length;if (offset < 0) {offset += length;}cha = (char)(location + offset);if (pan) {cha = toupper(cha);}truein += cha;index++;}return truein;
}
//解密函数
string fx2(string x, string y, int temp) {string truein;char cha = ' ';//定义起始末尾,长度等 char location = 'a';int index = 0;int length = 26;//小写转换transform(y.begin(), y.end(), y.begin(), ::tolower);for (int i = 0; i < x.length(); i++) {bool pan = false;char str = x[i];//判断大小写字母 if (isupper(str)) {pan = true;str = tolower(str);}//计算相对长度 index %= y.length();int prelocation = str - location;int way = y[index] - location;if (temp == 0) {way = way * -1;}int offset = (prelocation + way) % length;if (offset < 0) {offset += length;}cha = (char)(location + offset);if (pan) {cha = toupper(cha);}truein += cha;index++;}return truein;
}
int main() {string x, y;cin >> x >> y;//加密函数 string str1 = fx1(x, y, 1);cout << str1 << endl;//解密函数 string str2 = fx2(str1, y, 0);cout << str2;
}


http://chatgpt.dhexx.cn/article/QbrnWQDM.shtml

相关文章

古典密码之维吉尼亚密码实验

学习目标&#xff1a; 维吉尼亚密码是古典密码中非常具有代表的例子。本实验要求用高级语言编写和调试一个简单的维吉尼亚密码实现及解密程序&#xff0c;通过本实验可以加深理解维吉尼亚密码原理。 预备知识&#xff1a; 人们在单一恺撒密码的基础上扩展出多表密码&#xff…

【密码学算法实现】古典密码

文章目录 2.1 代替技术2.1.1 仿射密码2.1.2 单表代替密码2.1.3 Hill密码Hill密码的已知明文攻击 2.1.4 Vigenere密码 2.2 置换技术2.2.1 栅栏密码2.2.2 矩阵密码 作为较为朴素的密码体系&#xff0c;古典密码通常都是对称的。如下图所示&#xff0c;对称密码通常是加密方与解密…

密码学-古典密码学习笔记

文章目录 参考资料替代技术单字母表替代密码凯撒密码移位密码仿射密码针对单字母表替代密码的攻击 多字母表替代密码Vigenere密码Hill密码(希尔密码) 置换技术置换密码的定义案例 本文作为一篇学习笔记&#xff0c;在图片和文字上大量参考了各种密码学书籍&#xff0c;并添加了…

古典密码算法实验c语言,古典密码实验报告.doc

古典密码实验报告.doc 哈尔滨工程大学实验报告实验名称古典密码算法班级学号姓名实验时间2014年4月成绩指导教师实验室名称哈尔滨工程大学实验室与资产管理处制一、实验名称古典密码算法2、实验目的通过编程实现经典的代替密码算法和置换密码&#xff0c;包括移位密码、维吉尼…

古典密码学学习笔记

1.历史 古典密码阶段&#xff1a;1949年以前 近代密码阶段&#xff1a;1949-1975年 现代密码阶段&#xff1a;1976年至今 2.加密方法 古典密码学的加密方法主要有两大类&#xff1a;替代和置换&#xff0c;或者是两者的结合 3.基本密码 1.键盘布局加密 这是一种比较简单也…

古典密码

古典密码将明文的每一个字母代换为字母表中的另一个字母&#xff0c;代换前现将明文字母用等价的十进制数字代替&#xff0c;使用十进制进行运算。 字母abcdefghijklm数字0123456789101112 字母nopqrstuvwxyz数字13141516171819202122232425 根据代换是对每个字母逐个进行还是…

初学古典密码

古典密码 目录 古典密码 Wiki篇 二&#xff0c;凯撒密码Caesar&#xff1a; 三&#xff0c;移位密码 四&#xff0c;Atbash Cipher&#xff08;埃特巴什码&#xff09;&#xff1a; 五&#xff0c;简单替换密码 六&#xff0c;仿射密码(affine cipher&#xff09; 多表…

简单古典密码

1. 简单移位密码 m "{easy_easy_crypto}" k 3124 明文所在位置1234密文所在位置3124 flag{easy_easy_crypto}lafgea{s_eyay_scyprt}o 攻击方法:肉眼识别/爆破秘钥/根据flag字符串逆推 2. 曲路密码 明文填入一个表中&#xff0c;并按照一定的曲路遍历攻击方法…

古典密码技术

古典密码技术 古典密码是密码学中的其中一个类型&#xff0c;其大部分加密方式都是利用替换式密码或移项式密码&#xff0c;有时则是两者的混合。其于历史中经常使用&#xff0c;但在现代由于计算机的出现&#xff0c;使得古典密码解密已经不再困难&#xff0c;已经很少使用&a…

古典密码简记

目录 概述 传统隐写 替换密码技术 换位密码技术&#xff1a; 安全性分析 概述 古典密码只是对字母进行变换&#xff0c;而现代密码算法是对比特流进行变换。 古典密码技术比较简单&#xff0c;通常 采用手工或机械操作来对明文进行加密和解密的。&#xff08;例&#xf…

常见古典密码

古典密码 文章目录 古典密码前言1.Affine(仿射加密)2.Bacon(培根加密)3.Brainfuck4.Caesar(凯撒加密)5.Fence(栅栏加密)6.Fenham(费纳姆加密)7.Morse(摩斯密码)8.Pigen(猪圈加密)9.Vigenere(维吉尼亚加密) 前言 系统的学习了一下古典密码&#xff0c;这里大概整理一下主要的加…

古典密码学

主要划分方式及其分类 按密钥方式划分&#xff1a;对称&#xff0c;非对称 按明文处理方式分&#xff1a;块密码&#xff0c;流密码 按编制原理划分&#xff1a;代换&#xff0c;置乱 对称加密算法 对称加密算法 对称加密算法&#xff08;synmetric algorithm&#xff09;&…

古典密码总结

古典密码 凯撒密码凯撒位移&#xff08;中文版&#xff09; 栅栏密码棋盘密码乘法密码仿射密码希尔密码摩斯电码猪圈密码键盘密码参考 凯撒密码 加密公式&#xff1a;密文 (明文 位移数) Mod 26 解密公式&#xff1a;明文 (密文 - 位移数) Mod 26 凯撒位移&#xff08;中…

古典密码(部分合集)

古典密码 一. 移位密码1. 简单移位密码2. 曲路密码3. 云影密码4. 栅栏密码 二. 代替密码单表代替密码1.凯撒密码2.ROT133.埃特巴什密码4.经典单表替代密码5.摩斯密码6.培根密码7.图形替换密码猪圈密码圣堂武士密码标准银河密码 8.仿射密码 多表代替密码1.棋盘密码PlayfairPolyb…

密码学:古典密码.

密码学&#xff1a;古典密码. 古典密码是密码学的一个类型&#xff0c;大部分加密方式是利用替换式密码或移项式密码&#xff0c;有时是两者的混合。古典密码在历史上普遍被使用&#xff0c;但到现代已经渐渐不常用了。一般来说&#xff0c;一种古典密码体制包含一个字母表(如…

古典密码汇总。

一、密码类型汇总 23、维吉尼亚密码&#xff08;Vigenre Cipher&#xff09; 【Vigenre Cipher】 由于频率分析法可以有效的破解单表替换密码&#xff0c;法国密码学家维吉尼亚于1586年提出一种多表替换密码&#xff0c;   即维吉尼亚密码&#xff0c;也称维热纳尔密码。维…

SourceTree的使用

SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端&#xff0c;拥有可视化界面&#xff0c;容易上手操作。同时它也是Mercurial和Subversion版本控制系统工具。支持创建、提交、clone、push、pull 和merge等操作。 二、下载安装SourceTree步骤 1、下载地址&#xf…

SourceTree使用教程图文详解

作者的其他平台&#xff1a; | CSDN&#xff1a;https://blog.csdn.net/qq_41153943 | 掘金&#xff1a;https://juejin.cn/user/651387938290686 | 知乎&#xff1a;https://www.zhihu.com/people/1024-paper-96 | GitHub&#xff1a;https://github.com/JiangXia-1024?t…

Sourcetree打开之后,闪退,问题处理

1、环境&#xff1a;win11 Sourcetree版本3.4.7 2、处理办法&#xff0c;在资源管理器地址栏输入“%LocalAppData%\Atlassian”&#xff0c;删掉“SourceTree.exe_Url_ampbpf5kvqim4xxkhaykobjynfannkxz”&#xff08;非SourceTree目录&#xff09;&#xff0c;打开正常。

Sourcetree查看某个文件提交历史记录

1、在文件状态右上角搜索要查看的文件名 2、选择查看的文件名右键 点击变更历史即可