古典密码实验一
密码学-实验一古典密码算法
![密码学-实验一古典密码算法](https://img.taocdn.com/s3/m/8e317216a7c30c22590102020740be1e650ecc15.png)
第1页 实验一 古典密码算法1、目的使学生认识理解古典密码算法:凯撒密码算法,维吉尼亚密码算法。
2、环境PC 1 PC 1 台、安装软件台、安装软件VC60VC60、、JBuilder8JBuilder8、、Delphi7Delphi7。
3、预备知识 1.凯撒密码的过程: 表1:字母编码表0 1 2 3 4 5 6 7 8 9 10 11 12a b c d e f g h i j k l m13 14 15 16 17 18 19 20 21 22 23 24 25 n o p q r s t u v w x y z 再用配对字母取代信息里的原始字母位移加密法(shift cipher):模数计算。
算。
E E k (x)=(x+k)mod 26(x)=(x+k)mod 26,,D k (y)=(y (y)=(y ––k)mod 26 如:如:k=5;k=5;k=5;““hello world hello world””加密为:加密为:mjqqt mjqqt ….2.维吉尼来密码维吉尼来方阵:(不区分大小写)数学表达式:[]([][])%26;C i P i K i =+ 验证:验证:V[0V[0V[0,,0]=00]=0;;V[25V[25,,25]=24 V[13V[13,,12]=25 0 1 2 3 4 5 6 7 8 9 10 11 12a b c d e f g h i j k l m 13 14 15 16 17 18 19 20 21 22 23 24 25 n o p q r s t u v w x y z 解密:[]([][])%26;P i C i K i =-如:如:k=k=k=””BEST BEST””;“HELLO WORLD WORLD”加密为:”加密为:”加密为:IIDE IIDE …. 4字符一组:字符一组: hell OWOR LDBEST BEST BEST 以第一行字母为列标,2行为行标(为行标(B B ,H )=I =I;; 解密:IIDEBEST BEST,,明文字母是B 行字母为I 的列号H ,或B 列=I 的行H 。
实验一 古典密码—单表代换
![实验一 古典密码—单表代换](https://img.taocdn.com/s3/m/34705f721711cc7931b71674.png)
实验一古典密码—单表代换【实验目的】理解代换密码的基本思想理解移位密码、仿射密码等算法的原理掌握上述各个算法的输入输出格式和密钥格式掌握上述各个算法的加解密过程和实现方法【实验原理】代换密码体制的一般定义为M=C=K=Z26,其中M为明文空间、C为密文空间、K为密钥空间、Z26为26个整数(对应26个英文字母)组成的空间;要求26个字母与模26的剩余类集合{0,1,2,…,25}建立一一对应的关系。
一、移位密码移位密码的加密实现上就是将26个英文字母向后循环移动k位,其加解密可分别表示为:c=E k(m)=m+k(mod 26)m=D k(c)=c-k(mod 26)其中,m、c、k是满足0≤m,c,k≤25的整数。
二、乘法密码乘法密码是通过对字母等间隔抽取以获得密文,其加解密可分别表示如下:-1c=mk(mod 26)m=ck(mod26)其中,m、c、k是满足0≤m,c,k≤25,且gcd(k,26)=1的整数。
三、仿射密码仿射密码的加密是一个线性变换,将移位密码和乘法密码相结合,其加解密可分别表示为:C=E a,b(m)=am+b(mod 26)M=D a,b(C)=a-1(c-b)(mod 26)其中:a、b是密钥,是满足0≤a,b≤25和gcd(a,26)=1的整数,即a和26互素;a-1的逆元,即a•a-1≡1 mod 2【实验环境】ISES客户端Microsoft CLR Debugger 2005或其它调试器【实验内容】通过运算器工具实现移位密码、乘法密码、仿射密码对各个算法的加解密进行扩展实验和算法跟踪【实验步骤】此处以移位密码为例说明,乘法密码、仿射密码可参照完成。
一、加解密计算(一) 加密(1) 参照实验原理,在明文栏输入所要加密的明文,在密钥栏输入相应的密钥,如下图1.1-2所示。
图 1.1-2(2) 点击“加密”按钮,在密文文本框内就会出现加密后的密文,如图1.1-3所示。
古典密码的实验报告
![古典密码的实验报告](https://img.taocdn.com/s3/m/3fe2abff970590c69ec3d5bbfd0a79563d1ed440.png)
古典密码的实验报告古典密码的实验报告引言:密码学作为一门古老而又神秘的学科,一直以来都吸引着人们的兴趣。
在古代,人们用各种各样的密码来保护重要信息的安全性。
本实验旨在通过实际操作,探索古典密码的加密原理和破解方法,从而深入了解密码学的基本概念和应用。
一、凯撒密码凯撒密码,又称移位密码,是最简单的一种古典密码。
其原理是通过将明文中的每个字母按照一定的规则进行移位,得到密文。
在本实验中,我们选择了一个简单的凯撒密码进行破解。
首先,我们选择了一段明文:“HELLO WORLD”,并将其按照凯撒密码的规则进行移位,假设移位数为3,则得到密文:“KHOOR ZRUOG”。
接下来,我们尝试使用暴力破解的方法来还原明文。
通过尝试不同的移位数,我们发现当移位数为3时,得到的明文与原文完全一致。
这表明我们成功地破解了凯撒密码,并还原了原始的明文。
二、维吉尼亚密码维吉尼亚密码是一种基于多个凯撒密码组合而成的密码算法。
其原理是通过使用不同的移位数对明文进行加密,从而增加了密码的复杂度。
在本实验中,我们选择了一段明文:“CRYPTOGRAPHY”,并使用维吉尼亚密码进行加密。
我们选择了一个关键词“KEY”作为加密密钥。
首先,我们将关键词“KEY”重复至与明文长度相同,得到“KEYKEYKEYKEYK”。
然后,将明文中的每个字母与关键词中对应位置的字母进行凯撒密码的移位操作。
经过加密后,我们得到了密文:“LXFOPVEFRNHR”。
接下来,我们尝试使用破解方法来还原明文。
通过尝试不同的关键词和移位数的组合,我们发现当关键词为“KEY”且移位数为3时,得到的明文与原文完全一致。
这表明我们成功地破解了维吉尼亚密码,并还原了原始的明文。
三、栅栏密码栅栏密码是一种基于换位操作的密码算法。
其原理是通过将明文中的字母按照一定的规则进行重新排列,得到密文。
在本实验中,我们选择了一段明文:“HELLO WORLD”,并使用栅栏密码进行加密。
实验一古典密码-Vigernere算法实验-2022
![实验一古典密码-Vigernere算法实验-2022](https://img.taocdn.com/s3/m/8c233eba970590c69ec3d5bbfd0a79563c1ed447.png)
实验一古典密码-Vigernere算法实验-2022一、实验目的1、理解简单加密算法的原理;2、掌握Vigenere密码的原理,完成Vigenere密码加解密程序的编写;3、通过实验,加深对古典密码体制的了解,掌握对字符进行灵活处理的方法。
二、实验预习提示1、多表代换密码多表代换密码是指以一系列(两个以上)代换表一次对明文消息空间中的明文消息元素进行代换的加密方法。
如果代换序列为非周期的无限序列,即对每个明文字母都采用不同的代换表(或密钥)进行加密,则相应的密码称为一次一密钥密码。
一次一密钥密码是理论上唯一不可破译的密码,可称为是无条件安全的。
如果一个密码体制被称为是无条件安全的,即是指即便提供无穷的计算资源,密码分析者也无法攻破该密码体制。
如果一个密码体制被称为是计算安全的,则是指密码分析者根据可利用的资源无法攻破该密码体制。
由于一次一密钥密码需要的密钥量和明文消息长度相同,因而难以广泛使用。
为了减少密钥量,在实际应用中多采用周期多表代换密码,即代换表个数有限,重复地使用。
典型的多表代换密码包括维吉尼亚(Vigenere)密码、博福特(Beaufort)密码、滚动密钥(running-key)密码、弗纳姆(Vernam)密码和转轮(rotormachine)密码等。
2、Vigenere密码概述Vigenere密码译为维吉尼亚密码或维热纳尔密码,维吉尼亚密码曾多次被发明。
该方法最早记录在吉奥万巴蒂斯塔贝拉索(GiovanBattitaBellao)于1553年所著的书《吉奥万巴蒂斯塔贝拉索先生的密码》(意大利语:Lacifradel.Sig.GiovanBattitaBellao)中。
然而,后来在19世纪时被误传为是法国外交官布莱斯德维吉尼亚(BlaieDeVigenère)所创造,因此现在被称为“维吉尼亚密码”。
3、Vigenere密码Vigenere密码是使用一系列恺撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。
实验一古典加密算法的实现
![实验一古典加密算法的实现](https://img.taocdn.com/s3/m/7f54e348783e0912a2162aac.png)
凯撒密码映射表
明 A B C D E 文 密 D E F G H 文 F G H I J K L M I J K L M N O P
明 N O P Q R 文
S T U V W X Y Z
密 Q R S T U V W X Y Z撒密码的算法,对”Thisisanew term”进行加密 • 要求:(1)
要求
• 以密钥为:m*n=3 * 4,以及f= ((1234)(2413))对” ENGINEERING” 进行: • 要求:(1)
– 输入: ENGINEERING – 输出:(密文)
• (2)
– 输入:密文 – 输出: ENGINEERING
实验一 古典加密算法的实现
• 实验目的:
– 通过编程实现凯撒密码算法和矩阵换位密码算 法,加深对古典密码体制的了解。
• 实验原理:
– 古典加密算法的实验原理(详见下文ppt)
• 实验环境:
– 运行Windows操作系统的PC,TC编译环境
(1)凯撒密码加密算法
• 典型的单表代替密码是凯撒密码。 • 凯撒密码是最古老的代替密码,以英文26个字母 为例,它用D表示A,用E表示B,用F表示C,…, 用C表示Z,即:密文字母是明文字母后面的第三 个位置上的字母。这种映射关系表示为如下函数: • F(a)=(a十k)mod n • 其中:a表示明文字母,n为字符集中字母 个数,k=3为密钥。(移位密码、加法密码)
– 输入:Thisisanewterm – 输出:(密文)
• (2)
– 输入:密文 – 输出:Thisisanewterm
思考题:矩阵换位密码算法的实现
• 把明文中的字母按给定的顺序安排在一矩阵中,然 后用另一种顺序选出矩阵的字母来产生密文。 • 例:明文ENGINEERING按行排在3 × 4矩阵中,最 后一行不全用ABC…填充。 • E N G I 给置换f=((1234)(2413)) NIEG • N E E R ERNE • I NG A NAIG • 得到密文:NIEGERNENAIG • 密钥为:m*n=3 * 4,以及f= ((1234)(2413)) • 即:k=(m * n,f)
实验一古典密码算法
![实验一古典密码算法](https://img.taocdn.com/s3/m/531b3422ba1aa8114431d9f9.png)
实验一古典密码加密算法【实验目的】一般的密码学实验要求学习者编写实现加密法或分析工具的程序,但这势必要占用学习者较多的时间去调试程序,减少真正学习密码学的时间。
分析加密程序CAP是一款密码加密与分析的软件,包含了古典密码学和现代密码学常用的密码算法和分析工具。
学习者可以利用CAP更好地学习加密和密码分析技术,而不必花费大量的时间调试程序。
b5E2RGbCAP【实验目的】1、理解代替密码学加密过程;2、掌握置换密码学加密过程;3、自行设计恺撒密码<Caesar Cipher )加密工具,并验证恺撒密码<Caesar Cipher )加密过程;p1EanqFDPw4、掌握经典加密分析软件CAP的使用并验证古典密码加密算法;【实验环境】1、基于Windows的PC机一台;设计设计恺撒密码<Caesar Cipher )加密工具时的软件环境根据学生自己选择的平台安装,本设计软件平台可以是C语言,Visual C++,Visual C#,Visual Basic均可,主要是实现恺撒密码<Caesar Cipher )算法即可。
DXDiTa9E3d2、CAP加密与分析软件【实验内容】1、以C#平台为例说明恺撒密码<Caesar Cipher )算法的实现。
程序主界面如图1所示:程序源码using System。
……(省略部分生成代码>namespace Encryption{publicpartialclassForm1 : Form{int key。
privatestring Encryption(int key,refstringInputString>RTCrpUDGiT{StringBuilder str = newStringBuilder(>。
char ch,chtemp。
int temp。
for(int i=0。
i<InputString.Length。
实验一 古典密码-Vigernere算法
![实验一 古典密码-Vigernere算法](https://img.taocdn.com/s3/m/238ef590ec3a87c24028c49c.png)
int word_length = strlen(word);
int i, j, k;
for(i = 0; i < word_length; i++)
{
j = i % key_length;
if (word[i] >= 'a' && word[i] <= 'z')
{
k = word[i] - 'a';
k = (k + key[j] - 'A') % 26;
text[i] = k + 'a';
}
else if (word[i] >= 'A' && word[i] <= 'Z')
{
k = word[i] - 'A';
k = (k + key[j] - 'A') % 26;
Vigenere加密
图1Vigenere加密结果
2、Vigenere解密
图2Vigenere解密结果(输入正确密钥)
图3Vigenere解密结果(输入错误密钥)
四,实验中的问题及心得
示范源程序在DEV C++ 上运行时存在一个不足,就是选择输入错误时加密文件和秘钥输入后会提示输入错误,但不会在进行输入程序就结束了,所以我对代码进行部分调整,使选择输入错误时,继续输入字符串和秘钥,然后报错后可以重新选择输入。本次试验主要是要加深对古典密码体制的了解,掌握对字符进行灵活处理的方法。根据Vigenere密码的原理编写程序,对输入的符号串能够根据设置的密钥分别正确实现Vigenere加密和解密功能,由于长时间没有进行编程训练,一些以前掌握的编程技巧现在都不熟悉了,作为计算机专业的学生,还是要注意平时的训练,熟能生巧。
现代密码学——古典密码算法(实验报告)
![现代密码学——古典密码算法(实验报告)](https://img.taocdn.com/s3/m/b57b4e9d172ded630a1cb636.png)
安全SnoWolF/百度B英俊制作课程名称现代密码学实验实验项目名称古典密码算法练习一 Caesar密码加密时每一个字母向前推移k位,例如当k=5时,置换表如表2所示。
表2 Caesar置换表于是对于明文:datasecurityhasevolvedrapidly经过加密后就可以得到密文:IFYFXJHZWNYDMFXJATQAJIWFUNIQD若令26个字母分别对应整数0~25,如表3所示。
表3 Caesar置换表则Caesar加密变换实际上是:c=(m+k)mod26其中m是明文对应的数据,c是与明文对应的密文数据,k是加密用的参数,也称为密钥。
很容易得到相应的Caesar解密变换是:m=D(c)=(c–k)mod26例如明文:datasecurity对应的数据序列:301901842201781924当k=5时经过加密变换得到密文序列:852452397252213243对应的密文为:IFYFXJHZWNYD【实验步骤】本练习主机A、B为一组,C、D为一组,E、F为一组。
首先使用“快照X”恢复Windows系统环境。
一.手动完成Caesar密码(1) 在实验原理部分我们已经了解了Caesar密码的基本原理,那么请同学们写出当密钥k=3时,对应明文:data security has evolved rapidly的密文: GDWD VHFXULWB KDV HYROYHG UDSLGOB 。
(2) 进入实验平台,单击工具栏中的“密码工具”按钮,启动密码工具,在向导区点击“Caesar密码”。
在明文输入区输入明文:data security has evolved rapidly。
将密钥k调节到3,查看相应的密文,并与你手动加密的密文进行比较。
请根据密钥验证密文与明文对应关系是否正确。
二.Caesar加密(1) 进入“加密解密”|“Caesar密码”视图,在明文输入区输入明文(明文应为英文),单击“加密”按钮进行加密。
实验吧_密码学实验报告(3篇)
![实验吧_密码学实验报告(3篇)](https://img.taocdn.com/s3/m/c1bb93c5b1717fd5360cba1aa8114431b90d8efb.png)
第1篇一、实验背景密码学是一门研究信息加密与解密的学科,它广泛应用于信息安全领域。
为了更好地理解密码学的基本原理和算法,我们选择了实验吧平台上的密码学实验进行学习。
本次实验旨在通过实际操作,加深对古典密码、对称密码和不对称密码等密码学基本概念的理解,提高密码学应用能力。
二、实验目的1. 理解并掌握古典密码的基本原理和算法;2. 掌握对称密码和不对称密码的基本原理和算法;3. 通过实验操作,提高密码学应用能力;4. 培养团队协作和解决问题的能力。
三、实验内容1. 古典密码实验(1)仿射密码原理:仿射密码是一种单字母替换密码,加密公式为:C = (aP + b) mod 26,其中C为密文字母,P为明文字母,a和b为密钥。
操作步骤:1)编写加密函数encrypt,实现仿射密码加密;2)编写解密函数decrypt,实现仿射密码解密;3)测试加密和解密函数,验证其正确性。
(2)单表代替密码原理:单表代替密码是一种将明文字符映射到密文字符的替换密码。
操作步骤:1)编写加密函数subencrypt,实现单表代替密码加密;2)编写解密函数subdecrypt,实现单表代替密码解密;3)测试加密和解密函数,验证其正确性。
(3)维吉尼亚密码原理:维吉尼亚密码是一种多字母替换密码,加密公式为:C = (P + K[i]) mod 26,其中C为密文字母,P为明文字母,K为密钥,i为索引。
操作步骤:1)编写加密函数vigenereencrypt,实现维吉尼亚密码加密;2)编写解密函数vigeneredecrypt,实现维吉尼亚密码解密;3)测试加密和解密函数,验证其正确性。
2. 对称密码实验(1)DES加密算法原理:DES(Data Encryption Standard)是一种分组加密算法,采用56位密钥,64位分组。
操作步骤:1)编写DES加密函数desencrypt,实现DES加密;2)编写DES解密函数desdecrypt,实现DES解密;3)测试加密和解密函数,验证其正确性。
实验1 古典密码cc
![实验1 古典密码cc](https://img.taocdn.com/s3/m/cf1acb17fc4ffe473368ab7f.png)
实验一古典密码一、实验题目:古典密码二、实验目的:验证课程讲授的古典密码的设计思想,并编程实现三、实验准备:利用Sage对课本第465页B.2章节中的古典密码的例子与习题进行实现四、实验内容:下面是古典密码的例子和习题:图一worksheet里的显示图二text里的显示例1:对于密钥(整数1,2,3。
,25)和字符串,用Sage实现加/解密函数。
加/解密函数只用对于字符’a’,’b’,’c’,…,’z’(都是大写或小写)操作,其他字符不做改变图三例一worksheet中的显示图四例一text中的显示例2:实现对于密文进行穷举攻击的程序,要求能够将密钥和对应的解密接结果打印出来。
还要求能够通过可选参数控制,根据选择子字符串作为参数,值打印潜在解密结果中的明文。
例3:根据如下输入(密钥,明文)对,给出例1中加密函数的输出。
图六例三worksheet中的显示图七例三worksheet中的显示图八例三worksheet中的显示例4:根据如下输入(密钥,密文)对,给出例1中解密函数的输出。
图九例四worksheet中的显示图十例四worksheet中的显示图十一例四worksheet中的显示例5:对于如下密文,给出例2中穷举攻击程序的输出。
如果指定了可选参数中的密钥字,传递给攻击程序。
图十二例五worksheet中的显示图十三例五worksheet显示图十四例五text中的显示图十五例五text中的显示五、实验心得通过这次实验,通过编程实现其功能,比较具体的理解了古典密码的设计思想。
同时在此次试验中收获也颇丰,我了解了Windows 2003 server IIS,学会了一种全新的项目发布模式,并且在试验中体会到了团体的合作和帮助是在完成试验不可或缺的强大力量。
古典密码一
![古典密码一](https://img.taocdn.com/s3/m/9b03ea0f6c85ec3a87c2c530.png)
古典密码算法(一)
实验所属系列:系统安全实验系列实验对象:本科相关课程及专业:计算机系统安全、信息安全
实验类别:实践实验类
实验开发教师:叶萍龚志伟
实验目的:
目的:实现二维易位密码算法(并掌握其原理)
实验内容:
a)熟悉二维易位密码的基本原理;
b)依据所算则的算法,编程实现该该算法;
提供该算法的使用说明手册,可执行代码、源代码及测试用例(包括测试用例手册、可执行代码和源代码)。
实验器材(设备、元器件):
PC微机一台
实验步骤:
a)熟悉密码算法。
b)编写概要设计,详细设计报告
c)使用visual c++工具,编码.
d)调试及测试
实验报告
(1) 提交所有程序代码
(2)提交设计说明
(3)要求上述密码算法最后的实现程序提供加密和解密两个接口:int
encrypt()和int decrypt()。
当加密或解密成功时返回CRYPT_OK,失败时返回CRYPT_ERROR。
评分要求100分
(1)程序运行正常(不死机)40分
(2)自己选择一个密钥加密明文正常10分
(3)解密正常20分
(4)界面设计良好10分
(5)有设计文档10分
(6)有新增功能10分。
实验1-古典密码算法
![实验1-古典密码算法](https://img.taocdn.com/s3/m/3dee0d85910ef12d2af9e7ed.png)
实验1-古典密码算法一、实验目的通过编程实现替代密码算法和置换密码算法,加深对古典密码体系的了解,为以后深入学习密码学奠定基础。
二、实验原理古典密码算法曾被广泛应用,大都比较简单。
它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。
其中替代密码和置换密码是具有代表性的两种古典密码算法。
1、替代密码替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其他字符替代后形成密文。
例如,明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。
最早的替代密码是由Julius Caesar 发明的Caesar (恺撒)密码,又叫循环移位密码。
它的加密过程可以表示为下面的函数:E(m) = (m+k ) mod n其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。
例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L,计算过程如下:E(8) = (m+k ) mod n = (8+4 ) mod 26 = 12 = L 解密算法是:m = D(L) =(L-k)mod 262、置换密码置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。
置换密码又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。
它将明文中的字母按照给定的顺序安排在一个矩阵中,然后又根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。
例如,明文为 attack begins at five ,密钥为 cipher ,将明文按照每行6个字母的形式排在矩阵中,形成如下形式:a t t a c kb e g i n sa t f i v e根据密钥 cipher 中各字母在字母表中出现的先后顺序,得到给定的一个置换:f = 1 4 5 3 2 6因此有:密钥: 1 4 5 3 2 6明文: a t t a c kb e g i n sa t f i v e根据上面的置换,将原有矩阵中的字母按照第1列、第4列、第5列、第3列、第2列、第6列的顺序排列、则有下面的形式:a a c t t kb i n g e sa i v f t e从而得到密文:abatgftetcnvaiikse其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
古典密码加解密
![古典密码加解密](https://img.taocdn.com/s3/m/c4e4d5200b4c2e3f56276314.png)
实验一古典密码实验1.实验内容根据单表代替密码的加密原理,编写加法密码程序,对于任意选择的密钥k,实现对下面英文的加密和(对应密文的)解密操作。
What do you do when hackers kidnap your data and hold it for ransom? Hollywood Presbyterian Medical Center in California recently faced that Question.2.代码清单#include<iostream.h>#include<stdio.h>#include<math.h>void main(){ int f=26;char m[1000],n[1000];int i,j,k;printf("输入明文:\n");gets(m);cout<<endl;cout<<"加密密钥k=";cin>>k;cout<<endl;for(i=0,j=0;m[i]!='\0';i++,j++){ if(m[i]>='a'&&m[i]<='z'){ n[j]=(m[i]-'a'+k)%26+'a';}elseif(m[i]>='A'&&m[i]<='Z'){ n[j]=(m[i]-'A'+k)%26+'A';}elsen[j]=m[i];}n[j]='\0';cout<<endl;printf("输出密文:\n%s\n",n);getchar();cout<<"解密密钥k=";cin>>k;cout<<endl;printf("输入密文:\n");gets(n);cout<<endl;for(i=0,j=0;m[i]!='\0';i++,j++){ if(n[j]>='a'&&n[j]<='z'){ if((n[j]-'a'-k)<0)m[i]='z'-abs((n[j]-'a'-k)%26)+1;elsem[i]=(n[j]-97-k)%26+97;}elseif(n[j]>='A'&&n[j]<='Z'){ if((n[j]-'A'-k)<0)m[i]='Z'-abs((n[j]-'A'-k)%26)+1;elsem[i]=(n[j]-'A'-k)%26+'A';}elsem[i]=n[j];}m[i]='\0';cout<<endl;printf("输出明文:\n%s\n",m);getchar();}3 测试数据与实验结果测试数据:密钥k=4实验结果:4.总结在此次实验中,我了解到了密码的加密解密过程,以及它们之间转换的关系,更加深刻的明白了密码之间的加解密的实现,也能运用C++来实现文章的加解密,我希望通过此次实验来培养我对密码学的兴趣以及学习到密码学的基础。
古典密码的实验报告
![古典密码的实验报告](https://img.taocdn.com/s3/m/424c9c112f3f5727a5e9856a561252d380eb2089.png)
一、实验目的1. 了解古典密码的基本原理和分类。
2. 掌握仿射密码、维吉尼亚密码和单表密码的加解密过程。
3. 熟悉古典密码的攻击方法,提高密码学素养。
二、实验内容1. 仿射密码(1)原理:仿射密码是一种单表代换密码,其加密和解密过程均采用一个密钥a 和b。
其中,a与26互素,b是任意整数。
加密公式为:C = (aP + b) mod 26,解密公式为:P = a^(-1)(C - b) mod 26。
(2)实现过程:① 随机生成满足条件的密钥a和b。
② 使用加密公式对明文进行加密。
③ 使用解密公式对密文进行解密。
2. 维吉尼亚密码(1)原理:维吉尼亚密码是一种多表替代密码,使用多个凯撒密码字母表对明文进行替代。
加密和解密过程都涉及到密钥,密钥的长度与明文长度相同。
(2)实现过程:① 选择一个密钥,生成对应的凯撒密码字母表。
② 按照密钥的顺序,依次对明文中的每个字母进行替代。
③ 解密过程与加密过程相反。
3. 单表密码(1)原理:单表密码是一种简单的代换密码,将明文中的每个字母映射到密文中的另一个字母。
(2)实现过程:① 创建一个代替表,将明文中的每个字母映射到密文中的另一个字母。
② 按照代替表对明文进行加密。
③ 解密过程与加密过程相反。
三、实验结果与分析1. 仿射密码实验结果通过实验,我们成功实现了仿射密码的加密和解密过程。
加密过程生成的密文在解密过程中能够正确还原成明文。
2. 维吉尼亚密码实验结果实验结果表明,维吉尼亚密码的加密和解密过程同样成功。
密钥的长度与明文长度相同,加密效果较好。
3. 单表密码实验结果单表密码的实验结果同样令人满意。
通过创建代替表,我们能够将明文正确映射到密文,解密过程也能成功还原明文。
四、实验结论1. 古典密码的基本原理和分类已经掌握。
2. 仿射密码、维吉尼亚密码和单表密码的加解密过程已经熟练掌握。
3. 古典密码的攻击方法有所了解,为以后学习现代密码学奠定了基础。
五、实验心得通过本次实验,我对古典密码有了更深入的了解。
实验一
![实验一](https://img.taocdn.com/s3/m/6bc7edf4770bf78a652954f6.png)
课程:网络信息安全实验日期:2015年5 月7 日成绩:实验一古典密码算法【实验目的】理解代换密码学加密过程【网络环境】交换网络结构【实验工具】Matlab【实验原理】古典密码的加密方法一般是文字置换,使用手工或机械变换的方式实现。
古典密码的代表密码体制主要有:单表代替密码、多表代替密码及转轮密码。
【实验步骤】一.手动完成Kaiser密码(1)根据Kaiser密码的基本原理,写出当密钥k=3时,对应明文:data security has evolved rapidly 的密文:GDWDVHFXULWBKDVHYROYHGUDSLGOB 。
(2)进入Matlab,打开fangshe_cipher.m,并运行该程序,在明文输入区明文:data security has evolved rapidly。
输入密钥k1=1, k2=3,查看相应的密文,并与手动加密的密文进行比较。
GDWDVHFXULWBKDVHYROYHGUDSLGOB请根据密钥验证密文与明文对应关系是否正确。
二. Kaiser密码分析(1)进入Matlab,打开fangshe_cipher.m,并运行该程序,输入密钥k1=1,k2不为0,在明文输入区明文(要求明文有一定的意义以便让同组主机分析)。
请设置密钥参数k1:1请设置密钥参数k2:2明文:gameover 。
课程:网络信息安全实验日期:2015年5 月7 日成绩:(2)选择合适的密钥k2值完成Kaiser 加密,将密文记录下来。
密文:ICOGQXGT 。
(3)通知同组主机(不要告知密钥值k2)密文,让同组主机获取密文。
同组主机对密文进行Kaiser解密。
clc;clear;A='abcdefghijklmnopqrstuvwxyz';B='ABCDEFGHIJKLMNOPQRSTUVWXYZ';fprintf('==========仿射变换加密系统==========\n');k1=input('请设置密钥参数k1:');%k1应与26互素,k1=1时便是凯撒变换k2=input('请设置密钥参数k2:');C=input('请输入密文:');%输入小写字母,且要加上单引号d=length(C);D=zeros(1,d);Z='';for i=1:dfor j=1:26if A(j)==C(i)m=j-1;c=k1*m+26-k2;D(i)=rem(c,26);break;endendendfor i=1:dn=D(i)+1;课程:网络信息安全实验日期:2015年5 月7 日成绩:Z(i)=B(n);endfprintf('明文:');Z(4)同组主机调节密钥k2,从而进行密码分析(平均13次,最坏26次破解)。
试验一:古典密码学
![试验一:古典密码学](https://img.taocdn.com/s3/m/176da784cc22bcd126ff0c97.png)
实验一:古典密码体制一、实验目的(1)通过使用“RSA密码体制”算法对实际的数据进行加密和解密来了解古典密码体制的原理。
(2)通过本实验,使学生简要了解密码学的基本知识,了解古典密码学的加密方法,具体掌握一种古典加密方法。
二、实验要求(1)用V C++写出加密、解密程序代码。
(要求完成加密和解密,明文仅限为英文字母、空格和标点符号);(2)运行自己编写的程序,输入素数p=7,q=13:明文为:I am a student!,得出相应的密文,并对其解密,验证解密后得到的明文是否是 I am a student!。
三、相关知识古典密码学的加密解密技术包含单表和多表密码体制,“标准字头密码体制”加密体制算法是一种单表密码体制,主要原理是首先选择一个密钥字如:cipher,则四、程序设计思路(参考)1.首先设定两个按字母表顺序排列的英文小写字母数组alph_h(作为对照用), alph_b(用于中间过度);2.然后设置一个密钥字key(字中字母互不相同);3.根据密钥字,把key中的所有字母从alph_b中去掉,同时,alph_b数组中的元素前移(关于数组中元素前移,做一个FOR循环,发现alph_b中的第J个元素与key中某个元素相同,则alph_b [j]= alph_b [j+1])4.然后再把key和alph_b合并,并赋给key中。
(alph_b中的第i个元素赋给key中第i+6);5.这样alph_h和key就通过下标形成了对应关系;6.输入密钥字、明文(密钥字、明文输入时,要注意:当输入有空格时cin函数不能用,要用getchar()函数);7.根据明文中的字母与alph_h中的对应关系,从key 中相应位置得到对应的密文字母。
最终得到全部密文;8.同样根据密文中的字母与key中的对应关系,从alph_h中相应位置得到对应的明文字母,即可得到解密代码。
四、实验步骤1.根据试验原理部分对单表密码体制的介绍,掌握标准字头密码体制”算法对实际的数据进行加密和解密来了解古典密码体制的原理。
实验一 古典加密算法
![实验一 古典加密算法](https://img.taocdn.com/s3/m/90dea70cb52acfc789ebc920.png)
实验一古典加密算法一、实习目的1、熟悉java平台的开发环境2、理解常见古典加密算法:凯撒密码、多字母替代密码、多表替代密码3、理解古典加密技术中的替换技术、置换技术。
二、实习内容1、问题描述凯撒密码是把字母表中的每个字母用该字母后的某个字母进行代替。
凯撒密码的通用加密算法是:C=E(p)=(P+K)mod26 0<k<26凯撒密码的通用解密算法是:C=E(p)=(P-K)mod26 0<k<262、基本要求实现凯撒密码的加密、解密算法,能够根据用户选择密钥和明文进行加解密。
3、实现提示若用户输入错误信息则可进行提示。
三、程序设计1、用户可以通过键盘输入一行字符串和所要移动的位数,作为所要实现加密的明文。
2、由于字母表中共有26个字符,因此,移位前应先将移动的位数和26取模。
Java平台中可以实现字符和证书的自动转换,因此将字符加上一个正整数代表在字母表中右移位数。
如果移动的位数为负值,则代表在字母中的左移位。
3、移位后仍要判断是否超界,如果超界,则应该做相应的运算,如果c<’a’,则应该加上26,如果c>’z’,则应该减去26,同理c<’A’,则应该加上26,如果c>’Z’,则应该减去26.四、实现测试运行界面如下:测试一:输入一串字符sdfasdfsd,输入一个正整数5,运行结果如下:测试二:输入同测试一相同的一串字符sdfasdfsd,输入一个负整数-5,运行结果如下:测试三:输入一串字符xyzxxxy,输入一个正整数5,此时已经超界,运行结果如下:测试四:当输入的字符中有数字等非字母字符时例如sdf323,此时加密内容不合理,运行结果如下:经过以上测试结果可知,程序正确五、实习总结:通过这次实习,我加深了对对凯撒密码的定义的理解,即是把字母表中的每个字母用该字母后的某个字母进行代替,在对程序设计时,改开始没有考虑周全,没有考虑到移动位数为负值的情况,从而出现当输入值不正确时程序会报错,其中越界情况比较麻烦,既要考虑到要将输入的数字取模,防止越界,又要考虑到将字母右移后要判断是否越界,其次还要考虑所输入字符是否符合标准,总之这次实习也告诉我缜密的思维在程序设计中也是比不可少的。
实验一 古典密码Vigenere 实验报告
![实验一 古典密码Vigenere 实验报告](https://img.taocdn.com/s3/m/0f2c00e19b89680203d825be.png)
实验环境
实验 内容
1、根据实验原理部分对 Vigenere 密码算法的介绍,编写 Vigenere 加密算法的实现 程序,要求:用户从键盘输入密钥 k 和任意的明文信息,输出相应的密文。
2、针对以上加密程序段,编程实现解密。要求:解密的对象就是上一程序段的输 出结果。 要求: 上述密码算法的实现程序命名为 vigenere.c, 分别提供加、 解密函数: encrypt( ) 和 decrypt( ) 。
实验名称
古典密码算法
通过编程实现 Vigenere 密码的加、解密算法,加深对古典密码体制的了解,为
实验目的 深入学习密码学奠定基础。
Vigenere 体制是 1586 年由法国密码学家 Blaise de Vigenere 发明的多表简单加法 密码。 设明文 m = m1 m2 L mn ,密钥
k = k1 k 2 L k n ,
则密文
c = E k (m) = c1 c 2 L c n
实验原理
其中ci = (mi + k i )mod26, i = 1,2,L, n.
当密钥的长度比明文短时,密钥可以周期性的重复使用,直至完成文中 每个字母的加密。
运行 Windows 操作系统的 PC 机,具有 VC++ 6.0 语言编译环境。
实 验 过 程
实验 结果 示例
实验 心得
学号姓名班级时间成绩实验名称古典密码算法实验目的通过编程实现vigenere密码的加解密算法加深对古典密码体制的了解为深入学习密码学奠定基础
陕西师范大学数学与信息科学学院 信 息 安 全 实 验 报 告
学号________姓名 姓名________ 班级 班级________ 时间 时间________ 成绩 成绩_______ 学号 姓名
实验一古典密码算法
![实验一古典密码算法](https://img.taocdn.com/s3/m/de6c285303768e9951e79b89680203d8ce2f6ad0.png)
实验一古典密码算法练习一Caesar密码实验目的1.理解替代密码加密过程实验人数每组2人系统环境Windows网络环境交换网络结构实验工具VC++6.0、密码工具实验类型综合型一、实验原理详见“信息安全实验平台”。
二、实验步骤本练习主机A、B为一组,C、D为一组,E、F为一组。
首先使用“快照X”恢复Windows系统环境。
1. 手动完成Caesar密码(1)在实验原理部分已经了解了Caesar密码的基本原理,请写出当密钥k=3时,对应明文:data security has evolved rapidly的密文:gdwd vhfxulwb kdv hyroyhg udslgob。
(2)进入实验平台,单击工具栏中的“密码工具”按钮,启动密码工具,在向导区点击“Caesar密码”。
在明文输入区输入明文:data security has evolved rapidly。
将密钥k调节到3,查看相应的密文,并与手动加密的密文进行比较。
请根据密钥验证密文与明文对应关系是否正确。
正确2. Caesar加密(1)进入“加密解密”|“Caesar密码”视图,在明文输入区输入明文(明文应为英文),单击“加密”按钮进行加密。
请将明文记录在这里:el psy congroo。
(2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值,并记下该密钥k值用于同组主机的解密。
加密工作完成后,单击“导出”按钮将密文默认导出到Caesar共享文件夹(D:\Work\Encryption\Caesar\)中,默认文件名为Caesar密文.txt。
(3)通知同组主机接收密文,并将密钥k通告给同组主机。
(4)单击“导入”按钮,进入同组主机Work\Encryption\Caesar目录(\\同组主机IP\Work\Encryption\Caesar),打开Caesar密文.txt。
(5)调节密钥k的微调按钮或对照表的移位按钮,将k设为同组主机加密时的密钥k值,这时解密已经成功。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验名称古典密码算法二、实验目的通过编程实现经典的代替密码算法和置换密码,包括移位密码、维吉尼亚密码、周期置换密码、列置换密码,加深对代替技术的了解,为现代分组密码实验奠定基础。
三、实验环境(实验所使用的器件、仪器设备名称及规格)运行Windows 或Linux 操作系统的PC 机,具有gcc(Linux)、VC(Windows)等C 语言编译环境。
四、实验任务及其要求(1)根据实验原理部分对移位密码的介绍,自己创建明文信息,并选择一个密钥,编写移位密码的实现程序,实现加密和解密操作。
(2)根据实验原理部分对维吉尼亚密码的介绍,自己创建明文信息,并选择一个密钥,编写维吉尼亚密码的实现程序,实现加密和解密操作。
(3)根据实验原理部分对周期置换密码的介绍,自己创建明文信息,并选择一个密钥,编写周期置换密码的实现程序,实现加密和解密操作。
(4)根据实验原理部分对列置换密码的介绍,自己创建明文信息,并选择一个密钥,编写列置换密码的实现程序,实现加密和解密操作。
五、实验设计(包括原理图、真值表、分析及简化过程、卡诺图、源代码等)1.移位密码移位密码(Shift Cipher)是一种典型的单表替代密码,也称为加法密码。
移位密码的加密方法就是将明文中的每个字母用其在字母表后面的第k 个字母替代,它的加密过程可以表示为: c = (m + k) mod n其中,m 为明文字母在字母表中的位置数;n 为字母表中的字母总数;k 为密钥;c 为密文字母在字母表中对应的位置数。
相应的,移位密码的解密过程可以表示为:m = (c - k) mod n移位密码的一个典型代表就是凯撒密码(Ceaser Cipher),它是k=3 时的移位密码。
使用英文字母表的撒密码的加(解)密可以表示为:m = (c + 3) mod 26 m = (c - 3) mod 26,例如,明文:attacks at nine am密钥:3加密:将明文分组对每一个密文字母,依英文字母表,用其右的第 3 个字母代替密文:dwwdfnv dw qlqh dp另外,使用凯撒密码加密后的密文“dwwdfnvdwilyhsp”,其明文为“attacks at five pm”。
2.维吉尼亚密码维吉尼亚密码(Vigenere Cipher)是一种多表代替密码,其本质是周期移位密码。
维吉尼亚密码的(用户)密钥为一含有d 个字母的有限字母序列k = k0k1…k d-1加密时,首先将用户密钥进行周期扩展(周期为d),扩展后的无限字母序列称为工作密钥,记为K = K0K1…K i…其中K i = K i mod d ,i=0,1,…当d=1 时,维吉尼亚密码就是移位密码。
对于含有l 个字母的明文,维吉尼亚加密过程可以表示为:c i = (m i+K i ) mod n 其中,M = m0m1…m i…m l-1 为明文,C = c0c1…c i…c l-1 为密文,K = K0K1…K i…K l-1 为工作钥,n 为明文字母表的长度,l 为明文长度(含有字母的数目)。
例如,使用用户钥cat,对明文“vigenere cipher” 进行维吉尼亚加密。
此时,n=26(对应英文字母表),用户钥c=3、a=0、t=19,得到的密文为“xizgnxtevkpagr”。
置换(Permutation)是古典密码中另一种基本的处理技巧,就是将明文中的字母重新排列,字母本身不变,只是改变其位置。
置换密码(Substitution Cipher)就是使用置换法进行加解密的密码算法,也称为换位密码。
置换密码的密钥是一个置换,它表示了明文字母在密文中出现的位置。
例如,使用密钥π=(3421),对明文“ming”进行加密,得到的密文为“ngim”。
3.周期置换密码周期置换密码是将明文字母按一定长度m 进行分组,把每个分组中的字母按1,2,…,m的一个置换π重排位置次序来得到密文的一种加密方法。
其中的密钥就是置换π,在π的描述中包含了分组长度的信息。
解密时,对密文字符按长度m 进行分组,并按π的逆置换π−1把每组字符重排位置次序来得到明文。
例如,明文:ming chen jiu dian fa dong fan gong加密密钥:3421(i=1,2,3,4 的一个置换π(i) =3,4,2,1)加密:将明文分组(4 个字母一组),然后根据加密密钥给定的置换,对每个明文分组进行置换ming chen jiud ianf adon gfan gongngim enhc udij nfai onda anfg ngog密文:ngimenhcudijnfaiondaanfgngog解密密钥:4312(3421 的逆置换)4.列置换密码列置换密码也称为矩阵置换密码。
其加解密方法如下:把明文字符以固定的宽度m(分组长度)水平地(按行)写在一张纸上,按1,2,…,m 的一个置换π交换列的位置次序,再按垂直方向(即按列)读出即得密文。
解密就是将密文按相同的宽度m 垂直在写在纸上,按置换π的逆置换π−1 交换列的位置次序,然后水平地读出得到明文。
置换π就是密钥。
例如,明文:ming chen jiu dian fa dong fan gong密钥:yu lan hua加密:去掉密钥重复字母得yulanh,得到密钥字母顺序653142得出距阵列数为6,将明文按行填充距阵按列(依顺序)写出距阵中的字母。
密文:giffg hddn0 njngn cuaa0 inano meiog (其中0 为无效字符)解密:加密的逆过程六、实验步骤通过实验分析,将各个古典密码算法编写出来,然后编写一个主函数。
调试,验证加密解密正确性。
#include<stdio.h>#include<string.h>#define CRYPT_OK 1#define CRYPT_ERROR 0#define MAXSIZE 100void ShiftCipher();void VigenereCipher();void CycleCipher();void ColCipher();void main(){int op=0;while(1){printf("Which Cipher would you want ?:1.Shift 2.Vig 3.Cyc 4.Col:\n");scanf("%d",&op);fflush(stdin);switch(op){case 1:{ShiftCipher();}break;case 2:{VigenereCipher();}break;case 3:{CycleCipher();}break;case 4:{ColCipher();}break;}}}//主函数//列置换置换密码int Colencrypt(char* plain,char* cipher,char* key); //列置换置换密码加密算法int Coldecrypt(char* plain,char* cipher,char* key); //列置换置换密码解密算法void ColCipherEncrypt(); //列置换置换密码加密调用void ColCipherDecrypt(); //列置换置换密码解密调用void ColCipher(); //列置换置换密码模块调用int fix(char* m,int T); //字符串补齐修正void ColCipher(){int op=0;while(1){fflush(stdin);printf("__This_is_Coloum_Cipher_Process____________________\n");printf("1 for encrypt,2 for decrypt:");scanf("%d",&op);getchar();switch(op){case 1:{ColCipherEncrypt();}break;case 2:{ColCipherDecrypt();}break;default:{printf("Error Input\n");}}}}//列置换置换密码模块调用void ColCipherEncrypt(){char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE];//定义变量printf("Please Input the Plaintext:\n");gets(p);fflush(stdin);printf("Please Input the ColKey:(连续整数序列置换)\n");gets(k);//获取明文&密钥fix(p,strlen(k));//补齐空格Colencrypt(p,c,k);//调用加密函数printf("Chipertext:\n%s",c);getchar();}//列置换置换密码加密调用void ColCipherDecrypt(){char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE],flag,abc[27];int i,temp;//定义变量printf("Please Input the Ciphertext:\n");gets(c);printf("Do You Know the Key? y/n:");fflush(stdin);scanf("%c",&flag);getchar();switch(flag){case 'y': //若知道密钥则直接经行解密{printf("Please Input the ColKey:\n");gets(k);//获取密钥fix(c,strlen(k));Coldecrypt(p,c,k);//调用函数printf("Plaintext:\n%s\n",p);}break;case 'n': //不知道密钥则对文本进行字母统计分析{printf("Then I can't help you!\n");};break;default:{printf("ERROR\n");}}}//列置换置换密码解密调用int Colencrypt(char* plain,char* cipher,char* key){int i,r,T,n,j;char temp[MAXSIZE];i=0;T=strlen(key);while(plain[i]!='\0'){r=i%T;cipher[i]=plain[i-r+(key[r]-'0')-1];i++;}cipher[i]='\0';n=strlen(cipher)/strlen(key);for(i=0;i<T;i++){for(j=0;j<n;j++){temp[i]=cipher[T*j+i%T];}}temp[strlen(cipher)]='\0';return CRYPT_OK;}//列置换置换密码加密算法int Coldecrypt(char* plain,char* cipher,char* key) {int i,r,T,n,j;char temp[MAXSIZE];i=0;T=strlen(key);while(cipher[i]!='\0'){r=i%T;plain[i]=cipher[i-r+(key[r]-'0')-1];i++;}plain[i]='\0';n=strlen(plain)/strlen(key);for(i=0;i<T;i++) //{for(j=0;j<n;j++){temp[i]=plain[T*j+i];}}temp[strlen(plain)]='\0';plain=temp;return CRYPT_OK;}//列置换置换密码解密算法//移位密码int ShiftEncrypt(char* plain,char* cipher,int key); //移位密码加密算法int ShiftDecrypt(char* plain,char* cipher,int key); //移位密码解密算法void ShiftCipherEncrypt(); //移位密码加密调用void ShiftCipherDecrypt(); //移位密码解密调用void ShiftCipher(); //移位密码模块调用void ShiftCipher(){int op=0;while(1){fflush(stdin);printf("_This_is_Shift_Cipher_Process_________________________\n");printf("1 for encrypt,2 for decrypt:");scanf("%d",&op);getchar();switch(op){case 1:{ShiftCipherEncrypt();}break;case 2:{ShiftCipherDecrypt();}break;default:{printf("Error Input\n");}}}}//移位密码模块调用void ShiftCipherEncrypt(){char p[MAXSIZE],c[MAXSIZE];int key=0;//定义变量printf("Please Input the Plaintext:\n");gets(p);printf("Please Input the ShiftKey:\n");scanf("%d",&key);//获取必要信息ShiftEncrypt(p,c,key);//调用函数printf("Chipertext:\n%s\n",c);getchar();}//移位密码加密调用void ShiftCipherDecrypt(){char p[MAXSIZE],c[MAXSIZE],flag;int key=0;int i;//定义变量printf("Please Input the Ciphertext:\n");gets(c);printf("Do You Know the Key? y/n:");fflush(stdin);scanf("%c",&flag);getchar();switch(flag){case 'y':{printf("Please Input the ShiftKey[0-26]:\n");scanf("%d",&key);//获取必要信息ShiftDecrypt(p,c,26-key);//调用函数printf("Plaintext:\n%s\n",p);getchar();}break;case 'n':{for(i=25;i>0;i--){ShiftDecrypt(p,c,i);printf("Plaintext Shift By %2d is: %s\n",26-i,p);}};break;default:{printf("ERROR\n");}}}//移位密码解密调用int ShiftEncrypt(char* plain,char* cipher,int key){int i=0;while(plain[i]!='\0'){if(plain[i]>='A'&&plain[i]<='Z'){cipher[i]=(plain[i]+key-'A')%26+'A';}else{if(plain[i]>='a'&&plain[i]<='z'){cipher[i]=(plain[i]+key-'a')%26+'a';}elsecipher[i]=plain[i];}i++;}cipher[i]='\0';return CRYPT_OK;}//移位密码加密算法int ShiftDecrypt(char* plain,char* cipher,int key){int i=0;while(cipher[i]!='\0'){if(cipher[i]>='A'&&cipher[i]<='Z'){plain[i]=(cipher[i]-'A'+key)%26+'A';}else{if(cipher[i]>='a'&&cipher[i]<='z'){plain[i]=(cipher[i]-'a'+key)%26+'a';}else{plain[i]=cipher[i];}}i++;}plain[i]='\0';return CRYPT_OK;}//移位密码解密算法//弗吉尼亚密码int Vigenereencrypt(char* plain,char* cipher,char* key); //弗吉尼亚密码加密算法int Vigeneredecrypt(char* plain,char* cipher,char* key); //弗吉尼亚密码解密算法void VigenereCipherEncrypt(); //弗吉尼亚密码加密调用void VigenereCipherDecrypt(); //弗吉尼亚密码解密调用void VigenereCipher(); //弗吉尼亚密码模块调用void Static(char* c); //密文字母频率统计模块void VigenereCipher(){int op=0;while(1){fflush(stdin);printf("__This_is_Vigenere_Cipher_Process_____________________\n");printf("1 for encrypt,2 for decrypt:");scanf("%d",&op);getchar();switch(op){case 1:{VigenereCipherEncrypt();}break;case 2:{VigenereCipherDecrypt();}break;default:{printf("Error Input\n");}}}}//弗吉尼亚密码模块调用void VigenereCipherEncrypt(){char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE];//定义变量printf("Please Input the Plaintext:\n");gets(p);fflush(stdin);printf("Please Input the VigenereKey:(low case)\n");gets(k);//获取必要信息Vigenereencrypt(p,c,k);//调用函数printf("Chipertext:\n%s",c);getchar();}//弗吉尼亚密码加密调用void VigenereCipherDecrypt(){char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE],flag,abc[27];int i,temp;//定义变量printf("Please Input the Ciphertext:\n");gets(c);printf("Do You Know the Key? y/n:");fflush(stdin);scanf("%c",&flag);getchar();switch(flag){case 'y': //若知道密钥则直接经行解密{printf("Please Input the VigenereKey:\n");gets(k);//获取密钥Vigeneredecrypt(p,c,k);//调用函数printf("Plaintext:\n%s\n",p);}break;case 'n': //不知道密钥则对文本进行字母统计分析{Static(c);};break;default:{printf("ERROR\n");}}}//弗吉尼亚密码解密调用int Vigenereencrypt(char* plain,char* cipher,char* key){int i=0;int T;T=strlen(key);printf("%d",T);while(plain[i]!='\0'){if(plain[i]>='A'&&plain[i]<='Z'){cipher[i]=(plain[i]+key[i%T]-'A'-'a')%26+'A';}else{if(plain[i]>='a'&&plain[i]<='z'){cipher[i]=(plain[i]+key[i%T]-'a'-'a')%26+'a';}elsecipher[i]=plain[i];}i++;}cipher[i]='\0';return CRYPT_OK;}//弗吉尼亚密码加密算法int Vigeneredecrypt(char* plain,char* cipher,char* key){int i=0;int T;int abc[26];T=strlen(key);while(cipher[i]!='\0'){if(cipher[i]>='A'&&cipher[i]<='Z'){plain[i]=(cipher[i]-'A'+26-(key[i%T]-'a'))%26+'A';}else{if(cipher[i]>='a'&&cipher[i]<='z'){plain[i]=(cipher[i]-'a'+26-(key[i%T]-'a'))%26+'a';}else{plain[i]=cipher[i];}}i++;}plain[i]='\0';return CRYPT_OK;}//弗吉尼亚密码解密算法void Static(char* c){int i,temp;int abc[27]={0};i=0;temp=0;while(c[i]!='\0'){if(c[i]>='A'&&c[i]<='Z'){temp=c[i]-'A';}else{if(c[i]>='a'&&c[i]<='z'){temp=c[i]-'a';}else{temp=26;}}abc[temp]++;i++;}for(i=0;i<26;i++){printf("%c:%d\n",i+'A',abc[i]);}printf("Other:%d\n",abc[26]);printf("That's all I can do for you. \n");}//密文字母频率统计模块//周期置换密码int Cycleencrypt(char* plain,char* cipher,char* key); //周期置换密码加密算法int Cycledecrypt(char* plain,char* cipher,char* key); //周期置换密码解密算法void CycleCipherEncrypt(); //周期置换密码加密调用void CycleCipherDecrypt(); //周期置换密码解密调用void CycleCipher(); //周期置换密码模块调用int fix(char* m,int T); //字符串补齐修正void CycleCipher(){int op=0;while(1){fflush(stdin);printf("__This_is_Cycle_Cipher_Process_____________________\n");printf("1 for encrypt,2 for decrypt:");scanf("%d",&op);getchar();switch(op){case 1:{CycleCipherEncrypt();}break;case 2:{CycleCipherDecrypt();}break;default:{printf("Error Input\n");}}}}//周期置换密码模块调用void CycleCipherEncrypt(){char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE];//定义变量printf("Please Input the Plaintext:\n");gets(p);fflush(stdin);printf("Please Input the CycleKey:(连续整数序周期)\n");gets(k);//获取明文&密钥fix(p,strlen(k));//补齐空格Cycleencrypt(p,c,k);//调用加密函数printf("Chipertext:\n%s",c);getchar();}//周期置换密码加密调用void CycleCipherDecrypt(){char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE],flag,abc[27];int i,temp;//定义变量printf("Please Input the Ciphertext:\n");gets(c);printf("Do You Know the Key? y/n:");fflush(stdin);scanf("%c",&flag);getchar();switch(flag){case 'y': //若知道密钥则直接经行解密{printf("Please Input the CycleKey:\n");gets(k);//获取密钥fix(c,strlen(k));Cycledecrypt(p,c,k);//调用函数printf("Plaintext:\n%s\n",p);}break;case 'n': //不知道密钥则对文本进行字母统计分析{printf("Then I can't help you!\n");};break;default:{printf("ERROR\n");}}}//周期置换密码解密调用int Cycleencrypt(char* plain,char* cipher,char* key) {int i,r,T;i=0;T=strlen(key);while(plain[i]!='\0'){r=i%T;cipher[i]=plain[i-r+(key[r]-'0')-1];i++;}cipher[i]='\0';return CRYPT_OK;}//周期置换密码加密算法int Cycledecrypt(char* plain,char* cipher,char* key) {int i,r,T;i=0;T=strlen(key);while(cipher[i]!='\0'){r=i%T;plain[i]=cipher[i-r+(key[r]-'0')-1];i++;}plain[i]='\0';return CRYPT_OK;}//周期置换密码解密算法int fix(char* m,int T){int i,max;i=strlen(m);if(i%T==0){return i/T;}else{max=(i/T+1)*T;while(i<max){m[i]=' ';i++;}m[i]='\0';return max;}}七、实验过程与分析八、实验结果总结代替(Substitution)是古典密码中最基本的处理技巧,就是将明文字母由其他字母表中的字母替换的一种方法。