凯撒密码实验

合集下载

信息安全实验-凯撒加密加法乘法变换

信息安全实验-凯撒加密加法乘法变换

【实验目的】1. 简单加密方法的原理2. 凯撒密码的原理及程序的编写【实验设备与环境】(1)计算机(2)TC【实验步骤(内容)】凯撒密码就是单表代替密码,它的每一个明文字符都由其右边第3个(模26)字符代替(A由D代替,B由E代替,W由Z代替,X由A代替,Y由B代替,Z由C代替)。

(1)加法变换c≡ (m + k) mod 26其中m是明文对应的数据,c是与明文对应的密文数据,k是加密用的参数,叫密钥。

比如:data security对应数据序列4,1,20,1,19,5,3,21,18,9,20,25,当k=5时,得密文序列9,6,25,6,24,10,8,0,23,14,25,4。

(2)乘同余码:移位或等间隔抽取码,明密文之间没有一一对应关系。

(容易产生多义性)。

变换按照同余乘法进行:加密变换:C=P⨯k (mod 26),解密变换:P=C÷k (mod 26) ,密钥:k源程序:#include<stdio.h>#include<conio.h>char sumjiami(char ch,int n){n=n%10;while(ch>='A'&&ch<='Z'){return ('A'+(ch-'A'+n)%26);}while(ch>='a'&&ch<='z'){return ('a'+(ch-'a'+n)%26); }while(ch>='0'&&ch<='9'){return ('0'+(ch-'0'+n)%10); }return ch;}char sumjiemi(char ch,int n) {static int k;k=n%10;while(ch>='A'&&ch<='Z'){ n=26-k;return ('A'+(ch-'A'+n)%26); }while(ch>='a'&&ch<='z'){n=26-k;return ('a'+(ch-'a'+n)%26); }while(ch>='0'&&ch<='9'){ n=10-k;return ('0'+(ch-'0'+n)%10); }return ch;char muljiami(char ch,int n) {if(n%2==0) n=n%10+1;else n=n%10;if(n%5==0) n=n+2;else n=n;while(ch>='A'&&ch<='Z'){return ('A'+((ch-'A')*n)%26); }while(ch>='a'&&ch<='z'){return ('a'+((ch-'a')*n)%26); }while(ch>='0'&&ch<='9'){return ('0'+((ch-'0')*n)%10); }return ch;}char muljiemi(char ch,int n) {int i;int k,h;if(n%2==0) n=n%10+1;else n=n%10;if(n%5==0) n=n+2;else n=n;while(ch>='A'&&ch<='Z')for(i=0;i<=n;i++){k=((ch-'A')+i*26)%n; if(k==0)h=((ch-'A')+i*26)/n; if(h>=0&&h<=26)return ('A'+h);}}while(ch>='a'&&ch<='z') {for(i=0;i<=n;i++){k=((ch-'a')+i*26)%n; if(k==0)h=((ch-'a')+i*26)/n; if(h>=0&&h<=26)return ('a'+h);}}while(ch>='0'&&ch<='9') {for(i=0;i<=n;i++){k=((ch-'0')+i*10)%n; if(k==0)h=((ch-'0')+i*10)/n;return ('0'+h);}}return ch;}void menu(){printf("\n========================================================="); printf("\n1.sumjiami the file");printf("\n2.muljiami the file");printf("\n3.sumjiemi the file");printf("\n4.muljiemi the file");printf("\n5.Quit\n");printf("=========================================================\n"); printf("Please select a item:");return;}void main(){int i,n;char ch0,ch1;FILE *in,*out;char infile[20],outfile[20];sleep(3);menu();ch0=getch();{if(ch0=='1'){clrscr();printf("\nPlease input the infile:"); scanf("%s",infile);if((in=fopen(infile,"r"))==NULL){printf("Can not open the infile!\n"); printf("Press any key to exit!\n");getch();exit(0);}printf("Please input the key:");scanf("%d",&n);printf("Please input the outfile:");scanf("%s",outfile);if((out=fopen(outfile,"w"))==NULL){printf("Can not open the outfile!\n"); printf("Press any key to exit!\n");fclose(in);getch();exit(0);}while(!feof(in)){fputc(sumjiami(fgetc(in),n),out);}fclose(in);fclose(out);sleep(1);}if(ch0=='2'){clrscr();printf("\nPlease input the infile:"); scanf("%s",infile);if((in=fopen(infile,"r"))==NULL){printf("Can not open the infile!\n"); printf("Press any key to exit!\n");getch();exit(0);}printf("Please input the key:");scanf("%d",&n);printf("Please input the outfile:");scanf("%s",outfile);if((out=fopen(outfile,"w"))==NULL){printf("Can not open the outfile!\n"); printf("Press any key to exit!\n");fclose(in);getch();exit(0);}while(!feof(in))fputc(muljiami(fgetc(in),n),out);}printf("\nmuljiami is over!\n");fclose(in);fclose(out);sleep(1);}if(ch0=='3'){clrscr();printf("\nPlease input the infile:"); scanf("%s",infile);if((in=fopen(infile,"r"))==NULL){printf("Can not open the infile!\n"); printf("Press any key to exit!\n");getch();exit(0);}printf("Please input the key:");scanf("%d",&n);printf("Please input the outfile:");scanf("%s",outfile);if((out=fopen(outfile,"w"))==NULL){printf("Can not open the outfile!\n"); printf("Press any key to exit!\n");fclose(in);getch();}while(!feof(in)){fputc(sumjiemi(fgetc(in),n),out);}printf("\nsumjiemi is over!\n");fclose(in);fclose(out);sleep(1);}if(ch0=='4'){clrscr();printf("\nPlease input the infile:"); scanf("%s",infile);if((in=fopen(infile,"r"))==NULL){printf("Can not open the infile!\n"); printf("Press any key to exit!\n");getch();exit(0);}printf("Please input the key:");scanf("%d",&n);printf("Please input the outfile:");scanf("%s",outfile);if((out=fopen(outfile,"w"))==NULL){printf("Can not open the outfile!\n");fclose(in);getch();exit(0);}while(!feof(in)){fputc(muljiemi(fgetc(in),n),out);}printf("\nmuljiemi is over!\n");fclose(in);fclose(out);sleep(1);}menu();ch0=getch();}clrscr();printf("\nGood Bye!\n");sleep(3);}运行:在C盘建立1.txt和2.txt,在文本1中输入以下信息:大写:ABCDEFGHIJKLMNOPKRSTUVWXYZ;小写:abcdefghijklmnopkrstuvwxyz;数字:0123456789.1、加法(sum)加密选择1加密运行结果:大写:FGHIJKLMNOPQRSTUPWXYZABCDE; 小写:fghijklmnopqrstupwxyzabcde;数字:5678901234.2、加法(sum)解密选择3加法解密运行结果:大写:ABCDEFGHIJKLMNOPKRSTUVWXYZ; 小写:abcdefghijklmnopkrstuvwxyz;数字:0123456789.3、乘法(mul)加密选择2乘法加密运行结果:大写:AHOVCJQXELSZGNUBSPWDKRYFMT; 小写:ahovcjqxelszgnubspwdkryfmt;数字:0741852963.4、乘法解密选择4乘法解密运行结果:大写:ABCDEFGHIJKLMNOPKRSTUVWXYZ;小写:abcdefghijklmnopkrstuvwxyz;数字:0123456789.5选择5退出。

