java凯撒密码实现----完美版
凯撒密码实验报告册(3篇)

第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个可能的值(即字母表中的字母数量)。
凯撒加密实验报告(3篇)

第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. 加密效果通过实验验证,凯撒加密法能够有效地将明文转换为密文,且解密过程也能够将密文恢复为明文。
java课程设计加密与解密实验报告

java课程设计加密与解密实验报告尊敬的老师:我将向您汇报我的Java课程设计——加密与解密实验报告。
本次实验旨在通过Java程序设计实现一些传统加密算法的加密与解密功能,并进行简单的性能分析。
以下是我的实验报告:一、实验目的通过Java程序设计实现传统加密算法的加密与解密功能,了解加密算法的基础原理,并进行简单的性能分析。
二、实验内容本次实验的主要内容包括:1. 实现Caesar加密算法、Playfair加密算法和Vigenere加密算法的加密与解密功能。
2. 编写能够对文字文件进行加密与解密的Java程序。
3. 对比不同算法的加密与解密性能,进行简单的性能分析。
三、实验步骤1. Caesar加密算法Caesar加密算法是一种简单的字母替换加密方式,通过移动字母表中的字母来生成密文。
例如,如果移动三个字母,则"A"变成"D","B"变成"E",以此类推。
加密和解密使用相同的密钥,在本实验中为整数。
实现步骤如下:① 定义CaesarCipher类,此类中包含了加密与解密方法。
② 加密方法接收一个字符串和密钥,通过对字符串中的每个字母进行移动,生成密文。
③ 解密方法接收一个密文和密钥,通过对密文中的每个字母进行相反的移动,还原出明文。
2. Playfair加密算法Playfair加密算法是一种算法复杂度较高的加密方式,利用了一个5x5的矩阵来进行加密。
实现步骤如下:① 定义PlayfairCipher类,此类中包含了加密与解密方法。
② 加密方法接收一个字符串和密钥,将明文分组并替换成加密后的密文。
③ 解密方法接收一个密文和密钥,将密文分组并替换成还原出的明文。
3. Vigenere加密算法Vigenere加密算法是一种基于凯撒密码的加密算法,使用一个关键词来对明文进行加密。
实现步骤如下:① 定义VigenereCipher类,此类中包含了加密与解密方法。
凯撒加密算法精品文档5页

