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. 设置一个密钥,即字母表中的一个字母,如密钥为n。
2. 将明文中的每个字母按照字母表循环移动n位,即替换为字母表中距离该字母n个位置后的字母。
如果超出字母表范围,则回到字母表的开头继续计数。
3. 重复步骤2,直到加密完成。
解密原理:1. 设置密钥为n,与加密时使用的密钥保持一致。
2. 将密文中的每个字母按照字母表循环移动-n位,即替换为字母表中距离该字母-n个位置后的字母。
如果超出字母表范围,则回到字母表的末尾继续计数。
3. 重复步骤2,直到解密完成。
举例说明:假设明文为"HELLO WORLD",密钥为3,字母表为26个大写字母。
加密过程:H -> K (H向后移动3位),E -> H (E向后移动3位),L -> O (L向后移动3位),L -> O (L向后移动3位),O -> R (O向后移动3位),空格不做处理,W -> Z (W向后移动3位),O -> R (O向后移动3位),R -> U (R向后移动3位),L -> O (L向后移动3位),D -> G (D向后移动3位)。
加密结果为:"KHOOR ZRUOG"解密过程:K -> H (K向前移动3位),H -> E (H向前移动3位),O -> L (O向前移动3位),O -> L (O向前移动3位),R -> O (R向前移动3位),空格不做处理,Z -> W (Z向前移动3位),R -> O (R向前移动3位),U -> R (U向前移动3位),O -> L (O向前移动3位),G -> D (G向前移动3位)。
解密结果为:"HELLO WORLD"。
python凯撒密码编写程序
python凯撒密码编写程序
以下是Python实现的凯撒密码加密程序:
```python
def caesar_encrypt(text, shift):
result = ""
for i in range(len(text)):
char = text[i]
if char.isalpha():
# 判断字符是否为字母,如果是字母则进行加密
ascii_offset = ord('a') if char.islower() else ord('A')
# 将字母转为ASCII码,然后加上偏移量,再转回字母
result += chr((ord(char) - ascii_offset + shift) % 26 + ascii_offset)
else:
# 如果字符不是字母,则直接添加到结果中
result += char
return result
```
这个函数接受两个参数:要加密的文本和偏移量。
它遍历文本中的每个字符,如果字符是字母,则将其加密,否则直接添加到结果中。
加密时,将字母转为ASCII码,然后加上偏移量,再转回字母。
注意,
这里使用了取模运算,以确保加密后的字母仍然在字母表中。
凯撒密文的破解编程实现
case'L':num[11]=num[11]+1;break;
case'M':num[12]=num[12]+1;break;
case'N':num[13]=num[13]+1;break;
printf("------------------BY安美洪design--------------------\n");
printf("======================================================\n");
if(argc!=3)
{
printf("此为KAISER解密用法:[文件名][密文路径][明文路径]\n");
}
[此贴被赛冰河在2004-10-1516:54重新编辑](c)Copyleft2003-2007,EvilOctalSecurityTeam.
ThisfileisdecompiledbyanunregisteredversionofChmDecompiler.
Regsiteredversiondoesnotshowthismessage.
case'C':num[2]=num[2]+1;break;
case'D':num[3]=num[3]+1;break;
case'E':num[4]=num[4]+1;break;
java凯撒密码实现----完美版
代码: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:。
Caesar加密解密java实现
Caesar加密解密java实现信息112 孟亚男·加密过程import java.util.Scanner;class TestCaesar {public static void main(String args[]) {System.out.print("请输入密钥key:" + " ");Scanner scan1 = new Scanner(System.in);// 用Scanner用于扫描输入的文本(孟)int key = scan1.nextInt();System.out.print("请输入明文:" + " ");Scanner scan2 = new Scanner(System.in);String data = scan2.nextLine();String es = "";// 定义字符串变量,方便输出for (int i = 0; i < data.length(); i++) {char c = data.charAt(i);if (c >= 'a' && c <= 'z') {c += key % 26;if (c < 'a')c += 26;if (c > 'z')c -= 26;} else if (c >= 'A' && c <= 'Z') {c += key % 26;if (c < 'A')c += 26;if (c > 'Z')c -= 26;}es += c;}System.out.println("产生的密文是:" + es);}}·运行举例请输入密钥key: 5请输入密钥key: ABCDEFGHI产生的密文是:FGHIJKLMN·解密过程class TestCaesar{public static void main(String args []){System.out.print("请输入密文:" + " ");Scanner scan2 = new Scanner(System.in);String data = scan2.nextLine();for(int key=0;key <= 25;key++){ //循环产生所有可能的密文String es="";//定义字符串变量,方便输出for (int i = 0; i < data.length(); i++){char c = data.charAt(i);if (c >= 'a' && c <= 'z'){c -= key % 26;if (c < 'a') c += 26;if (c > 'z') c -= 26;}else if (c >= 'A' && c <= 'Z'){c -= key % 26;if (c < 'A') c += 26;if (c > 'Z') c -= 26;}es += c;}System.out.println("KEY:"+key+"产生的密文是:"+es);}}}运行得到所有可能的明文:(得到明文最有可能的就是密钥为15的)请输入密文: YJAXJH RPTHPG XH DCT DU IWT VGTPITHI GJATG DU IWT GDBPC TBEXGT KEY:0明文是:YJAXJH RPTHPG XH DCT DU IWT VGTPITHI GJATG DU IWT GDBPC TBEXGT KEY:1明文是:XIZWIG QOSGOF WG CBS CT HVS UFSOHSGH FIZSF CT HVS FCAOB SADWFS KEY:2明文是:WHYVHF PNRFNE VF BAR BS GUR TERNGRFG EHYRE BS GUR EBZNA RZCVER KEY:3明文是:VGXUGE OMQEMD UE AZQ AR FTQ SDQMFQEF DGXQD AR FTQ DAYMZ QYBUDQ KEY:4明文是:UFWTFD NLPDLC TD ZYP ZQ ESP RCPLEPDE CFWPC ZQ ESP CZXLY PXATCP KEY:5明文是:TEVSEC MKOCKB SC YXO YP DRO QBOKDOCD BEVOB YP DRO BYWKX OWZSBO KEY:6明文是:SDURDB LJNBJA RB XWN XO CQN PANJCNBC ADUNA XO CQN AXVJW NVYRAN KEY:7明文是:RCTQCA KIMAIZ QA WVM WN BPM OZMIBMAB ZCTMZ WN BPM ZWUIV MUXQZM KEY:8明文是:QBSPBZ JHLZHY PZ VUL VM AOL NYLHALZA YBSLY VM AOL YVTHU LTWPYL KEY:9明文是:PAROAY IGKYGX OY UTK UL ZNK MXKGZKYZ XARKX UL ZNK XUSGT KSVOXK KEY:10明文是:OZQNZX HFJXFW NX TSJ TK YMJ LWJFYJXY WZQJW TK YMJ WTRFS JRUNWJ KEY:11明文是:NYPMYW GEIWEV MW SRI SJ XLI KVIEXIWX VYPIV SJ XLI VSQER IQTMVI KEY:12明文是:MXOLXV FDHVDU LV RQH RI WKH JUHDWHVW UXOHU RI WKH URPDQ HPSLUH KEY:13明文是:LWNKWU ECGUCT KU QPG QH VJG ITGCVGUV TWNGT QH VJG TQOCP GORKTG KEY:14明文是:KVMJVT DBFTBS JT POF PG UIF HSFBUFTU SVMFS PG UIF SPNBO FNQJSF KEY:15明文是:JULIUS CAESAR IS ONE OF THE GREATEST RULER OF THE ROMAN EMPIRE KEY:16明文是:ITKHTR BZDRZQ HR NMD NE SGD FQDZSDRS QTKDQ NE SGD QNLZM DLOHQD KEY:17明文是:HSJGSQ AYCQYP GQ MLC MD RFC EPCYRCQR PSJCP MD RFC PMKYL CKNGPC KEY:18明文是:GRIFRP ZXBPXO FP LKB LC QEB DOBXQBPQ ORIBO LC QEB OLJXK BJMFOB KEY:19明文是:FQHEQO YWAOWN EO KJA KB PDA CNAWPAOP NQHAN KB PDA NKIWJ AILENA KEY:20明文是:EPGDPN XVZNVM DN JIZ JA OCZ BMZVOZNO MPGZM JA OCZ MJHVI ZHKDMZ KEY:21明文是:DOFCOM WUYMUL CM IHY IZ NBY ALYUNYMN LOFYL IZ NBY LIGUH YGJCLY KEY:22明文是:CNEBNL VTXLTK BL HGX HY MAX ZKXTMXLM KNEXK HY MAX KHFTG XFIBKX KEY:23明文是:BMDAMK USWKSJ AK GFW GX LZW YJWSLWKL JMDWJ GX LZW JGESF WEHAJW KEY:24明文是:ALCZLJ TRVJRI ZJ FEV FW KYV XIVRKVJK ILCVI FW KYV IFDRE VDGZIV KEY:25明文是:ZKBYKI SQUIQH YI EDU EV JXU WHUQJUIJ HKBUH EV JXU HECQD UCFYHU。
卡萨密码——精选推荐
以下程序已在win-tc和tc2.0下运行通过,已加详细注释(本人所写)。
/* 数据安全实用程序,加密解密简单程序 */#include<stdio.h>#include<stdlib.h>#include<conio.h>int flag;char encrypt(char ch,int key)/*加密函数,把字符循环移位*/{if(ch>='a' && ch<='z') /* 如果是小写字母 */{ch=(ch-'a'+key%26)%26+'a'; /* 字母向后移key%26个位置,超过字母z则再从a开始向后移动 */}else if(ch>='A' && ch<='Z') /* 如果是大写字母 */{ch=(ch-'A'+key%26)%26+'A'; /* 字母向后移key%26个位置,超过字母Z则再从A开始向后移动 */}return ch;}char decrypt(char ch,int key)/*解密函数,把字符循环移位*/{if(ch>='a' && ch<='z') /* 如果是小写字母 */{ch=(ch-'a'+26-key%26)%26+'a'; /* 字母向后移26-key%26个位置,超过字母z则再从a开始向后移动 */}else if(ch>='A' && ch<='Z') /* 如果是大写字母 */{ch=(ch-'A'+26-key%26)%26+'A'; /* 字母向后移26-key%26个位置,超过字母Z则再从A开始向后移动 */}return ch;}void menu()/*菜单,1.加密,2.解密,3.显示文本文件内容*/{clrscr();printf("\n======================================================="); printf("\n1.Encrypt the text file"); /* 加密文件 */printf("\n2.Decrypt the text file"); /* 解密文件 */printf("\n3.Display text file contents");/* 显示加密或解密或未加密或解密的文件 */printf("\n4.Quit\n");printf("=========================================================\n") ;printf("Please select a item:"); /* 选择一个菜单 */}void logo()/*显示程序信息*/{printf("\nwelcome to encrypt program \n ");return;}void encrypt_decrypt_File(char* infile,int key, char* outfile) /* 加密或解密函数 */{FILE *in,*out;char ch;clrscr(); /* 清屏 */if((in=fopen(infile,"r"))==NULL) /* 打开欲加密或解密的文件*/{printf("Can not open the infile!\n"); /* 如果打开文件失败或文件不存在打印打开失败信息 */printf("Press any key to exit!\n");getch(); /* 并等待任一按键然后退出程序 */exit(0);}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);}ch=fgetc(in); /*从文本文件中读入字符*/while(ch!=EOF)/*加密或解密*/{/*如果是英文字符,则进行加密或解密,否则,不进行加密或解密处理*/if((ch>='a' && ch<='z' ) || (ch>='A' && ch<='Z')){ if(flag==1)fputc(encrypt(ch,key),out);if(flag==2)fputc(decrypt(ch,key),out);}elsefputc(ch,out);ch=fgetc(in);}/*关闭输入及输出文件*/fclose(in);fclose(out);}void displayFile(char *infile) /*将文本文件的内容显示在屏幕上*/{FILE *fp;char string[81];if((fp=fopen(infile,"r"))==NULL) /* 以只读方式打开文本文件 */{printf("cann't open file");exit(0); /* 如果文件不存在或打开失败打印无法打开信息并退出程序 */}while(fgets(string,81,fp)!=NULL)fputs(string,stdout); /*把所取字符串送到屏幕显示*/fclose(fp); /* 关闭文件 */}int main(){int i,n;char ch0,ch1;char infile[40],outfile[40];textbackground(LIGHTGRAY); /*设置背景颜色为浅灰色*/textcolor(BLACK); /*设置文字颜色为黑色*/clrscr();/*清除屏幕显示*/logo(); /*显示程序信息*/sleep(2); /* 延时2秒 */menu(); /*显示屏幕菜单*/ch0=getche();/*等待用户从键盘输入,并把输入显示在屏幕上*/while(ch0!='4'){clrscr();if(ch0=='1') /*选择加密功能*/{flag=1;printf("\nPlease input the infile to be encrypted:"); /* 输入要加密的文件名 */scanf("%s",infile); /* 该文件要和本程序放在同一个目录下*/printf("Please input the encrypt key:");scanf("%d",&n);/*输入加密密码*/printf("Please input the outfile:"); /*输入存放加密内容的文件名*/scanf("%s",outfile); /* 该文件可以自动创建 */encrypt_decrypt_File(infile,n,outfile);printf("\nEncrypt is over!\n");/* 加密成功 */sleep(1); /* 延时1秒 */}else if(ch0=='2') /*选择解密功能*/{flag=2;printf("\nPlease input the infile to be decrypted:"); /* 输入要解密的文件名 */scanf("%s",infile); /* 该文件要和本程序放在同一个目录下 */printf("Please input the decrypt key:");scanf("%d",&n);/*输入解密密码,加密和解密密码应相同*/printf("Please input the outfile:"); /*输入存放解密内容的文件名*/scanf("%s",outfile); /* 该文件可以自动创建 */encrypt_decrypt_File(infile,n,outfile);printf("\nDecrypt is over!\n");sleep(1); /* 延时1秒 */}else if(ch0=='3') /*选择显示文本文件功能*/{printf("\nPlease input the infile to be displayed:"); /* 输入要显示的文件名 */scanf("%s",infile);displayFile(infile);/* 显示文件 */getch();}else{ /*不合法输入*/printf("\nplease input a valid number(1-4)\n"); sleep(1); /* 延时1秒 */}menu();/*显示程序菜单*/ch0=getche(); /*等待用户下一次的功能选择*/}system("cls");/*清除屏幕*/logo(); /*显示程序信息*/printf("\nGood Bye!\n");sleep(2);/* 延时2秒 */system("pause"); /* 暂停,按任一键退出程序 */return 0;}。
凯撒密码密码算法与编程
第2讲 密码算法与编程
▪ 2.1 消息和加密 ▪ 2.2 古典密码算法 ▪ 2.3 现代密码算法 ▪ 2.4 编程实例
2.1 消息和加密
▪ 消息被称为明文。 ▪ 用某种方法伪装消息以隐藏它的内容的过程称为加密, ▪ 加了密的消息称为密文, ▪ 而把密文转变为明文的过程称为解密,
2.2 古典密码算法
▪ 2.2.4.一次性密码簿加密
▪ 密码簿每一页都是不同的代码表,可用一页 上的代码来加密一些词,用后销毁,再用另
一页加密另一些词,直到全部的明文完成加 密,破译的唯一方法就是获取一份相同的密 码簿。
2.3 现代密码算法
▪ 流密码是将明文划分成字符(如单个字母),
或其编码的基本单元(如0、1数字),字符 分别与密钥流作用进行加密,解密时以同步
2.4 编程实例
编程过程视频 1 , 2 ▪ 实验基本要求 ▪ 扩展凯撒密码:
▪ 从可视化界面输入密钥,实现加解密
▪ 高级要求(选做): ▪ 1、密文必须为英文字符,不能乱码 ▪ 2、选择任一古典密码算法实现加解密
字依次写在密钥下,再按数字次序重新组织文字实现加密,
也有人喜欢将明文逆序输出作为密文。例如
▪ 密钥:5 2 4 1 6 3 (密文排列次序) ▪ 明文:信息安全技术 ▪ 密文:技息全信术安
2.2 古典密码算法
2)列变位法。 将明文字符分割成个数固定的分组(如5个一组,5
即为密钥!),按一组一行的次序整齐排列,最后 不足一组用任意字符填充,完成后按列读取即成密
即gcd(b, φ(n))=1。 ▪ (5)、计算ab=1 mod φ(n)。 ▪ (6)、保密a,p和q,公开n和b。
凯撒密码加密算法
if (messageArr[i] == initWord[j]) {
index[i] = j; //记录每个字符的位置
}
}
}
for (int i = 0, j = 0; i < index.length; i++, j++) {
if (index[i] != -1) {
messageRes[j] = tempCaesar[index[i]]; //从对应位置中取出加密的字符
int c = 65 + offset + col;
//如果大于90,说明超出Z的范围,应从A在开始
if (c > 90) {
c = c - 90 + 64;
}
crypto[row][col] = (char) (c);
}
}
//第二种初始化方法,利用initWord进行初始化
//外层循环,表示数组行数
char[] messageRes = new char[messageArr.length]; new int[messageArr.length]; //存放原字符各个字符的位置
for (int i = 0; i < messageArr.length; i++) {
int[] offsets = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 };
Crypto c = new Crypto(offsets);
for (int j = 0; j < initWord.length; j++) {
凯撒密码程序
凯撒密码程序#include<stdio.h>#include<conio.h>char JFjiami(char ch,int n) {while(ch>='A'&&ch<='Z') {n=n%26;return ('A'+(ch-'A'+n)%26); }while(ch>='a'&&ch<='z') {n=n%26;return ('a'+(ch-'a'+n)%26); }while(ch>='0'&&ch<='9') {n=n%10;return ('0'+(ch-'0'+n)%10); }return ch;}char JFjiemi(char ch,int n) {static int k;while(ch>='A'&&ch<='Z') { k=n%26;n=26-k;return ('A'+(ch-'A'+n)%26); }while(ch>='a'&&ch<='z') { k=n%26;n=26-k;return ('a'+(ch-'a'+n)%26); }while(ch>='0'&&ch<='9') { k=n%10; n=10-k;return ('0'+(ch-'0'+n)%10); } return ch;}char CFjiami(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 CFjiemi(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<100;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;if(h>=0&&h<=9)return ('0'+h);}}return ch;}void menu(){printf("\n=========================================================" );printf("\n 1.JFjiami the file"); printf("\n 2.CFljiami the file"); printf("\n 3.JFjiemi the file"); printf("\n 4.CFjiemi the file");printf("\n 5.Quit\n");printf("=========================================================\n");printf("Please input a number rang from 1 to 5 and 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();while(ch0!='5'){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(JFjiami(fgetc(in),n),out);}printf("\nJFjiami is over!\n");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(CFjiami(fgetc(in),n),out);}printf("\nCFjiami 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();exit(0);}while(!feof(in)){fputc(JFjiemi(fgetc(in),n),out);}printf("\nJFjiemi 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"); printf("Press any key to exit!\n"); fclose(in);getch();exit(0);}while(!feof(in)){fputc(CFjiemi(fgetc(in),n),out);}printf("\nCFjiemi is over!\n");fclose(in);fclose(out);sleep(1);}menu();ch0=getch();}clrscr();printf("\nGood Bye!\n"); sleep(3);}。
- 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:。