实验1-1 经典密码——凯撒密码

实验1-1 经典密码——凯撒密码

上机实验报告一、实验目的:本次上机实践所涉及并要求掌握的知识点。

1、理解凯撒密码的加密、解密过程二、实验环境PC机一台三、实验内容实验一移动3位的凯撒密码:1.(1)用移动3位的凯撒密码加密“keep this secret”(2)用移动3位的凯撒密码加密你的某位老师的名字2.破译下列谜语的答案。

这些答案是用移动3位的凯撒密码来加密的。

(1)谜语:What do you call a sleeping bull?(你怎么称呼一只睡着的公牛?)答案: D EXOOGRCHU(2)谜语:What is the different between a teacher and a train?(老师与火车的区别是什么?)答案:WKH WHDFKHU VDBV “QR JXP DOORZHG”WKH WUDLQ VDBV “FKHZ FKHZ”实验二移动4位的凯撒密码:1.请解密下面伊薇写给艾比的便条,她使用的是移动4位的凯撒密码WSVVC PIX’W YWI GMTLIVW JVSQ RSA SR2.谜语:What do you call a dog at the beach ?(你怎么称呼一只在海滩上的狗?)答案(移动4位密码):E LSX HSK实验三凯撒密码破解:1.凯撒密码破解密文:NGBKGMUUJZOSK实验四用数传递信息的方法破译以下的谜语:1.谜语:Where does Thursday come before Wednesday? (哪裡的星期四是比星期三还早的?)答案: 8,13,19,7,4,3,8,2,19,8,14,13,0,17,242.谜语:What always ends everything?(什么总是能终结所有事情?)答案:19,7,4 11,4,19,19,4,17 ,6四、实验总结通过上机实践,对所学内容的某个知识点有了更深入的理解,写出一些体会、学习心得,甚至是改进意见。