凯撒加密算法替代加密算法是将明文中的每一个字符用另一个字符替换为密文中的一个字符。
除接受者外,其他人不理解其间的替代。
接受者对密文作反向替换后恢复成明文。
著名的凯撒加密算法就是一种简单的替代加密法,它是将明文中每一个字符用右移3位并以26个字符为模的替代(A由D替代,B由E替代,··…—,W由Z替代,X由A替代,Y由B替代,Z由C替代)。
维吉尼亚密码人们在单一恺撒密码的基础上扩展出多表密码,称为“维吉尼亚”密码。
它是由16世纪法国亨利三世王朝的布莱瑟·维吉尼亚发明的。
维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。
维吉尼亚密码的密钥空间大小为26m,所以即使m的值很小,使用穷尽密钥搜索方法也需要很长的时间。
例如,当m=5时,密钥空间大小超过1.1*107,这样的密钥量已经超出了使用手算进行穷尽搜索的能力范围。
将26个恺撒密表合成一个,见下表:A B C D E F G H I J K L M N O P Q R S T U V W X Y ZA -ABCDEFGHIJKLMNOPQRSTUVWXY ZB -BCDEFGHIJKLMNOPQRSTUVWXYZ AC-C D E F G H I J K L M N O P Q R S T U V W X Y Z A BD- D E F G H I J K L M N O P Q R S T U V W X Y Z A B CE -EFGHIJKLMNOPQRSTUVWXYZ A B C DF -FGHIJKLMNOPQRSTUVWXYZ A B C D EG- G H I J K L M N O P Q R S T U V W X Y Z A B C D E FH -H I J K L M N O P Q R S T U V W X Y Z A B C D E F GI- I J K L M N O P Q R S T U V W X Y Z A B C D E F G HJ -J K L M N O P Q R S T U V W X Y Z A B C D E F G H IK -K L M N O P Q R S T U V W X Y Z A B C D E F G H I JL -L M N O P Q R S T U V W X Y Z A B C D E F G H I J KM -M N O P Q R S T U V W X Y Z A B C D E F G H I J K LN -N O P Q R S T U V W X Y Z A B C D E F G H I J K L MO -O P Q R S T U V W X Y Z A B C D E F G H I J K L M NP -P Q R S T U V W X Y Z A B C D E F G H I J K L M N OQ -Q R S T U V W X Y Z A B C D E F G H I J K L M N O PR -R S T U V W X Y Z A B C D E F G H I J K L M N O P QS -S T U V W X Y Z A B C D E F G H I J K L M N O P Q RT -T U V W X Y Z A B C D E F G H I J K L M N O P Q R SU -U V W X Y Z A B C D E F G H I J K L M N O P Q R S TV -V W X Y Z A B C D E F G H I J K L M N O P Q R S T UW -W X Y Z A B C D E F G H I J K L M N O P Q R S T U VX -X Y Z A B C D E F G H I J K L M N O P Q R S T U V WY -Y Z A B C D E F G H I J K L M N O P Q R S T U V W XZ -Z A B C D E F G H I J K L M N O P Q R S T U V W X Y加密方法维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。
凯撒密码 程序

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
else n=n%10; if(n%5==0) n=n+2; else n=n; while(ch>='A'&&ch<='Z') {
凯撒密码--java实现

凯撒密码--java实现关于凯撒密码的介绍我就不多说了,感兴趣的可以看,我主要说的是java如何实现。
我发现⽹上有写java加密解密的,写的时候发现只需要⼀个转换函数就可以了,可以作为加密⽤,也可以⽤作解密⽤。
我们要解密的字符串是R uxen hxd.*** 凯撒密码*/public class CaesarCipher {public static void main(String[] args) {//需要转换的字符串String str = "R uxen hxd.";for (int i=0;i<26;i++){System.out.println(i+" "+caesarSwitch(str,i));}}/*** 凯撒转换* @param str 需要转换的字符串* @param step 偏移量* @return 转换后的字符串*/public static String caesarSwitch(String str, int step){//字符串转数组char[] chars = str.toCharArray();//计算右移的步数step = step%26;if(step<0){step = step + 26;}//开始变换for (int i=0;i<chars.length;i++){char c = chars[i];//⼩写if (c>='a'&&c<='z'){c = (char) (c + step);if (c>'z')c -= 26;}//⼤写if (c>='A'&&c<='Z'){c = (char) (c + step);if (c>'Z')c -= 26;}//把转换后的字符再给原来数组chars[i] = c;}return String.copyValueOf(chars);}}结果:0 M pszi csy.1 N qtaj dtz.2 O rubk eua.3 P svcl fvb.4 Q twdm gwc.5 R uxen hxd.6 S vyfo iye.7 T wzgp jzf.8 U xahq kag.9 V ybir lbh.10 W zcjs mci.11 X adkt ndj.12 Y belu oek.13 Z cfmv pfl.14 A dgnw qgm.15 B ehox rhn.16 C fipy sio.17 D gjqz tjp.18 E hkra ukq.19 F ilsb vlr.20 G jmtc wms.21 H knud xnt.22 I love you.23 J mpwf zpv.24 K nqxg aqw.25 L oryh brx.经过穷举我们发现I love you.是有意义的字符串,原字符串R uxen hxd.是经过右移4步或左移动22步得到我们的加密字符串。
凯撒加密算法

JAVA实现凯撒密码192121 陈君山一.凯撒密码流程图、二.源代码import java.util.*;public class Main {public static void main(String[] args) { Scanner cin =new Scanner(System.in); String a;char b[];int s;char d;System.out.println("请输入明文:");a=cin.nextLine();for(int i=0;i<a.length();i++){b=a.toCharArray();s=(((int)b[i]-96)+3)%26;d=(char)(s+96);System.out.print(d);}}}Java实现RC4算法import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;//程序窗口主类;=================================================================== ========public class RC4Frame extends JFrame{//窗口的主容器板;JPanel cp = (JPanel) getContentPane();//按钮和单选器件所在的容器板;JPanel opPanel=new JPanel();//除Label以外的控件所在的容器板;JPanel infoPanel=new JPanel();//Label所在的容器板;JPanel tPanel0=new JPanel();//对应四个文本域的滚动容器板;JScrollPane jsp0=new JScrollPane();JScrollPane jsp1=new JScrollPane();JScrollPane jsp2=new JScrollPane();JScrollPane jsp3=new JScrollPane();//四个文本域,//分别为:明文输入框,密钥输入框,子密钥流显示框,密文显示框;JTextArea jta0=new JTextArea(20,11);JTextArea jta1=new JTextArea(20,11);JTextArea jta2=new JTextArea(20,11);JTextArea jta3=new JTextArea(20,11);//加密/解密模式选择的单选组件;JRadioButton jb1=new JRadioButton("明文加密");JRadioButton jb2=new JRadioButton("密文解密");//功能按钮;JButton b1=new JButton("加/ 解密");JButton b2=new JButton("打开明文");JButton b3=new JButton("打开密文");JButton b4=new JButton("保存密文");JButton b5=new JButton("退出");JButton b6=new JButton("清空");ButtonGroup bg=new ButtonGroup();//RC4加解密类的对象;RC4Crypt rc4;//保存密文结果的byte数组;byte[] result;//保存/打开对话框;JFileChooser jfc = new JFileChooser();//RC4的构造方法,包括初始化版面与类变量;************************************ public RC4Frame(){setSize(640,450);setVisible(true);setResizable(false);setTitle("RC4流密码加\\解密程序V1.0:");setDefaultCloseOperation(EXIT_ON_CLOSE);//将文本域填入滚动容器板;jsp0.getViewport().add(jta0);jsp1.getViewport().add(jta1);jsp2.getViewport().add(jta2);jsp3.getViewport().add(jta3);//将子密钥框和秘文框设置为不可编辑;jta2.setEditable(false);jta3.setEditable(false);//为文本域添加自动换行功能;jta0.setLineWrap(true);jta1.setLineWrap(true);jta2.setLineWrap(true);jta3.setLineWrap(true);//初始化Lablel的版面;tPanel0.setLayout(new GridLayout(1,5));tPanel0.add(new JLabel("明文输入框: "));tPanel0.add(new JLabel("密码输入框: "));tPanel0.add(new JLabel("子密码流显示: "));tPanel0.add(new JLabel("密文码显示: "));tPanel0.add(new JLabel(" "));tPanel0.setSize(600,20);//初始化程序的功能组件版面;infoPanel.setLayout(new GridLayout(1,5));infoPanel.add(jsp0);infoPanel.add(jsp1);infoPanel.add(jsp2);infoPanel.add(jsp3);infoPanel.add(opPanel);//初始化程序母板面;cp.setLayout(new FlowLayout());cp.add(tPanel0);cp.add(infoPanel);//初始化程序控制组件版面;opPanel.setLayout(new GridLayout(8,1));opPanel.add(jb1);opPanel.add(jb2);opPanel.add(b1);opPanel.add(b2);opPanel.add(b3);opPanel.add(b4);opPanel.add(b5);opPanel.add(b6);bg.add(jb1);bg.add(jb2);jb1.setSelected(true);//为控制按钮添加监听器;b1.addActionListener(new B1_actionAdapter(this));b2.addActionListener(new B2_actionAdapter(this));b3.addActionListener(new B3_actionAdapter(this));b4.addActionListener(new B4_actionAdapter(this));b5.addActionListener(new B5_actionAdapter(this));b6.addActionListener(new B6_actionAdapter(this));//初始化RC4对象;rc4=new RC4Crypt();}//加/解密按钮的监听器方法;************************************************* protected void b1_actionPerformed (ActionEvent e){//判断是否可进行操作的标志变量;boolean flag=true;//输入密钥后才能进行加/解密;if(!jta1.getText().equals("")){//第一个单选钮被选中后进行加密;if(jb1.isSelected()==true){//调用RC4Crypy的第二个构造方法,进行加密系列操作;//参数为明文字符串和密钥;rc4=new RC4Crypt(jta0.getText(),jta1.getText());jta2.setText("");//将加密过程中产生的子密钥流列出;for(int i=0;i<rc4.length;i++){jta2.append("字节"+(i+1)+": "+rc4.subKey[i]+"\n");}//更新现阶段秘文;result=rc4.result;jta3.setText("");//将密文的字节内容列出;for(int i=0;i<rc4.length;i++){jta3.append("字节"+(i+1)+": "+rc4.result[i]+"\n");}}//第二个单选钮被选中后进行解密;else{try{//调用RC4Crypy的第三个构造方法,进行解密系列操作;rc4=new RC4Crypt(result,jta1.getText());jta0.setText("");//将加密过程中产生的子密钥流列出;for(int i=0;i<rc4.length;i++){jta2.append("字节"+(i+1)+": "+rc4.subKey[i]+"\n");}//将解密得到的明文列出;jta0.setText(rc4.recoverToString());}catch(Exception ex){System.out.println(ex.getMessage());}}}else{//无密钥提示;jta3.setText("请输入密钥!");}}//打开明文文本按钮的监听器方法;******************************************** protected void b2_actionPerformed (ActionEvent e){//将打开的明文文本内容列出;jta0.setText(openTextFile());}//打开保存过的密文数据文件按钮监听器方法;********************************** protected void b3_actionPerformed (ActionEvent e){//打开秘文文件的方法;openResultFile();}//保存密文结果文件按钮监听器方法;****************************************** protected void b4_actionPerformed (ActionEvent e){//保存密文结果文件的方法;saveResultFile();}//退出按钮监听器方法;******************************************************protected void b5_actionPerformed (ActionEvent e){System.exit(0);}//清空按钮监听器方法;****************************************************** protected void b6_actionPerformed (ActionEvent e){jta0.setText("");jta1.setText("");jta2.setText("");jta3.setText("");result=null;rc4=null;}//从.txt文件中读取文本内容的方法;****************************************** private String openTextFile() {String message = "";//显示文件打开对话框;if (JFileChooser.APPROVE_OPTION == jfc.showOpenDialog(this)) {try {//确定要读取文件的文件名;String filename1 = jfc.getSelectedFile().getPath();//建立以此文件名为目标的文件对象;File file = new File(filename1);//确定文件大小,单位字节;int size = (int) file.length();//建立存储从文件读出内容的字符数组;char[] data = new char[size];//建立文件读取对象;FileReader in = new FileReader(file);int readChar = 0;//按字符逐个从文件读取字符,存入data;while (in.ready()) {readChar = readChar +in.read(data, readChar, size - readChar);}//关闭文件读取对象;in.close();//将字符数组改为字符串;message = new String(data, 0, readChar);} catch (Exception e) {message = e.getMessage();}}return message;}//从密文结果文件中读取数据内容的方法;************************************** private String openResultFile() {String message = "";//显示文件打开对话框;if (JFileChooser.APPROVE_OPTION == jfc.showOpenDialog(this)) {try {//确定要读取文件的文件名;String filename1 = jfc.getSelectedFile().getPath();//建立以此文件名为目标的文件对象;File file = new File(filename1);//确定文件大小,单位字节;int size = (int) file.length();//显示本文件的字节数;jta3.setText("共有"+size+"字节\n");byte temp=(byte)0;//重新建立一个容量等于文件大小的byte数组,并以此来更新result;result = new byte[size];//建立标准数据类型的文件读取流对象;DataInputStream in=new DataInputStream(new FileInputStream(file));//逐个字节读取文件中的数据并存在result;for (int i=0;i<size;i++){temp= in.readByte();jta3.append("字节"+(i+1)+": "+temp+"\n");result[i]=temp;}//关闭读取流;in.close();} catch (Exception e) {message = e.getMessage();}}return message;}//将密文结果存入结果文件的方法;******************************************** private String saveResultFile(){String message = "";//保存条件:result已被初始化;if ((result instanceof byte[])&&//显示文件保存对话框;(JFileChooser.APPROVE_OPTION == jfc.showSaveDialog(this))) {try {//确定要读取文件的文件名;String filename1 = jfc.getSelectedFile().getPath();//建立以此文件名为目标的文件对象;File file = new File(filename1);//建立标准数据类型的文件输出流对象;DataOutputStream out=new DataOutputStream(new FileOutputStream(file));//逐个字节将resunlt内容写入文件;for (int i=0;i<result.length;i++){out.writeByte(result[i]);}//关闭文件输出流对象;out.close();} catch (Exception e) {message = e.getMessage();}}return message;}//程序测试方法;************************************************************ public static void main(String[] args){RC4Frame mainframe=new RC4Frame();System.out.println("Hello World!");}}//RC4加/解密数据处理类;=================================================================== class RC4Crypt{//S盒的byte数组;private byte[] box;//明文的字符串;public String plaintext;//明文byte数组;public byte[] bytePlaintext;//密文结果的byte数组;public byte[] result;//输入密钥的字符串;public String mainKey;//子密钥的byte数组;public byte[] subKey;//本加/解密明/密的字节长度;public int length;//无参数构造方法;********************************************************** public RC4Crypt(){//顺序初始化S盒;makeBox();}//用于实现明文加密的构造方法;********************************************** public RC4Crypt(String a,String b){//明文,密钥字符串参数传递;plaintext=a;mainKey=b;//顺序初始化S盒;makeBox();//用明文字符串初始化明文byte数组;getBytePlaintext();try{//初始化本对象内容长度;length=bytePlaintext.length;//初始化子密钥byte数组;getSubKey();//进行加密计算;encrypt();}catch(Exception ex){System.out.println(ex.getMessage());}}//实现密文解密的构造方法;************************************************** public RC4Crypt(byte[] a,String b){//密文byte数组,密钥字符串参数传递;result=a;mainKey=b;//顺序初始化S盒;makeBox();try{//初始化本对象内容长度;length=result.length;//初始化子密钥byte数组;getSubKey();//进行解密运算;decrypt();}catch(Exception ex){System.out.println(ex.getMessage());}}//初始化S盒内数据的方法;*************************************************** private void makeBox(){box=new byte[256];//用00000000B到11111111B的内容依次初始化S盒;//注意byte类型数据表示0-255无符号数字的顺序;//00000000B(0)-01111111B(127)-10000000B(-128)-11111111B(-1)for(int i=0;i<256;i++){if(i<127){box[i]=(byte)i;}else{box[i]=(byte)(i-256);}}}//把明文改变为相应的byte数组的方法;**************************************** private void getBytePlaintext(){bytePlaintext=plaintext.getBytes();}//把byte数组恢复成字符串的方法;******************************************** public String recoverToString(){return new String(bytePlaintext);}//获得自密钥的方法;******************************************************** private void getSubKey()throws Exception{//声明所需要的局部变量int j=0,hold=0;byte temp=0;byte []key =mainKey.getBytes();//通过j值的变化和密钥内容,逐步混淆S盒;for (int i=0; i<256; i++){//j的混淆变化;j=(j+(box[i]>0?box[i]:(box[i]+256))+(key[i%key.length]>0?key[i%key.length]:(key[i%key.length]+256)))%256;//空杯法换位;temp=box[i];box[i]=box[j];box[j]=temp;}int i=j=0;//声明一个容量等于本对象内容长度的byte数组来跟新子密钥数组;subKey=new byte[length];for(int k=0;k<length;k++){//遍历i;i=++i%256;//j第二次混淆变化;j=(j+(box[i]>0?box[i]:(box[i]+256)))%256;//空杯发换位;temp=box[i];box[i]=box[j];box[j]=temp;//子密钥byte数组各元素混淆赋值;subKey[k]=box[((box[i]>0?box[i]:(box[i]+256))+(box[j]>0?box[j]:(box[j]+256)))%256];}}//加密计算方法;************************************************************ private void encrypt()throws Exception{result=new byte[length];//明文byte数组与子密钥byte数组异或,得到密文byte数组;for(int i=0;i<length;i++){result[i]=(byte)(bytePlaintext[i]^subKey[i]);}}//解密计算方法;************************************************************ private void decrypt()throws Exception{bytePlaintext=new byte[length];//密文byte数组于子密钥byte数组异或,得到明文byte数组;for(int i=0;i<length;i++){bytePlaintext[i]=(byte)(result[i]^subKey[i]);}}}//各按钮的监听器的实例模板类;============================================================class B1_actionAdapter implements ActionListener {private RC4Frame adaptee;B1_actionAdapter(RC4Frame adaptee) {this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) {adaptee.b1_actionPerformed(e);}}class B2_actionAdapter implements ActionListener { private RC4Frame adaptee;B2_actionAdapter(RC4Frame adaptee) {this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) { adaptee.b2_actionPerformed(e);}}class B3_actionAdapter implements ActionListener { private RC4Frame adaptee;B3_actionAdapter(RC4Frame adaptee) {this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) { adaptee.b3_actionPerformed(e);}}class B4_actionAdapter implements ActionListener { private RC4Frame adaptee;B4_actionAdapter(RC4Frame adaptee) {this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) { adaptee.b4_actionPerformed(e);}}class B5_actionAdapter implements ActionListener { private RC4Frame adaptee;B5_actionAdapter(RC4Frame adaptee) {this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) { adaptee.b5_actionPerformed(e);}}class B6_actionAdapter implements ActionListener { private RC4Frame adaptee;B6_actionAdapter(RC4Frame adaptee) {this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) { adaptee.b6_actionPerformed(e);}}。
JAVA第一次实验——凯撒密码的实现

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、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
代码:
package ning.hao;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Cryptology {
char ciphertext[];//密文
int key;
char plaintext[];//明文
StringBuffer plaintextStr;
StringBuffer ciphertextStr;
final int max=500;
Cryptology(){
key=0;
plaintextStr=new StringBuffer("");
ciphertextStr=new StringBuffer("");
}
int setKey(){
System.out.println("请输入一个Caesar密钥");
Scanner sc=new Scanner(System.in);
try{
key=sc.nextInt()%26;
}
catch(Exception e){
System.out.println("需要输入整数!");
}
return key;
}
void getPlaintext(){//获得明文
plaintext=new char[max];
for(int j=0;j<max;j++){
plaintext[j]='@';
}
int i=0;
char ch=' ';
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入明文");
try {
ch=(char) bf.read();//获得字符
while(ch!='\r'&&ch!='\n'){
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch==' '||ch==','||ch=='.'||ch=='!'){
plaintext[i]=ch;
i++;
}
else{
System.out.println("输入不支持!!");
break;
}
try{
ch=(char) bf.read();
}
catch(IOException e1){
}
}
}
catch(IOException e){}
}
void encryption(){//加密
int temp=0;
ciphertext=new char[max];
for(int j=0;j<max;j++){
ciphertext[j]='@';
}
for(int i=0;i<plaintext.length;i++){
if(plaintext[i]!='@'){
temp=plaintext[i]+key;
if(plaintext[i]==' '||plaintext[i]==','||plaintext[i]=='.'||plaintext[i]=='!'){
ciphertext[i]=(char) (plaintext[i]);
}
if(plaintext[i]>='a'&&plaintext[i]<='z'){
if(temp>122)
ciphertext[i]=(char) (97+temp-123);
else{
ciphertext[i]=(char)temp;
}
}
if(plaintext[i]>='A'&&plaintext[i]<='Z'){
if((plaintext[i]+key)>90)
ciphertext[i]=(char)(65+temp-91);
else{
ciphertext[i]=(char)temp;
}
}
ciphertextStr.append(ciphertext[i]);
}
else{
break;
}
}
}
void deciphering(){//解密
char c=' ';
int temp=0;
for(int i=0;i<ciphertext.length;i++){
temp=ciphertext[i]-key;
if(ciphertext[i]!='@'){
if(plaintext[i]==' '||plaintext[i]==','||plaintext[i]=='.'||plaintext[i]=='!'){ c=(char)(ciphertext[i]);
}
if(ciphertext[i]>=97&&ciphertext[i]<=122){
c=(char)(temp);
if(temp<97){
c=(char)(26+temp);
}
}
if(ciphertext[i]>=65&&ciphertext[i]<=90){
c=(char)(temp);
if(temp<65){
c=(char)(26+temp);
}
}
plaintextStr.append(c);
}
else{
break;
}
}
}
void display(){
System.out.println("密文明文对比");
System.out.println("密文:"+ciphertextStr);
System.out.println("明文:"+plaintextStr);
}
}
主函数部分:
package ning.hao;
public class Complication {
public static void main(String args[]){ Cryptology cry=new Cryptology();
cry.setKey();
cry.getPlaintext();
cry.encryption();
cry.deciphering();
cry.display();
}
}
结果1:
结果2:。