文章目录

  • 前言
  • 一、凯撒密码
  • 二、维吉尼亚密码
  • 三、双换位密码
  • 四、RC4算法加密

前言

本博文为信息安全与支付课程的课程作业。


一、凯撒密码

文件有:Caesar.java、输入文件input1.txt、输出文件output1.txt
Caesar.java代码如下:

import java.util.Scanner;
import java.io.*;
import java.lang.reflect.Array;public class Caesar {//凯撒密码,只能实现英文字母的置换,大写置换大写,小写置换小写public static void main(String[] args) throws IOException {System.out.println("[E 加密][D 解密],请选择一个");Scanner c=new Scanner(System.in);// 创建Scanner对象String s1=c.nextLine();//获取本行的字符串if(s1.equalsIgnoreCase("E")) {//判断变量s1与A是否相等,忽略大小//System.out.println("请输入明文:");//Scanner sc=new Scanner(System.in);//String s=sc.nextLine();String s=Readfile();System.out.println("请输入密钥:");Scanner sc1=new Scanner(System.in);int key=sc1.nextInt();//将下一输入项转换成int类型Encryption(s,key);}else if(s1.equalsIgnoreCase("D")) {System.out.println("请输入密文:");Scanner sc=new Scanner(System.in);String s=sc.nextLine();System.out.println("请输入密钥:");Scanner sc1=new Scanner(System.in);int key=sc1.nextInt();Decrypt(s,key);//调用Encryption方法}}public static String Readfile() throws IOException {String fileName ="input1.txt";FileReader fileReader = new FileReader(fileName);BufferedReader bufferedReader = new BufferedReader(fileReader);StringBuffer sb=new StringBuffer();System.out.println("从文件中读取明文为:"); String Line =bufferedReader.readLine();while (Line!=null){System.out.println(Line);sb.append(Line);Line = bufferedReader.readLine(); }String s=new String(sb);bufferedReader.close();fileReader.close();return s;}public static void Decrypt(String str, int n) {        //解密int k=Integer.parseInt("-"+n);String string="";for(int i=0;i<str.length();i++) {char c=str.charAt(i);if(c>='a'&&c<='z')//如果字符串中的某个字符是小写字母{c+=k%26;//移动key%26位if(c<'a')c+=26;//向左超界if(c>'z')c-=26;//向右超界}else if(c>='A'&&c<='Z')//如果字符串中的某个字符是大写字母{c+=k%26;//移动key%26位if(c<'A')c+=26;//向左超界if(c>'Z')c-=26;//向右超界}string +=c;//将解密后的字符连成字符串}System.out.println("密文为:"+str+" "+"明文为:"+string+" "+"密钥为:"+n);        }public static void Encryption(String str, int k) throws FileNotFoundException {        //加密String string="";for(int i=0;i<str.length();i++) {char c=str.charAt(i);if(c>='a'&&c<='z')//如果字符串中的某个字符是小写字母{c+=k%26;//移动key%26位if(c<'a')c+=26;//向左超界if(c>'z')c-=26;//向右超界}else if(c>='A'&&c<='Z')//如果字符串中的某个字符是大写字母{c+=k%26;//移动key%26位if(c<'A')c+=26;//向左超界if(c>'Z')c-=26;//向右超界}string +=c;//将解密后的字符连成字符串}System.out.println("明文为:"+str+" "+"密文为:"+string+" "+"密钥为:"+k);WriteFile(string);}public static void WriteFile(String string) throws FileNotFoundException {File file = new File("ouput1.txt");if (file.exists()) { // 检查scores.txt是否存在System.out.println("File already exists");System.exit(1); // 如果存在则退出程序}// 如果不存在则创建一个新文件try (PrintWriter output = new PrintWriter(file);) {output.print("凯撒密码明文加密后密文为:"+string);output.close();}   }}

运行截图:

二、维吉尼亚密码

文件:Vigenere.java。输入文件input2.txt;输出文件:output2.txt。
功能:按照维吉尼亚密码表,对英文明文/密文(可含特殊字符,如空格,感叹号等)进行加密/解密,特殊字符不加密解密。密文和明文为大小写一致的英文,密钥为大小写一致的英文字母,在特殊字符位置上,应与明密文一致。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;public class Vigenere {//维吉尼亚密码,将密钥重复至与明文等长,其中,特殊字符的位置上密钥与明文相同;//按照维吉尼亚密码表转换,其中,特殊字符不转换;密钥大小写应与明、密文一致;public static void main(String[] args) throws IOException {//选择加密或解密System.out.println("[E 加密][D 解密],请选择一个");Scanner scan=new Scanner(System.in);//创建Scanner对象String s1=scan.nextLine();//获取本行的字符串//输入明文或密文if(s1.equalsIgnoreCase("E")) {//判断变量s1与E是否相等,忽略大小//获取明文//System.out.println("请输入明文:");//Scanner sc=new Scanner(System.in);//String m=sc.nextLine();//int num=m.length();String m=Readfile(); int num=m.length();//获取密钥System.out.println("请输入密钥:");Scanner sc1=new Scanner(System.in);String key=sc1.nextLine();int num1=key.length();char[] k=new char[num];//扩充密钥使其和明文等长,跳过特殊字符int count=0;//计算明文中特殊字符的数量for(int i=0;i<num;i++) {if(m.charAt(i)<'A'||(m.charAt(i)>'Z'&&m.charAt(i)<'a')||m.charAt(i)>'z'){k[i]=m.charAt(i);count++;}//特殊字符不转换else{k[i]=key.charAt((i-count)%num1);}}Encryption(m,k);//调用Encryption方法}else if(s1.equalsIgnoreCase("D")) {System.out.println("请输入密文:");Scanner sc=new Scanner(System.in);String m=sc.nextLine();int num=m.length();System.out.println("请输入密钥:");Scanner sc1=new Scanner(System.in);String key=sc1.nextLine();int num1=key.length();char[] k=new char[num];int count=0;for(int i=0;i<num;i++) {if(m.charAt(i)<'A'||(m.charAt(i)>'Z'&&m.charAt(i)<'a')||m.charAt(i)>'z'){k[i]=m.charAt(i);count++;}//特殊字符不转换else{k[i]=key.charAt((i-count)%num1);}//扩充密钥使其和明文等长,跳过特殊字符}Decryption(m,k);//调用Encryption方法}}public static String  Readfile() throws IOException {String fileName ="input2.txt";FileReader fileReader = new FileReader(fileName);BufferedReader bufferedReader = new BufferedReader(fileReader);StringBuffer sb=new StringBuffer();System.out.println("从文件中读取明文为:"); String Line =bufferedReader.readLine();while (Line!=null){System.out.println(Line);sb.append(Line);Line = bufferedReader.readLine(); }String m=new String(sb);bufferedReader.close();fileReader.close();return m;}public static void Encryption(String m,char[] k) throws FileNotFoundException {//加密String string="";for(int i=0;i<m.length();i++) {char c=m.charAt(i);if(c<='z'&&c>='a') {c=(char) (c+k[i]-'a');if(c>122) c=(char) (c-26);string +=c;//将解密后的字符连成字符串}else if(c<='Z'&&c>='A') {c=(char)(( (c+k[i]-'A')%26)+'A');if(c>90) c=(char) (c-26);string +=c;}else {string +=c;}}System.out.print("明文为:"+m+" "+"密文为:"+string+"密钥为:");for(int i=0;i<k.length;i++) {System.out.print(k[i]);}WriteFile(string);}public static void WriteFile(String string) throws FileNotFoundException {File file = new File("ouput2.txt");if (file.exists()) { // 检查scores.txt是否存在System.out.println("File already exists");System.exit(1); // 如果存在则退出程序}// 如果不存在则创建一个新文件try (PrintWriter output = new PrintWriter(file);) {output.print("维吉尼亚密码明文加密后密文为:"+string);output.close();}   }public static void Decryption(String m,char[] k) {//解密String string="";for(int i=0;i<m.length();i++) {char c=m.charAt(i);if(c<='z'&&c>='a') {c=(char) (c-(k[i]-'a'));if(c<97) c=(char) (c+26);string +=c;}else if(c<='Z'&&c>='A') {c=(char) (c-(k[i]-'A'));if(c<65) c=(char) (c+26);string +=c;}else {string +=c;}}System.out.print("密文为:"+m+" "+"明文为:"+string+"密钥为:");for(int i=0;i<k.length;i++) {System.out.print(k[i]);}}
}

运行截图:

三、双换位密码

文件:Bifid.java。输入文件input3.txt;输出文件:output3.txt。
注:明文和密文为英文,密钥有两个,密钥内数字用逗号隔开。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;public class Bifid {public static void main(String[] args) throws IOException {//选择加密或解密方式System.out.println("[E 加密][D 解密],请选择一个");Scanner sc=new Scanner(System.in);//创建Scanner对象String s1=sc.nextLine();//获取本行的字符串//加密或解密方式if(s1.equalsIgnoreCase("E")) {//System.out.println("请输入明文:");//Scanner sc1=new Scanner(System.in);//String mingw=sc1.nextLine();//char[] mingwen=mingw.toCharArray();String m=Readfile();char mingwen[]=new char[m.length()];for(int i=0;i<m.length();i++){mingwen[i]=m.charAt(i);}System.out.println("请输入第一个密钥,数字之间用逗号隔开:");Scanner sc2=new Scanner(System.in);String mystr1=sc2.nextLine();String[] miyue1=mystr1.split(",");int[] my1=new int[miyue1.length];for(int i=0;i<miyue1.length;i++) {my1[i]=Integer.parseInt(miyue1[i]);//第一种输入int型数组方法}System.out.println("请输入第二个密钥,数字之间用逗号隔开:");Scanner sc3=new Scanner(System.in);String mystr2=sc3.nextLine();String[] miyue2=mystr2.split(",");int[] my2=new int[miyue2.length];for(int i=0;i<miyue2.length;i++) {my2[i]=Integer.parseInt(miyue2[i]);//第一种输入int型数组方法}Encryption(mingwen,my1,my2,miyue1.length,miyue2.length);}else if(s1.equalsIgnoreCase("D")) {//解密System.out.println("请输入密文:");Scanner sc1=new Scanner(System.in);String miw=sc1.nextLine();char[] miwen=miw.toCharArray();System.out.println("请输入第一个密钥,数字之间用逗号隔开:");Scanner sc2=new Scanner(System.in);String mystr1=sc2.nextLine();String[] miyue1=mystr1.split(",");int[] my1=new int[miyue1.length];for(int i=0;i<miyue1.length;i++) {my1[i]=Integer.parseInt(miyue1[i]);//第一种输入int型数组方法}System.out.println("请输入第二个密钥,数字之间用逗号隔开:");Scanner sc3=new Scanner(System.in);String mystr2=sc3.nextLine();String[] miyue2=mystr2.split(",");int[] my2=new int[miyue2.length];for(int i=0;i<miyue2.length;i++) {my2[i]=Integer.parseInt(miyue2[i]);//第一种输入int型数组方法}Decryption(miwen,my1,my2,miyue1.length,miyue2.length);}}public static String Readfile() throws IOException {String fileName ="input3.txt";FileReader fileReader = new FileReader(fileName);BufferedReader bufferedReader = new BufferedReader(fileReader);StringBuffer sb=new StringBuffer();System.out.println("从文件中读取明文为:"); String Line =bufferedReader.readLine();while (Line!=null){System.out.println(Line);sb.append(Line);Line = bufferedReader.readLine(); }bufferedReader.close();fileReader.close();String m=new String(sb);return m;}private static void Encryption(char[] mingwen, int[] my1, int[] my2, int myl1, int myl2) throws FileNotFoundException {char[][] mw=new char[myl1][myl2];for(int i=0;i<myl1;i++) {for(int j=0;j<myl2;j++) {mw[i][j]=mingwen[i*3+j];}}System.out.print("明文为:");for(int i=0;i<mingwen.length;i++) {System.out.print(mingwen[i]);}System.out.print("密文为:");char[][] m=new char[myl1][myl2];for(int i=0;i<myl1;i++) {for(int j=0;j<myl2;j++) {m[i][j]=mw[my1[i]-1][my2[j]-1];System.out.print(m[i][j]);}}System.out.print(" "+"密钥分别为:");for(int i=0;i<my1.length;i++) {System.out.print(my1[i]);}System.out.print(" ");for(int i=0;i<my2.length;i++) {System.out.print(my2[i]);}WriteFile(m,myl1,myl2);}public static void WriteFile(char[][] m,int myl1,int myl2) throws FileNotFoundException {File file = new File("ouput3.txt");if (file.exists()) { // 检查scores.txt是否存在System.out.println("File already exists");System.exit(1); // 如果存在则退出程序}// 如果不存在则创建一个新文件try (PrintWriter output = new PrintWriter(file);) {for(int i=0;i<myl1;i++) {for(int j=0;j<myl2;j++) {output.print("双换位密码明文加密后密文为:"+m[i][j]);}}output.close();}  }public static void Decryption(char[] miwen, int[] my1, int[] my2, int myl1, int myl2) {char[][] mw=new char[myl1][myl2];for(int i=0;i<myl1;i++) {for(int j=0;j<myl2;j++) {mw[i][j]=miwen[i*3+j];}}System.out.print("密文为:");for(int i=0;i<miwen.length;i++) {System.out.print(miwen[i]);}System.out.print("明文为:");char[][] m=new char[myl1][myl2];for(int i=0;i<myl1;i++) {for(int j=0;j<myl2;j++) {m[i][j]=mw[my1[i]-1][my2[j]-1];System.out.print(m[i][j]);}}System.out.print(" "+"密钥分别为:");for(int i=0;i<my1.length;i++) {System.out.print(my1[i]);}System.out.print(" ");for(int i=0;i<my2.length;i++) {System.out.print(my2[i]);}}}

运行截图:

四、RC4算法加密

文件:myrc4.java。输入文件input4.txt;输出文件:output4.txt。
注:明文密文都是中文,密钥是中文。


import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//明文密文必须得是中文
public class myrc4 {public static void main(String[] args) throws IOException {//选择加密或解密方式System.out.println("[E 加密][D 解密],请选择一个");Scanner s=new Scanner(System.in);//创建Scanner对象String s1=s.nextLine();//获取本行的字符串//输入明文密文密钥if(s1.equalsIgnoreCase("E")) {//输入明文//System.out.println("请输入明文:");//Scanner sc=new Scanner(System.in);//String plaintext=sc.nextLine();String plaintext=Readfile();System.out.println("从文件中读取明文为:\n"+plaintext);//输入密钥System.out.println("请输入密钥:");Scanner sc1=new Scanner(System.in);String key=sc1.nextLine();//调用方法String ciphertext = encrypt(plaintext,key);  //打印明文System.out.println("明文为:"+plaintext);//打印加密后的字符串      System.out.println("密文:"+ciphertext); //打印密钥System.out.println("密钥为:"+key);//文件输出WriteFile(ciphertext);}else if(s1.equalsIgnoreCase("D")) {//输入密文System.out.println("请输入密文:");Scanner sc3=new Scanner(System.in);String ciphertext=sc3.nextLine();//输入密钥System.out.println("请输入密钥:");Scanner sc4=new Scanner(System.in);String key=sc4.nextLine();//调用方法String plaintext =encrypt(ciphertext,key);  //打印加密后的字符串      System.out.println("密文"+ciphertext); //打印解密后的字符串      System.out.println("明文为:"+plaintext); //打印密钥System.out.println("密钥为:"+key);}}   public static String Readfile() throws IOException {String fileName ="input4.txt";BufferedReader in=new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "UTF-8")); String line = "";  StringBuffer sb = new StringBuffer();while((line = in.readLine())!=null){  sb.append(line);}try {  in.close();  } catch (IOException e) {  e.printStackTrace();  }String plaintext=new String(sb);return plaintext;}public static void WriteFile(String string) throws FileNotFoundException {File file = new File("ouput4.txt");if (file.exists()) { // 检查scores.txt是否存在System.out.println("File already exists");System.exit(1); // 如果存在则退出程序}// 如果不存在则创建一个新文件try (PrintWriter output = new PrintWriter(file);) {output.print("RC4算法加密后密文为:"+string);output.close();}   }//加解密过程是一样的,加密:明文流字与密钥流字XOR得到密文流字,解密:密文流字与密钥流字XOR得到明文流字   public static String encrypt(final String plainOrCipherText, final String key) {Integer[] S = new Integer[256]; // S盒Character[] keySchedul = new Character[plainOrCipherText.length()]; // 生成的密钥流StringBuffer ciphertext = new StringBuffer();ksa(S, key);rpga(S, keySchedul, plainOrCipherText.length());for (int i = 0; i < plainOrCipherText.length(); ++i) {ciphertext.append((char) (plainOrCipherText.charAt(i) ^ keySchedul[i]));}return ciphertext.toString();}/*1.初始化向量S*/public static void ksa(Integer[] s, String key) {for (int i = 0; i < 256; ++i) {s[i] = i;}int j = 0;for (int i = 0; i < 256; ++i) {j = (j + s[i] + key.charAt(i % key.length())) % 256;swap(s, i, j);}}/*2.伪随机生成算法*/public static void rpga(Integer[] s, Character[] keySchedul, int plaintextLength) {int i = 0, j = 0;for (int k = 0; k < plaintextLength; ++k) {i = (i + 1) % 256;j = (j + s[i]) % 256;swap(s, i, j);keySchedul[k] = (char) (s[(s[i] + s[j]) % 256]).intValue();}}/*置换*/public static void swap(Integer[] s, int i, int j) {Integer mTemp = s[i];s[i] = s[j];s[j] = mTemp;}
}

运行截图:


完事儿~

Java实现凯撒密码、维吉尼亚密码、双换位密码、RC4算法加密相关推荐

  1. 维吉尼亚(Vigenere)密码

    维吉尼亚密码是一个很著名的多码加密法,多码加密法是一种替换加密法,其中的每个明文字母可以用密文中的多个字母来代替,而每个密文字母也可以表示多个明文字母. 维吉尼亚密码引入了"密钥" ...

  2. 古典密码(单表密码,维吉尼亚密码,普莱费尔密码,一次一密)

    古典密码 1.单表密码(仿射加密) 仿射加密变化是:y=ax+b 算法: 仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母. A B C ...

  3. 古典密码算法(移位密码算法、维吉尼亚算法)

    古典密码算法(凯撒.维吉尼亚) A. 1-1.移位密码算法 [实验目的] 1) 学习移位密码的原理 2) 学习移密码的实现 [实验原理] 算法原理 a) 移位密码就是对26个字母进行移位操作,可以移动 ...

  4. 实验吧-密码学-杯酒人生(特殊凯撒--维吉尼亚密码)(凯撒加解密脚本、维吉尼亚密码加解密脚本)...

    题目: 使用古典密码 一喵星人要想喵星发送一段不知道干什么用的密码"BLOCKCIPHERDESIGNPRINCIPLE", 但是它忘记了密钥是什么, 手头(爪头)只有它自己加密过 ...

  5. 维吉尼亚密码及其破解

    凯撒密码 凯撒密码是一种简单的加密方法,即将文本中的每一个字符都位移相同的位置. 如选定位移3位: 原文:a b c 密文:d e f 由于出现了字母频度分析,凯撒密码变得很容易破解. "如 ...

  6. 维吉尼亚密码-攻防世界(shanghai)

    ⭐维吉尼亚密码 维吉尼亚密码 是使用一系列 凯撒密码 组成密码字母表的加密算法,属于多表密码的一种简单形式. 加密原理 维吉尼亚密码的前身,是我们熟悉的凯撒密码. 凯撒密码的加密方式是依靠一张字母表中 ...

  7. 多表代换和维吉尼亚密码

    一.多表代换 多表代换密码跟单表代换密码的区别,主要是,多表代换的代换表有多个.对于加密,交替使用不同的代换表.注意,加密和解密要同步,也就是,加密和解密所用的代换表顺序要一致,不然,解密会出错. 多 ...

  8. C语言实现维吉尼亚密码(VS2019)

    目录 前言 一.维吉尼亚(Vigenère)密码原理及介绍 二.加密/解密算法介绍 1.加密算法 2.解密算法 三.完整代码展示 总结 前言 本文介绍了维吉尼亚密码的原理,以及用C语言是如何实现的,是 ...

  9. python 古典密码第一弹(凯撒密码,Playfair密码,维吉尼亚密码)

    各位白嫖-漂亮大哥哥姐姐们好,在下菜鸡一枚,主要想在这和大家一起探讨学习之道,一起愉快的学习密码学基础.总所周知,密码学学的好,头发掉的少... 直接进入正题,今天我就主要讲三个密码,而且都是古典密码 ...

最新文章

  1. python中的counter()、elements()、most_common()和subtract()函数的用法
  2. vb跨域访问ajax,解决AJAX的跨域访问-两种有效示例
  3. 存储http请求返回参数_前端学习需要知道的 HTTP 知识(1/7)
  4. 聊聊WebRTC网关服务器2:如何选择PeerConnection方案?
  5. YOLOv5自定义数据集训练
  6. MS-SQLSERVER--错用了LEN()函数
  7. matlab if m不等于0,matlab问题clearfor a=0.1:0.1:50for b=0.1:0.1:20for m=0.1:0.1:5
  8. 美媒:小米新浪达成合作 采取行动对抗腾讯
  9. 【ACL2020】Reasoning with Latent Structure Refinement for Document-Level Relation Extraction
  10. 一文了解阿里云CDN HTTP2.0
  11. KeyMob移动广告聚合平台-致力于打造最牛的聚合平台
  12. 实体店如何做好门店引流
  13. UEditor之基于Java图片上传前后端源码研究
  14. Windows 开发 辅助调试工具 和 方法
  15. 《软件工程与实践》 |(一)软件工程基础概述 知识梳理
  16. python吃显卡还是内存条_内存条与显卡金手指氧化了解决方法
  17. cajviewer阅读器打不开怎么解决
  18. RedHat下载安装JDK的方法(方法二)
  19. 申论公文题-宣传类-1
  20. 如何获得指定进程的主窗口

热门文章

  1. 52数学能力测评历年真题及答案(五年级)
  2. 批量提取Word中的图片
  3. MATLAB画图---设置坐标轴为固定值(以4厘米为例)
  4. linux检查网络是否通畅_linux下怎么检测网络的连通性
  5. Vue子传父详细教程
  6. mysql join 一对多_Join 一对多连接
  7. 丙类功率放大器效率高的原理是其通角小,其不失真的原因是:
  8. 史上最全的Linux命令汇总(全网最全)
  9. 【沃顿商学院学习笔记】宏观经济学——11全球治理Global Governance
  10. Linux快捷键大全(参考)