古典密码的实验报告

古典密码的实验报告

古典密码的实验报告古典密码的实验报告引言:密码学作为一门古老而又神秘的学科,一直以来都吸引着人们的兴趣。

在古代,人们用各种各样的密码来保护重要信息的安全性。

本实验旨在通过实际操作,探索古典密码的加密原理和破解方法,从而深入了解密码学的基本概念和应用。

一、凯撒密码凯撒密码,又称移位密码,是最简单的一种古典密码。

其原理是通过将明文中的每个字母按照一定的规则进行移位,得到密文。

在本实验中,我们选择了一个简单的凯撒密码进行破解。

首先,我们选择了一段明文:“HELLO WORLD”,并将其按照凯撒密码的规则进行移位,假设移位数为3,则得到密文:“KHOOR ZRUOG”。

接下来,我们尝试使用暴力破解的方法来还原明文。

通过尝试不同的移位数,我们发现当移位数为3时,得到的明文与原文完全一致。

这表明我们成功地破解了凯撒密码,并还原了原始的明文。

二、维吉尼亚密码维吉尼亚密码是一种基于多个凯撒密码组合而成的密码算法。

其原理是通过使用不同的移位数对明文进行加密,从而增加了密码的复杂度。

在本实验中,我们选择了一段明文:“CRYPTOGRAPHY”,并使用维吉尼亚密码进行加密。

我们选择了一个关键词“KEY”作为加密密钥。

首先,我们将关键词“KEY”重复至与明文长度相同,得到“KEYKEYKEYKEYK”。

然后,将明文中的每个字母与关键词中对应位置的字母进行凯撒密码的移位操作。

经过加密后,我们得到了密文:“LXFOPVEFRNHR”。

接下来,我们尝试使用破解方法来还原明文。

通过尝试不同的关键词和移位数的组合,我们发现当关键词为“KEY”且移位数为3时,得到的明文与原文完全一致。

这表明我们成功地破解了维吉尼亚密码,并还原了原始的明文。

三、栅栏密码栅栏密码是一种基于换位操作的密码算法。

其原理是通过将明文中的字母按照一定的规则进行重新排列,得到密文。

在本实验中,我们选择了一段明文:“HELLO WORLD”,并使用栅栏密码进行加密。

实验1-1经典密码——凯撒密码

实验1-1经典密码——凯撒密码

实验1-1经典密码——凯撒密码上机实验报告⼀、实验⽬的:本次上机实践所涉及并要求掌握的知识点。

