信息安全基础实验报告——凯撒密码(java)
- 格式:doc
- 大小:94.00 KB
- 文档页数:3
一、实习名称古典加密算法二、实习目的1.熟悉java平台开发环境;2.理解常见古典加密算法:凯撒密码、多字母替代密码、多表替代密码;3.理解古典加密技术中的替换技术、置换技术。
三、实习内容1.[问题描述]凯撒密码是把字母表中的每个字母用该字母后的某个字母进行代替。
凯撒密码的通用加密算法是:C=E(P)=(P+k) mod 26 0<k<26凯撒密码的通用解密算法是:P=D(C)=(P-k) mod 26 0<k<262.[基本要求]实现凯撒密码的加密、解密算法,能够根据用户选择秘钥(移位数)和明文进行加解密。
3.[实现提示](1) 用户可以通过命令实现密钥和明文的选择;(2) 由于字母表中共有26个字符,因此,移位前应先将移动的位数(key)和26取模。
Java 平台中可以实现字符和整数的自动转换,因此将字符加上一个正整数代表在字母表中右移位数。
如果移动的位数为负值,则代表在字母中左移位数。
(3) 尽管移位前已经将移动的位数和26取模,但是通过这种方式实现的右移和左移仍可能发生超界。
因此,移位后仍要判断是否超界。
四、操作过程(1)设计加密解密算法根据通用的的加密解密算法(凯撒密码的通用加密算法是:C=E(P)=(P+k) mod 26 0<k<26;凯撒密码的通用解密算法是:P=D(C)=(P-k) mod 26,0<k<26)推导更为复杂的算法。
第一步首先扩充加密解密的字符表,从26个英文字母扩充到ASC码所有非控制字符。
为了方便加减字符表,设计了WordTable类,该类为KeyTable类的数组集合,储存所有可识别字符,并在此加入了空格符,因此可以识别多个以空格为分隔符的字符串。
第二步扩充了加密解密的起始位,可以将起始位设置为任意数字。
经过两步的算法升级,新的凯撒密码的加密算法是:C=E(P)=(P-s+k) mod l+s;凯撒密码的解密算法是:C=E(P)=(P-s-k) mod l+s,该算法中,s代表起始位,k代表密钥值,l代表字符表的长度,即可识别的字符个数。
【实验目的】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. 理解凯撒密码的加密和解密原理;2. 掌握凯撒密码的编程实现;3. 分析凯撒密码的安全性,了解其局限性;4. 比较凯撒密码与其他加密算法的差异。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm四、实验内容1. 凯撒密码加密和解密算法实现2. 凯撒密码安全性分析3. 凯撒密码与其他加密算法的比较五、实验步骤1. 凯撒密码加密和解密算法实现(1)定义凯撒密码加密和解密函数```pythondef caesar_encrypt(text, shift):encrypted_text = ""for char in text:if char.isalpha():shifted = ord(char) + shiftif char.isupper():if shifted > ord('Z'):shifted -= 26elif char.islower():if shifted > ord('z'):shifted -= 26encrypted_text += chr(shifted) else:encrypted_text += charreturn encrypted_textdef caesar_decrypt(text, shift):decrypted_text = ""for char in text:if char.isalpha():shifted = ord(char) - shiftif char.isupper():if shifted < ord('A'):shifted += 26elif char.islower():if shifted < ord('a'):shifted += 26decrypted_text += chr(shifted)else:decrypted_text += charreturn decrypted_text```(2)测试凯撒密码加密和解密函数```pythonif __name__ == "__main__":text = "Hello, World!"shift = 3encrypted_text = caesar_encrypt(text, shift)decrypted_text = caesar_decrypt(encrypted_text, shift)print("Original text:", text)print("Encrypted text:", encrypted_text)print("Decrypted text:", decrypted_text)```2. 凯撒密码安全性分析凯撒密码的安全性非常低,因为其密钥空间只有26个可能的值(即字母表中的字母数量)。
上机实验报告一、实验目的:本次上机实践所涉及并要求掌握的知识点。
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四、实验总结通过上机实践,对所学内容的某个知识点有了更深入的理解,写出一些体会、学习心得,甚至是改进意见。
第1篇一、实验目的通过本次实验,掌握凯撒加密法的原理和步骤,了解其在密码学中的应用,并能够使用Python语言实现凯撒加密和解密功能。
二、实验原理凯撒加密法是一种最简单且最广为人知的替换加密技术。
其基本原理是将明文中的每个字母按照字母表的顺序向后(或向前)移动一个固定数目的位置,从而生成密文。
例如,当偏移量为3时,明文中的A将变成D,B变成E,以此类推。
凯撒加密法的密钥是偏移量,它决定了加密过程中字母的移动方向和距离。
密钥的取值范围是1到25,表示将字母表向后移动1到25个位置。
三、实验内容1. 凯撒加密使用Python语言实现凯撒加密功能,具体步骤如下:- 定义一个函数,接收明文和密钥作为参数。
- 将明文中的每个字母按照字母表的顺序向后移动密钥指定的位置。
- 对于超出字母表范围的字母,将其转换回字母表的首部。
- 返回加密后的密文。
2. 凯撒解密使用Python语言实现凯撒解密功能,具体步骤如下:- 定义一个函数,接收密文和密钥作为参数。
- 将密文中的每个字母按照字母表的顺序向前移动密钥指定的位置。
- 对于超出字母表范围的字母,将其转换回字母表的首部。
- 返回解密后的明文。
3. 实验演示使用实验代码演示凯撒加密和解密过程,包括以下示例:- 示例1:明文为“The quick brown fox jumps over the lazy dog”,密钥为3,加密后的密文为“Wkh txlfn eurzq ira mxpsv ryhu wkh odcb grj”。
- 示例2:密文为“Wkh txlfn eurzq ira mxpsv ryhu wkh odcb grj”,密钥为3,解密后的明文为“The quick brown fox jumps over the lazy dog”。
四、实验结果与分析1. 加密效果通过实验验证,凯撒加密法能够有效地将明文转换为密文,且解密过程也能够将密文恢复为明文。
古典密码的实验报告古典密码的实验报告引言:密码学作为一门古老而又神秘的学科,一直以来都吸引着人们的兴趣。
在古代,人们用各种各样的密码来保护重要信息的安全性。
本实验旨在通过实际操作,探索古典密码的加密原理和破解方法,从而深入了解密码学的基本概念和应用。
一、凯撒密码凯撒密码,又称移位密码,是最简单的一种古典密码。
其原理是通过将明文中的每个字母按照一定的规则进行移位,得到密文。
在本实验中,我们选择了一个简单的凯撒密码进行破解。
首先,我们选择了一段明文:“HELLO WORLD”,并将其按照凯撒密码的规则进行移位,假设移位数为3,则得到密文:“KHOOR ZRUOG”。
接下来,我们尝试使用暴力破解的方法来还原明文。
通过尝试不同的移位数,我们发现当移位数为3时,得到的明文与原文完全一致。
这表明我们成功地破解了凯撒密码,并还原了原始的明文。
二、维吉尼亚密码维吉尼亚密码是一种基于多个凯撒密码组合而成的密码算法。
其原理是通过使用不同的移位数对明文进行加密,从而增加了密码的复杂度。
在本实验中,我们选择了一段明文:“CRYPTOGRAPHY”,并使用维吉尼亚密码进行加密。
我们选择了一个关键词“KEY”作为加密密钥。
首先,我们将关键词“KEY”重复至与明文长度相同,得到“KEYKEYKEYKEYK”。
然后,将明文中的每个字母与关键词中对应位置的字母进行凯撒密码的移位操作。
经过加密后,我们得到了密文:“LXFOPVEFRNHR”。
接下来,我们尝试使用破解方法来还原明文。
通过尝试不同的关键词和移位数的组合,我们发现当关键词为“KEY”且移位数为3时,得到的明文与原文完全一致。
这表明我们成功地破解了维吉尼亚密码,并还原了原始的明文。
三、栅栏密码栅栏密码是一种基于换位操作的密码算法。
其原理是通过将明文中的字母按照一定的规则进行重新排列,得到密文。
在本实验中,我们选择了一段明文:“HELLO WORLD”,并使用栅栏密码进行加密。
java课程设计凯撒加密解密一、教学目标本章节的教学目标旨在让学生掌握Java语言实现凯撒加密和解密的方法。
通过本章节的学习,学生应达到以下目标:1.知识目标:了解凯撒加密和解密的基本原理;掌握Java语言的基本语法和编程技巧;理解循环、条件语句在程序中的应用。
2.技能目标:能够使用Java语言编写简单的凯撒加密和解密程序;能够分析并解决程序中的错误和问题;能够协作完成编程任务,提高团队协作能力。
3.情感态度价值观目标:培养对计算机科学的兴趣和好奇心;培养学生的创新精神和实践能力;培养学生的团队合作意识和沟通能力。
二、教学内容本章节的教学内容主要包括以下几个部分:1.凯撒加密和解密的基本原理;2.Java语言的基本语法和编程技巧;3.循环、条件语句在程序中的应用;4.凯撒加密和解密程序的编写与调试。
第1课时:凯撒加密和解密的基本原理;第2课时:Java语言的基本语法和编程技巧;第3课时:循环、条件语句在程序中的应用;第4课时:凯撒加密和解密程序的编写与调试。
为了提高教学效果,本章节将采用以下教学方法:1.讲授法:讲解凯撒加密和解密的基本原理,以及Java语言的基本语法和编程技巧;2.案例分析法:分析典型的凯撒加密和解密案例,引导学生理解并掌握相关知识;3.实验法:让学生动手编写凯撒加密和解密程序,培养学生的实践能力;4.讨论法:学生进行小组讨论,分享编程心得,提高学生的团队协作能力。
四、教学资源为了支持教学内容和教学方法的实施,本章节将准备以下教学资源:1.教材:Java编程入门教程;2.参考书:Java语言程序设计;3.多媒体资料:凯撒加密和解密的案例视频;4.实验设备:计算机、网络环境。
五、教学评估本章节的教学评估将采用多元化的评价方式,以全面、客观地评价学生的学习成果。
评估内容包括:1.平时表现:通过课堂参与、提问、回答问题等环节,评估学生的学习态度和积极性;2.作业:布置相关的编程作业,评估学生的理解和应用能力;3.实验报告:评估学生在实验过程中的操作能力和解决问题的能力;4.考试:设置期末考试,检验学生对凯撒加密和解密知识的掌握程度。
凯撒密码(Java)事实上就是把每个字母偏移⼀下⽽已,并且字符不限于a-zA-z,可以是别的,那就很显⽽易见了,代码如下:定义⼀个Caesar密码类,成员变量只有密钥,也就是偏移量key代码如下:public class CaesarCrypto {private int key;public CaesarCrypto(int key) {// TODO Auto-generated constructor stubthis.key = key;}public String getCipher(String plain) {char[] cipherChars = plain.toCharArray();for (int i = 0; i < cipherChars.length; i++) {cipherChars[i] = (char) (cipherChars[i] + this.key);}return new String(cipherChars);}public String getPlain(String cipher) {char[] cipherChars = cipher.toCharArray();for (int i = 0; i < cipherChars.length; i++) {cipherChars[i] = (char) (cipherChars[i] - this.key);}return new String(cipherChars);}public static void main(String[] args) {String text = "Java is the best language in the world!";System.out.println("明⽂:" + text);CaesarCrypto cc = new CaesarCrypto(4);String cipher = cc.getCipher(text);System.out.println("密⽂:" + cipher);System.out.println("解密" + cc.getPlain(cipher));}}结果如下:明⽂:Java is the best language in the world!密⽂:Neze$mw$xli$fiwx$perkyeki$mr$xli${svph%解密Java is the best language in the world!。
信息安全实验报告
一、实验目的和背景
本次实验的目的是研究信息安全领域的一种基础技术,密码学。
密码学在信息安全中起到了至关重要的作用,通过研究密码学可以了解和掌握信息加密、解密的基本原理和方法,从而有效地保护信息的安全性和私密性。
二、实验内容和步骤
本次实验采用了经典的凯撒密码算法进行加密和解密实验。
1.凯撒密码加密
凯撒密码是一种替换加密方法,将明文中的每个字母通过一个固定的偏移量进行替换,得到密文。
实验中,我们将偏移量设置为3,即明文中的每个字母都被替换成后面第3个字母。
2.凯撒密码解密
凯撒密码的解密过程与加密过程相反,将密文中的每个字母通过一个固定的偏移量进行替换,得到明文。
实验中,我们将偏移量设置为3,即密文中的每个字母都被替换成前面第3个字母。
三、实验结果
通过凯撒密码加密和解密实验,得到以下结果:。
凯撒密码加密解密实训原理凯撒密码是一种简单的替代密码,它通过将字母按照一定的位移量向右(或向左)进行替换来进行加密和解密。
下面是凯撒密码的加密和解密原理的实训步骤:1. 加密原理:-将明文中的每个字母按照指定的位移量向右进行替换。
例如,位移量为3,将字母A替换为D,B替换为E,以此类推。
-对于非字母字符(如空格、标点符号等),保持不变。
-加密后的密文即为替换后的字母序列。
2. 解密原理:-将密文中的每个字母按照指定的位移量向左进行替换即可恢复为明文。
-对于非字母字符,保持不变。
实际操作中,可以使用以下步骤进行凯撒密码的加密和解密:1. 定义加密和解密函数:```pythondef caesar_encrypt(plain_text, shift):encrypted_text = ""for char in plain_text:if char.isalpha():if char.islower():encrypted_text += chr((ord(char) - ord('a') + shift) % 26 + ord('a'))else:encrypted_text += chr((ord(char) - ord('A') + shift) % 26 + ord('A'))else:encrypted_text += charreturn encrypted_textdef caesar_decrypt(encrypted_text, shift):decrypted_text = ""for char in encrypted_text:if char.isalpha():if char.islower():decrypted_text += chr((ord(char) -ord('a') -shift) % 26 + ord('a'))else:decrypted_text += chr((ord(char) - ord('A') - shift) %26 + ord('A'))else:decrypted_text += charreturn decrypted_text```2. 调用加密和解密函数:```pythonplain_text = "Hello, World!"shift = 3encrypted_text = caesar_encrypt(plain_text, shift)decrypted_text = caesar_decrypt(encrypted_text, shift)print("加密后的密文:", encrypted_text)print("解密后的明文:", decrypted_text)```在实际应用中,可以通过调整位移量来加密和解密信息。
古典密码实验报告一、实验目的本次古典密码实验的主要目的是深入了解和掌握几种常见的古典密码技术,包括恺撒密码、栅栏密码、维吉尼亚密码等,并通过实际操作和分析,探究其加密和解密的原理与过程,以及这些密码技术的安全性和局限性。
二、实验环境本次实验在个人计算机上进行,使用了 Python 编程语言作为主要的实验工具。
同时,还借助了一些在线密码分析工具和网站,以辅助对密码的分析和破解。
三、实验原理(一)恺撒密码恺撒密码是一种简单的替换密码,通过将明文中的每个字母按照一定的偏移量进行替换来实现加密。
例如,偏移量为 3 时,A 被替换为D,B 被替换为 E,以此类推。
(二)栅栏密码栅栏密码是一种置换密码,将明文按照一定的栏数进行分组,然后按照一定的顺序读取分组中的字母来得到密文。
(三)维吉尼亚密码维吉尼亚密码是一种多表替换密码,使用一个密钥字符串来决定每个明文字母的替换字母。
密钥字符串被重复使用,直到覆盖整个明文。
四、实验步骤(一)恺撒密码实验1、选择一段明文,例如:“Hello World”。
2、设定偏移量,假设为 5。
3、按照恺撒密码的加密规则,对明文中的每个字母进行偏移替换,得到密文。
4、尝试对密文进行解密,通过反向偏移来恢复明文。
(二)栅栏密码实验1、选取一段明文,比如:“This is a secret message”。
2、确定栏数,假设为 3。
3、将明文按照栏数进行分组,并按照特定顺序读取字母,得到密文。
4、尝试通过分析密文的规律,恢复明文。
(三)维吉尼亚密码实验1、选择明文,例如:“Encryption and Decryption”。
2、设定密钥,如“KEY”。
3、根据维吉尼亚密码的加密规则,使用密钥对明文进行加密。
4、尝试对生成的密文进行破解,分析密钥的长度和可能的内容。
五、实验结果与分析(一)恺撒密码1、加密结果:明文“Hello World”在偏移量为 5 的情况下,加密得到的密文为“Mjqqt Btwqi”。
第1篇一、实验目的1. 理解凯撒密码的基本原理和加密解密过程;2. 掌握C语言编程实现凯撒密码;3. 提高编程能力和密码学基础知识。
二、实验环境1. 软件工具:Visual Studio 20192. 操作系统:Windows 10三、实验内容1. 凯撒密码原理介绍凯撒密码是一种最简单的移位密码,通过将字母表中的每个字母向前或向后移动固定数量位置来进行加密和解密。
例如,密钥为3时,A会被加密为D,B会被加密为E,以此类推。
解密过程是将密文中的每个字母向前或向后移动相同的位数,恢复出明文。
2. C语言实现凯撒密码(1)加密函数```cvoid caesar_encrypt(char input, char output, int key) {int i = 0;while (input[i] != '\0') {if (input[i] >= 'A' && input[i] <= 'Z') {output[i] = ((input[i] - 'A' + key) % 26) + 'A';} else if (input[i] >= 'a' && input[i] <= 'z') {output[i] = ((input[i] - 'a' + key) % 26) + 'a';} else {output[i] = input[i];}i++;}output[i] = '\0';}```(2)解密函数```cvoid caesar_decrypt(char input, char output, int key) {int i = 0;while (input[i] != '\0') {if (input[i] >= 'A' && input[i] <= 'Z') {output[i] = ((input[i] - 'A' - key + 26) % 26) + 'A'; } else if (input[i] >= 'a' && input[i] <= 'z') {output[i] = ((input[i] - 'a' - key + 26) % 26) + 'a'; } else {output[i] = input[i];}i++;}output[i] = '\0';}```3. 测试程序```cinclude <stdio.h>include <string.h>void caesar_encrypt(char input, char output, int key) { // 加密函数}void caesar_decrypt(char input, char output, int key) { // 解密函数}int main() {char input[100], output[100];int key;printf("请输入密钥(1-25): ");scanf("%d", &key);printf("请输入明文: ");scanf("%s", input);caesar_encrypt(input, output, key);printf("加密结果: %s\n", output);caesar_decrypt(output, input, key);printf("解密结果: %s\n", input);return 0;}```四、实验结果与分析1. 实验结果(1)输入密钥为3,明文为"hello world",加密结果为"kiho world",解密结果为"hello world";(2)输入密钥为5,明文为"goodbye world",加密结果为"jvvhv world",解密结果为"goodbye world"。
光信学院《网络信息安全》实验报告1班级:学号:姓名:实验时间:年月日指导教师:陈顺凡一.实验目的理解网络信息安全的基本原理,掌握基本密码技术的原理及编程能力。
二.实验原理和内容[凯撒介绍]凯撒密码(kaiser)是罗马扩张时期朱利斯"凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。
它将字母表中的字母移动一定位置而实现加密。
[加密原理]凯撒密码的加密算法极其简单。
其加密过程如下:在这里,我们做此约定:明文记为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为基本字符个数)对于计算机而言,n可取256或128,m、k、c均为一个8bit 的二进制数。
显然,这种加密算法极不安全,即使采用穷举法,最多也只要255次即可破译。
当然,究其本身而言,仍然是一个单表置换,因此,频率分析法对其仍是有效的。
.[破解原理]一篇包含字符的英文文章,其各ASCII码字符出现,都有一定的频率,下面是对Google上随意搜索到的英文文章进行分析的结果,见表:QUOTE:================================================= FileName : 01.txt[1] 32: times:204[2] 101:e times:134[3] 116:t times:91[4] 105:i times:87[5] 111:o times:77[6] 108:l times:75[7] 97:a times:75[8] 110:n times:69[9] 10:times:67[10] 115:s times:63================================================= FileName : php.si.source.txt[1] 32: times:576[2] 101:e times:162[3] 115:s times:153[4] 110:n times:141[5] 114:r times:138[6] 105:i times:135[7] 10:times:134[8] 116:t times:129[9] 42:* times:116[10] 111:o times:103================================================= FileName : work.txt[1] 32: times:51322[2] 101:e times:30657[3] 116:t times:23685[4] 97:a times:19038[5] 111:o times:17886[6] 105:i times:16156[7] 110:n times:15633[8] 114:r times:15317[9] 115:s times:15226[10] 104:h times:12191================================================= FileName : 02.txt[1] 32: times:299[2] 101:e times:217[3] 110:n times:136[4] 105:i times:133[5] 111:o times:124[6] 116:t times:116[7] 97:a times:110[8] 115:s times:98[9] 114:r times:92[10] 108:l times:82================================================= FileName : 03.txt[1] 45:- times:404[2] 32: times:394[3] 101:e times:237[4] 116:t times:196[5] 114:r times:173[6] 97:a times:163[7] 105:i times:161[8] 110:n times:153[9] 111:o times:142[10] 115:s times:129================================================= FileName : 04.txt[1] 32: times:326[2] 101:e times:179[3] 116:t times:106[4] 105:i times:101[5] 111:o times:96[6] 110:n times:94[7] 97:a times:92[8] 115:s times:78[9] 100:d times:61[10] 114:r times:60================================================= FileName : 05.txt[1] 32: times:441[2] 101:e times:191[3] 111:o times:151[4] 116:t times:120[5] 97:a times:112[6] 110:n times:108[7] 105:i times:91[8] 114:r times:84[9] 117:u times:79[10] 115:s times:79有此分析可知,一篇英文文章中,出现较高频率的两个字符是 ' ' (空格) 和 'e',而且它们的ASCII码分别是32和101,差值是69。
实验成绩《信息安全概论》实验报告实验一古典密码实验专业班级:学号:姓名:完成时间:2016/ 05/ 09一、实验目的理解简单加密算法的原理;掌握凯撒密码的原理,完成凯撒密码加解密程序的编写;通过实验,加深对古典密码体制的了解,掌握对字符进行灵活处理的方法。
二、实验内容根据凯撒密码的原理编写程序,对输入的符号串能够根据设置的密钥分别正确实现凯撒加密和解密功能。
三、实验环境和开发工具1.Windows 7 系统2.Eclipse3.JDK 1.7四、实验步骤和结果首先获取要加密的内容以及密钥,凯撒密码的密钥即字符移动的位数。
由于凯撒密码器的移位是针对字符的,因此需要将待加密的内容中每个字符取出,然后针对每个字符分别加以移位。
主要步骤如下:(1)读取要加密的字符串、密钥。
(2)取出字符串中每个字符。
使用字符串类的 charAt()方法取出每个字符,分别加以移位。
叮叮小文库(3)对每个字符进行移位。
由于字母表中共26个字符,因此移位前先将移动的位数(key)和26取模。
由于Java中字符和整型可自动转换,因此将字符加上一个正整数即代表在字母表中右移多少位。
如果移动的位数是负值,则代表在字母表中左移多少位。
尽管在移动之前已经将移动的位数和26取了模,但通过这种方式实现右移或左移仍可能发生超界。
如字母x右移4位应该是字母b,但将字母x增加4后超出26个字母的范围。
因此移位后使用两个if语句判断一下,如果向左超界(c<'a')则增加26;向右超界(c>'z')则减去26。
源程序:package Caesar;import java.io.*;import java.util.Scanner;/*** @author SiRuYan*/public class Caesar {// 声明一些全局变量public static String path;public static String estr = "";public static char c;/*** 凯撒密码加密方法** @param str* @param n*/public static void Encode(String str, int n) {for (int i = 0; i < str.length(); i++) {c = str.charAt(i);if (c >= 'a' && c <= 'z')if (c + n % 26 <= 'z') // 移位后的字母不大于小写字母z,直接移位estr += (char) (c + n % 26);else// 移位后的字母大于小写字母z,需要在26个字母之间循环estr += (char) ('a' + ((n - ('z' - c) - 1) % 26));else if (c >= 'A' && c <= 'Z')叮叮小文库if (c + n % 26 <= 'Z') // 移位后的字母不大于大写字母Z,直接移位estr += (char) (c + n % 26);else// 移位后的字母大于大写字母z,需要在26个字母之间循环estr += (char) ('A' + ((n - ('Z' - c) - 1) % 26));else if (c >= '0' && c <= '9') // 对数字进行加密if (c + n % 10 <= '9')estr += (char) (c + n % 10);elseestr += (char) ('0' + ((n - ('9' - c) - 1) % 10));elseestr += c;}}/*** 凯撒密码解密方法* @param str* @param n*/public static void Decode(String str, int n) {for (int i = 0; i < str.length(); i++) {c = str.charAt(i);if (c >= 'a' && c <= 'z')if (c - n % 26 >= 'a')estr += (char) (c - n % 26);elseestr += (char) ('z' - (n - (c - 'a') - 1) % 26);else if (c >= 'A' && c <= 'Z')if (c - n % 26 >= 'A')estr += (char) (c - n % 26);elseestr += (char) ('Z' - (n - (c - 'A') - 1) % 26);else if (c >= '0' && c <= '9')if (c - n % 10 >= '0')estr += (char) (c - n % 10);elseestr += (char) ('9' - (n - (c - '0') - 1) % 10);elseestr += c;}}public static void main(String args[]) {String array = "";Scanner in = null;int num;叮叮小文库System.out.println("----------------凯撒密码----------------");System.out.println("------只支持英文和阿拉伯数字-By SiRuYan------");try {System.out.println("1、加密\n2、解密\n3、暴力破解");System.out.print("请选择:");in = new Scanner(System.in); // 读入选择序号String ed = in.next();if (ed.equals("1") || ed.equals("2") || ed.equals("3")) {System.out.print("文件路径(*.txt):");path = in.next(); // 读入加密文件路径File file = new File(path); // 声明文件变量,以便读入指定文件路径下的文件内容FileInputStream rdf = new FileInputStream(file);// available()(FileInputStream变量)方法返回的实际可读字节数,也就是总大小byte[] s = new byte[rdf.available()];// System.out.println("文件的大小:"+rdf.available()); 测试语句int b = rdf.available();while ((b = rdf.read(s, 0, b)) != -1) { // 将文件内容读入字节数组中String content = new String(s, 0, b);array = array + content;}rdf.close(); // 关闭输入流if (ed.equals("3")) { // 3 暴力破解for (int k = 1; k <= 25; k++) {Decode(array, k);System.out.println("密钥为 " + k + " 时,结果是" + estr);estr = "";if (k >= 10) {for (int j = 1; j <= 9; j++) {Decode(array, k + 26 * j);System.out.println("密钥为 " + (k + 26 * j)+ " 时,结果为" + estr);estr = "";}}}System.out.print("正确的密钥为(整数):");int result = in.nextInt();Decode(array, result);} else {System.out.print("密钥(整数):");num = in.nextInt();if (ed.equals("1")) // 1 加密Encode(array, num);else// 2 解密Decode(array, num);}// 最后重新把加密、解密后的内容,借助文件、缓冲区输入流重新写入文件File f = new File(path);FileWriter outFile = new FileWriter(f);BufferedWriter bufferOut = new BufferedWriter(outFile);bufferOut.write(estr);bufferOut.newLine();bufferOut.flush();bufferOut.close();System.out.print("原文件是否已成功加密或解密!");} elseSystem.out.print("您输入有误。
JAVA第⼀次实验——凯撒密码的实现JAVA实验⼀编写程序实现凯撒密码201352330 潘俊洋⼀.实验说明凯撒密码作为⼀种最为古⽼的对称加密体制,在古罗马的时候都已经很流⾏,他的基本思想是:通过把字母移动⼀定的位数来实现加密和解密。
例如,如果字母的位数是3,明⽂字母B就变成了密⽂的E,依次类推,X将变成A,Y变成B,Z变成C,由此可见,位数就是凯撒密码加密和解密的密钥。
所以在程序中密钥key=3。
⼆.实验分析1.由于字母表中共26个字符,因此移位前先将移动的位数(key)和26取模。
由于Java中字符和整型可⾃动转换,因此将字符加上⼀个正整数即代表在字母表中右移多少位。
如果移动的位数是负值,则代表在字母表中左移多少位。
尽管在移动之前已经将移动的位数和26取了模,但通过这种⽅式实现右移或左移仍可能发⽣超界。
如字母x右移3位应是字母a,但将字母x增加3后超出26个字母的范围。
因此移位后使⽤两个if语句判断⼀下,如果向左超界(c<'a')则增加26;向右超界(c>'z')则减去26。
程序中⽤户输⼊需要⽤到Scanner例: Scanner input = new Scanner(System.in)import java.util.ScannerScannerScanner input = new Scanner();Scanner对象是可以读取控制台的输⼊这是⼀般的对象创建⽅法. 加了⼀个对象System.in参数,表⽰传递的是键盘的输⼊三.流程图(本⼈并不擅长做流程图 qvq)四.实验代码import java.util.Scanner;public class Test{void mj(){Scanner in = new Scanner(System.in);System.out.print("请选择操作(1.加密 2.解密):");int n=in.nextInt();if(n == 1){System.out.print("请输⼊待加密的字符串:");String str = in.next();String jm="";int key = 3;//凯撒密码加密,向后移位3位for(int i = 0;i < str.length();i++){char c = str.charAt(i);if(c >= 'a'&&c <= 'z'){if(c>='x'&&c<='z'){c-=26;c+=key;}else{c+=key;}}else if(c >= 'A'&&c <= 'Z'){if(c>='X'&&c<='Z'){c-=26;c+=key;}else{c+=key;}}jm += c;}System.out.print("加密后的字符串是:"+jm);System.out.print("\n输⼊任意建继续,0结束程序:"); n=in.nextInt();if(n==0){System.out.print(" 谢谢使⽤本程序,欢迎再次使⽤!"); }else{this.mj();}}else if(n == 2){System.out.print("请输⼊待解密的字符串:"); String str = in.next();String jm="";int key = -3;//凯撒密码解密,向前移位3位for(int i = 0;i < str.length();i++){char c = str.charAt(i);if(c >= 'a'&&c <= 'z'){if(c>='a'&&c<='c'){c+=26;c+=key;}else{c+=key;}}else if(c >= 'A'&&c <= 'Z'){if(c>='A'&&c<='C'){c+=26;c+=key;}else{c+=key;}}jm += c;}System.out.println("解密后的字符串:"+jm);System.out.print("\n输⼊任意建继续,0结束程序:");n=in.nextInt();if(n==0){System.out.print(" 谢谢使⽤本程序,欢迎再次使⽤!");}else{this.mj();}}else{System.out.print("请输⼊1或2,其他字符⽆效!\n输⼊任意建继续,0结束程序:"); n=in.nextInt();if(n==0){System.out.print(" 谢谢使⽤本程序,欢迎再次使⽤!");}else{this.mj();}}}public static void main(String[] args){Test mj=new Test();System.out.println("******欢迎使⽤凯撒密码******");mj.mj();}}五.运⾏测试六.实验感受在JAVA上实现了凯撒密码程序的设计和运⾏,结合密码学和JAVA的知识,同时提⾼和巩固了密码学和JAVA的学习内容。
实验报告实验课程:信息安全课程实验实验项目:凯撒密码实验时间:系:班级:姓名:学号:指导教师:同组人:实验目的:1. 简单加密方法的原理2. 凯撒密码的原理及程序的编写实验开设方式:个人或分组实验设备与环境:连网的个人计算机Windows 2000 系统平台相关知识点:凯撒密码就是单表代替密码,它的每一个明文字符都由其右边第3个(模26)字符代替(A由D代替,B由E代替,W由Z代替,X由A代替,Y由B代替,Z 由C代替)。
CAESAR密码几种变换:(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实验内容:1.请同学们采用一种你熟悉的语言编写通过凯撒密码原理实现的加密器。
要求:对文档中的任意几个字符能做正确的加密变换。
加密器做加法变换后仍然可以正确加密。
2.通过凯撒密码的原理实现解密器。
程序如下:#include<stdio.h>#include<math.h>#include<stdlib.h>#include<string.h>#define num 100#define clrscr() system("cls")static int c[100];char einf0(char ch,int key) /*加法加密*/{if(ch>='a'&&ch<='z')ch=(ch+key%26-'a')%26+'a';else if(ch>='A'&&ch<='Z')ch=(ch+key%26-'A')%26+'A';else if(ch>='0'&&ch<='9')ch=(ch+key%10-'0')%10+'0';return ch;}char doutf0(char ch,int key) /*乘法加密*/{if(ch>='a'&&ch<='z')ch=(ch-key%26-'a'+26)%26+'a';else if(ch>='A'&&ch<='Z')ch=(ch-key%26-'A'+26)%26+'A';else if(ch>='0'&&ch<='9')ch=(ch-key%10-'0'+10)%10+'0';return ch;}char einf1(char ch,int key,int c[]) /*加法解密*/{static int i=0;if(ch>='a'&&ch<='z'){c[i++]=(ch-'a')*(key)/26;ch=(ch-'a')*(key)%26+'a';}else if(ch>='A'&&ch<='Z'){c[i++]=(ch-'A')*(key)/26;ch=(ch-'A')*(key)%26+'A';}else if(ch>='0'&&ch<='9'){c[i++]=(ch-'0')*(key)/10;ch=(ch-'0')*(key)%10+'0';}return ch;}char doutf1(char ch,int key,int c[]) /*乘法解密*/{static int j=0;if(ch>='a'&&ch<='z')ch=((ch-'a')+(c[j++])*26)/(key)+'a';else if(ch>='A'&&ch<='Z')ch=((ch-'A')+(c[j++])*26)/(key)+'A';else if(ch>='0'&&ch<='9')ch=((ch-'0')+(c[j++])*10)/(key)+'0';return ch;}void einf_doutf_f(char* inf,int key,char* outf,int flag) /*加法,乘法调用*/ {FILE *in,*out;char ch;clrscr();if((in=fopen(inf,"r"))==NULL){printf("can not open the inf!\n");printf("press any key to exit!\n");exit(0);}if((out=fopen(outf,"w"))==NULL){printf("can not open the outf!\n");printf("press any key to exit!\n");fclose(in);exit(0);}ch=fgetc(in);while(ch!=EOF){if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')){if(flag==1)fputc(einf0(ch,key),out);if(flag==2)fputc(doutf0(ch,key),out);if(flag==3)fputc(einf1(ch,key,c),out);if(flag==4)fputc(doutf1(ch,key,c),out);}elsefputc(ch,out);ch=fgetc(in);}fclose(in);fclose(out);}int main(){int k;int ch0;char inf[num];char outf[num];int flag;clrscr();while(1){clrscr();printf("\nplease choice the way:1:einf0 2:doutf0 3:einf1 4:doutf1:\n"); scanf("%d",&ch0);if(ch0==1){flag=1;printf("\nplease input the inf:\n");scanf("%s",inf);printf("\nplease input the key:\n");scanf("%d",&k);if(k==0)printf("error");else{printf("\nplease input the outf:\n");scanf("%s",outf);einf_doutf_f(inf,k,outf,flag);printf("\neinf is over!\n");}}else if(ch0==2){flag=2;printf("\nplease input the inf:\n");scanf("%s",inf);printf("\nplease input the key:\n"); scanf("%d",&k);if(k==0)printf("error");else{printf("\nplease input the outf:\n"); scanf("%s",outf);einf_doutf_f(inf,k,outf,flag); printf("\ndinf is over!\n");}}else if(ch0==3){flag=3;printf("\nplease input the inf:\n"); scanf("%s",inf);printf("\nplease input the key:\n"); scanf("%d",&k);if(k==0)printf("error");else{printf("\nplease input the outf:\n"); scanf("%s",outf);einf_doutf_f(inf,k,outf,flag); printf("\ndinf is over!\n");}}else if(ch0==4){flag=4;printf("\nplease input the inf:\n"); scanf("%s",inf);printf("\nplease input the key:\n"); scanf("%d",&k);if(k==0)printf("error");else{printf("\nplease input the outf:\n"); scanf("%s",outf);einf_doutf_f(inf,k,outf,flag);printf("\ndinf is over!\n"); }}else{printf("error!\n"); break;}}printf("\ngame over:\n"); }实验结果:1.原文件:2.加法加密(key=5)3.加法解密4.乘法加密(key=5)5.乘法解密。
计算机安全基础凯撒加密解密上机实验报告学院年级专业班学生姓名学生学号实验一凯撒加密解密凯撒密码简介:恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左或向右移动一个固定数目的位置。
例如,当偏移量是左移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 位的分组大小。