1、理解凯撒密码的加密、解密过程⼆、实验环境PC机⼀台三、实验内容实验⼀移动3位的凯撒密码:1.(1)⽤移动3位的凯撒密码加密“keep this secret”(2)⽤移动3位的凯撒密码加密你的某位⽼师的名字2.破译下列谜语的答案。

这些答案是⽤移动3位的凯撒密码来加密的。

(1)谜语:What do you call a sleeping bull?(你怎么称呼⼀只睡着的公⽜?)答案: D EXOOGRCHU(2)谜语:What is the different between a teacher and a train?(⽼师与⽕车的区别是什么?)答案:WKH WHDFKHU VDBV “QR JXP DOORZHG”WKH WUDLQ VDBV “FKHZ FKHZ”实验⼆移动4位的凯撒密码:1.请解密下⾯伊薇写给艾⽐的便条,她使⽤的是移动4位的凯撒密码WSVVC PIX’W YWI GMTLIVW JVSQ RSA SR2.谜语:What do you call a dog at the beach ?(你怎么称呼⼀只在海滩上的狗?)答案(移动4位密码):E LSX HSK实验三凯撒密码破解:1.凯撒密码破解密⽂:NGBKGMUUJZOSK实验四⽤数传递信息的⽅法破译以下的谜语:1.谜语:Where does Thursday come before Wednesday? (哪裡的星期四是⽐星期三还早的?)答案: 8,13,19,7,4,3,8,2,19,8,14,13,0,17,242.谜语:What always ends everything?(什么总是能终结所有事情?)答案:19,7,4 11,4,19,19,4,17 ,6四、实验总结通过上机实践,对所学内容的某个知识点有了更深⼊的理解,写出⼀些体会、学习⼼得,甚⾄是改进意见。

实验一 凯撒加密解密

实验一  凯撒加密解密

计算机安全基础上机实验报告学院年级专业班学生姓名学生学号实验一凯撒加密解密凯撒密码简介:恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左或向右移动一个固定数目的位置。

例如,当偏移量是左移3的时候(解密时的密钥就是3):明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。

需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。

例如:明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ源代码:#include "kaisa.h"using namespace std;void Kaisa::setI(){cout << "\n请输入加密密码:";cin >> i;}void Kaisa::jiami(){char a, b, c;cout << "\n请输入明文:\t";cin >> a;b = char('z' - i%26);c = char('Z' - i%26);cout << "\n密文是:\t";while(a != '\n'){if((a <= 'z' && a >= 'a') || ( a <= 'Z' && a >='A')){ if((a <= b && a >= 'a') || ( a <= c && a >='A'))cout << char(a + i%26);if(a > c && a <= 'Z')cout << char(a + i%26 - 26);if(a > b && a <= 'z')cout << char(a + i%26 - 26);if(a == ' ')cout << " ";}elsecout << a;a = cin.get();}cout << endl;}void Kaisa::setX(){cout << "\n请输入解密密码:";cin >> i;}void Kaisa::jiemi(){char a, b, c;cout << "\n请输入密文:\t";cin >> a;b = char('a' + i%26);c = char('A' + i%26);cout << "\n明文是:\t";while(a != '\n'){if((a <= 'z' && a >= 'a') || ( a <= 'Z' && a >='A')) { if((a <= 'z' && a >= b) || ( a <= 'Z' && a >= c)) cout << char(a - i%26);if(a >= 'a' && a < b)cout << char(a - i%26 + 26);if(a >= 'A' && a < c)cout << char(a - i%26 + 26);if(a == ' ')cout << " ";}elsecout << a;a = cin.get();}cout << endl;}int main(){while(1){int t;cout << "1.加密" << endl<< "2.解密" << endl<<"按其他键退出"<<endl<< "选择:";cin >> t;Kaisa kaisa;if(t == 1){kaisa.setI();kaisa.jiami();cout<<"加密完成\n"<<endl;}else if(t == 2){kaisa.setX();kaisa.jiemi();cout<<"解密完成\n"<<endl;}elsereturn 0;}}测试:密钥:4,明文:abcdefg 实验结果:实验二DES加密解密加密原理:DES 使用一个56 位的密钥以及附加的8 位奇偶校验位,产生最大64 位的分组大小。

古典密码的实验报告

古典密码的实验报告

古典密码的实验报告1. 引言古典密码是一种古老的加密技术,用于在信息传递过程中保护敏感信息的安全性。

它通过将明文转换成密文,从而使未经授权的个体无法理解信息的内容。

本实验旨在介绍几种常见的古典密码算法,并通过实验验证其加密和解密的过程。

2. 凯撒密码凯撒密码是最简单的古典密码之一,它通过将明文中的每个字母向前或向后移动固定的位置来加密信息。

例如,当移动的位置为3时,明文中的字母A将被替换为D,字母B将被替换为E,以此类推。

2.1 加密过程1.输入明文。

2.设置移动的位置。

3.对于明文中的每个字母,按照移动的位置将其替换为对应的字母。

4.得到密文。

2.2 解密过程1.输入密文。

2.设置移动的位置。

3.对于密文中的每个字母,按照移动的位置将其替换为对应的字母。

4.得到明文。

3. 维吉尼亚密码维吉尼亚密码是一种多表密码,它通过使用一系列凯撒密码表来加密信息。

每个表中的移动位置逐个递增,这样可以更好地混淆明文的结构。

3.1 加密过程1.输入明文。

2.输入密钥。

3.对于明文中的每个字母,找到对应的凯撒密码表。

4.根据对应的表和密钥,将明文中的字母替换为密文。

5.得到密文。

3.2 解密过程1.输入密文。

2.输入密钥。

3.对于密文中的每个字母,找到对应的凯撒密码表。

4.根据对应的表和密钥,将密文中的字母替换为明文。

5.得到明文。

4. 培根密码培根密码是古典密码中的另一种类型,它使用一系列相同长度的字母组成的密钥来加密信息。

明文中的每个字母都将被替换为对应密钥中的字母。

4.1 加密过程1.输入明文。

2.输入密钥。

3.对于明文中的每个字母,将其对应到密钥中的相应字母。

4.得到密文。

4.2 解密过程1.输入密文。

2.输入密钥。

3.对于密文中的每个字母,将其对应到密钥中的相应字母。

4.得到明文。

5. 实验结果与讨论在本实验中,我们使用了凯撒密码、维吉尼亚密码和培根密码进行加密和解密实验。

通过对不同算法的测试,我们发现:1.凯撒密码是最简单的古典密码之一,但由于移动位置的确定性,易受到频率分析等攻击方式的威胁。

信息安全之凯撒密码

信息安全之凯撒密码

计科一班刘亮学号:2009221104210051实验一:凯撒密码一:实验目的理解和掌握凯撒密码的原理,可以简单解密。

二、实验原理凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。

例如,如果密匙是把明文字母的位数向后移动三位,那么明文字母B就变成了密文的E,依次类推,X将变成A,Y变成B,Z变成C,由此可见,位数就是凯撒密码加密和解密的密钥。

它是一种代换密码。

据说恺撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码。

实验原理:将明文中的每个字母用引字符在字母表中后面第k个字母替代。

它的加密过程可以表示为下面函数:E(m)=(m+k) mod n其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。

同理可得解密过程。

实验内容:根据实验原理,自己创建明文信息,并选择一个密钥,编写循环移位密码算法的实现程序,实现加密和解密操作。

要求上述密码算法最后的实现程序提供加密和解密两个接口:int encrypt() 和int decrypt()。

当加密或者解密成功时返回CRYPT_OK, 失败时返回CRYPT_ERROR。

所谓的“恺撒密码”,它是一种替代密码,通过将字母按顺序推后起3位起到加密作用,如将字母A换作字母D,将字母B换作字母E。

因据说恺撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码。

这是一种简单的加密方法,这种密码的密度是很低的,只需简单地统计字频就可以破译。

现今又叫“移位密码”,只不过移动的为数不一定是3位而已。

三、实验步骤密码术可以大致别分为两种,即易位和替换,当然也有两者结合的更复杂的方法。

在易位中字母不变,位置改变;替换中字母改变,位置不变。

尽管苏托尼厄斯仅提到三个位置的恺撒移位,但显然从1到25个位置的移位我们都可以使用,因此,为了使密码有更高的安全性,单字母替换密码就出现了。

凯撒密码实验

凯撒密码实验

凯撒密码实验一、实验目的通过实验熟练掌握凯撒密码算法,学会凯撒密码算法程序设计。

二、实验环境软件工具:Visual C++ 6.0操作系统:windows xp三、实验思想在密码学中存在着各种各样的置换方式,但所有不同的置换方式都包含2个相同的元素。

密钥和协议(算法)。

凯撒密码的密钥是3,算法是将普通字母表中的字母用密钥对应的字母替换。

置换加密的优点就在于它易于实施却难于破解. 发送方和接收方很容易事先商量好一个密钥,然后通过密钥从明文中生成密文,即是敌人若获取密文,通过密文直接猜测其代表的意义,在实践中是不可能的。

凯撒密码的加密算法极其简单。

其加密过程如下:在这里,我们做此约定:明文记为m,密文记为c,加密变换记为E(k1,m)(其中k1为密钥),解密变换记为D(k2,m)(k2为解密密钥)(在这里不妨假设k1=k2,记为k)。

凯撒密码的加密过程可记为如下一个变换:c?m+k mod n (其中n为基本字符个数) 同样,解密过程可表示为:m?c+k mod n (其中n为基本字符个数) 四、实验数据(源代码)#include <stdio.h>#include <stdlib.h>#include <string.h>void table(char *keyword) //筛选密钥(去重复去空格){int i,j,k;for(i=0;*(keyword+i)!='\0';i++){for(j=i;*(keyword+j)!='\0';j++){if(i!=j)if(*(keyword+i)==*(keyword+j)||*(keyword+j)==' ') {for(k=j;*(keyword+k)!='\0';k++)*(keyword+k)=*(keyword+k+1);j--;}}}}void newTab(char *keyword) //生成密钥表{char ch;int i;int t;for(t=0;*(keyword+t)!='\0';t++);for(ch='a';ch<='z';ch++){for(i=0;*(keyword+i)!=ch;i++){if(*(keyword+i)=='\0'){*(keyword+t)=ch;t++;break;}}}*(keyword+t)='\0';}char *Ciphertext(char *keyword,char *Plaintext) //按密码表加密 { char ch;int i,j;for(i=0;*(Plaintext+i)!='\0';i++){for(ch='a',j=0;ch<='z';ch++,j++){if(*(Plaintext+i)==ch){*(Plaintext+i)=*(keyword+j);break;}}}return Plaintext;}char *Decrypt(char *keyword,char *Plaintext) //解密 { char ch;int i,j;for(i=0;*(Plaintext+i)!='\0';i++){for(ch='a',j=0;*(keyword+j)!='\0';ch++,j++){if(*(Plaintext+i)==*(keyword+j)){*(Plaintext+i)=ch;break;}}}return Plaintext;}void main(){char *keyword,*Plaintext,*tmp=NULL;keyword=(char*)malloc(sizeof(char));Plaintext=(char*)malloc(sizeof(char));printf("Input key word:"); //输入欲用密钥gets(keyword);printf("Input Plaintext:"); //输入要转换的明文gets(Plaintext);table(keyword); //去空格去重复newTab(keyword); //生成密码表tmp=Ciphertext(keyword,Plaintext); //对应着密码表生成密文puts(tmp); //输出密文puts(Decrypt(keyword,tmp)); //解密输出}五、实验心得通过本次实验,将凯撒密码算法的理论应用到实践中来,利用C++编程实现了凯撒密码算法的加密过程,将理论与实践结合起来,加深了课本上凯撒密码算法理论的理解。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验目的
通过实验熟练掌握凯撒密码算法,学会凯撒密码算法程序设计。

二、实验环境
软件工具:Visual C++ 6.0
操作系统:windows xp
三、实验思想
在密码学中存在着各种各样的置换方式,但所有不同的置换方式都包含2
个相同的元素。

密钥和协议(算法)。

凯撒密码的密钥是3,算法是将普通字母表中的字母用密钥对应的字母替换。

置换加密的优点就在于它易于实施却难于破解. 发送方和接收方很容易事先商量好一个密钥,然后通过密钥从明文中生成密文,即是敌人若获取密文,通过密文直接猜测其代表的意义,在实践中是不可能的。

凯撒密码的加密算法极其简单。

其加密过程如下:
在这里,我们做此约定:明文记为m,密文记为c,加密变换记为E(k1,m)(其中k1为密钥),解密变换记为D(k2,m)(k2为解密密钥)(在这里不妨假设
k1=k2,记为k)。

凯撒密码的加密过程可记为如下一个变换:
c≡m+k mod n (其中n为基本字符个数)同样,解密过程可表示为:
m≡c+k mod n (其中n为基本字符个数)
四、实验数据(源代码)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void table(char *keyword) //筛选密钥(去重复去空格)
{
int i,j,k;
for(i=0;*(keyword+i)!='\0';i++)
{
for(j=i;*(keyword+j)!='\0';j++)
{
if(i!=j)
if(*(keyword+i)==*(keyword+j)||*(keyword+j)==' ')
{
for(k=j;*(keyword+k)!='\0';k++)
*(keyword+k)=*(keyword+k+1);
j--;
}
}
}
}
void newTab(char *keyword) //生成密钥表
{
char ch;
int i;
int t;
for(t=0;*(keyword+t)!='\0';t++);
for(ch='a';ch<='z';ch++)
{
for(i=0;*(keyword+i)!=ch;i++)
{
if(*(keyword+i)=='\0')
{
*(keyword+t)=ch;
t++;
break;
}
}
}
*(keyword+t)='\0';
}
char *Ciphertext(char *keyword,char *Plaintext) //按密码表加密{
char ch;
int i,j;
for(i=0;*(Plaintext+i)!='\0';i++)
{
for(ch='a',j=0;ch<='z';ch++,j++)
{
if(*(Plaintext+i)==ch)
{
*(Plaintext+i)=*(keyword+j);
break;
}
}
}
return Plaintext;
}
char *Decrypt(char *keyword,char *Plaintext) //解密
{
char ch;
int i,j;
for(i=0;*(Plaintext+i)!='\0';i++)
{
for(ch='a',j=0;*(keyword+j)!='\0';ch++,j++)
{
if(*(Plaintext+i)==*(keyword+j))
{
*(Plaintext+i)=ch;
break;
}
}
}
return Plaintext;
}
void main()
{
char *keyword,*Plaintext,*tmp=NULL;
keyword=(char*)malloc(sizeof(char));
Plaintext=(char*)malloc(sizeof(char));
printf("Input key word:"); //输入欲用密钥
gets(keyword);
printf("Input Plaintext:"); //输入要转换的明文
gets(Plaintext);
table(keyword); //去空格去重复
newTab(keyword); //生成密码表
tmp=Ciphertext(keyword,Plaintext); //对应着密码表生成密文
puts(tmp); //输出密文
puts(Decrypt(keyword,tmp)); //解密输出
}
五、实验心得
通过本次实验,将凯撒密码算法的理论应用到实践中来,利用C++编程实现了凯撒密码算法的加密过程,将理论与实践结合起来,加深了课本上凯撒密码算法理论的理解。

相关文档
最新文档