当前位置:   article > 正文

加解密系统(包含DES、RSA等加密算法)_包含rsa组合算法

包含rsa组合算法

最近和小伙伴一起构建了一个包含仿射、流密码RC4、流密码LFSR+JK,DES及RSA的加解密系统。界面包括加解密算法选择框,加密解密按钮,加密明文信息框以及解密密文信息框。

完整代码已经上传到github上了,里面的README.md有具体的操作说明教程,需要的同学可以自取,地址:https://github.com/Alexlingl/Cryptology

下面就大致介绍一下这个加解密系统的构建过程。

一、界面的设计与实现:

(一)、界面的设计:

(二)、界面的实现

1、布局:采用边框布局BorderLayout。它会将界面分为东南西北中四个部分,相应的,我们在北部添加一个Jpanel,作为按钮等组件的容器。在东部添加一个JPanel,作为JScrollPane的容器,呈现待处理的具体信息。在中部添加一个JPanel,也是作为JScrollPane的容器,不同的是它呈现的是处理后的具体信息。

2、信息框:使用JScrollPane可以实现信息过多时,可以下拉的效果,但是如果我们要在上面展示文字,还需要往上面添加一个JTextArea组件。

3、打开文件功能:调用JFileChoose来实现,点击后会出现一个从计算机中选择文件的界面。

4、算法下拉可选框:调用了JComboBox

5、最终的界面实现

 

二、界面监控与后台:

(一)、“选择文件”功能的按钮监控与后台逻辑实现:

1、首先我们需要给按钮添加监听机制

2、接着,我们需要保存获取的文件

3、最后利用addmessageleft这个方法,把选择的文件内容展示在待处理的信息框中

 

(二)、可选框的监听与后台逻辑实现:

1、首先需要给可选框添加监听机制

2、其次我们需要记录可选框中用户当前所选择的内容,这里我定义了一个choosetype来作为标志。根据用户不同的选择来给这个变量赋值。

 

(三)、加解密按钮的监听与后台逻辑实现:

1、首先还是需要给两个按钮添加监听机制

2、接着我们需要判断用户点击的是“加密”还是“解密”按钮,并进行不同的处理

3、最后,我们需要根据用户当前下拉框中选择的算法来进行相应的处理

以仿射加密为例来看一下具体的处理过程

首先定义一个临时存储数据的动态字符串数组tmp,并调用事先定义好的仿射对象的加密方法encrypt()对文本中的信息一行行地进行加密,加密结果就存放在tmp中。接着我们把tmp传给MessageWindows对象mw中的processed_text属性,这个就是处理后的信息。调用WriteStringToFile()方法把加密后的信息输出到“C:\\Users\\Administrator\\Documents\\仿射密文.txt”这个文件中。最后再调用addmessageright把处理后的信息显示到右边的信息显示框即可。

三、代码:

界面类

  1. package player3;
  2. import java.awt.BorderLayout;
  3. import java.awt.Color;
  4. import java.awt.Dimension;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.io.FileNotFoundException;
  8. import java.io.FileOutputStream;
  9. import java.io.IOException;
  10. import java.io.OutputStreamWriter;
  11. import java.util.ArrayList;
  12. import javax.swing.BorderFactory;
  13. import javax.swing.JButton;
  14. import javax.swing.JComboBox;
  15. import javax.swing.JFrame;
  16. import javax.swing.JPanel;
  17. import javax.swing.JScrollPane;
  18. import javax.swing.JTextArea;
  19. public class MessageWindows extends JFrame implements Config{
  20. public static ArrayList<String>messageList;
  21. // 三块面板,一块是背景,两块是信息显示界面
  22. public JPanel jPanel1,jPanelback2,jPanelback3;
  23. //两块信息显示界面,分别添加在JPanelback1和JPanelback2上面。直接加载JPanel上会出现大小无法调节等问题
  24. public JScrollPane jPanel2,jPanel3;
  25. //文件菜单按钮
  26. public JButton mnFile;
  27. // 两个按钮,一个是加密,一个是解密
  28. public JButton jButton1, jButton2;
  29. //输出台
  30. public JTextArea jTextAreainput,jTextAreaoutput;
  31. //选择进行加密的类型
  32. public int choosetype;
  33. //待处理的文本
  34. public static ArrayList<String> text = new ArrayList();
  35. //待处理的文本
  36. public static ArrayList<String> processed_text = new ArrayList();
  37. public MessageWindows() {
  38. initComp();
  39. this.choosetype=0;
  40. messageList=new ArrayList();
  41. }
  42. public void initComp() {
  43. this.setTitle("系统消息界面");
  44. //设置顶级容器的大小,setSize()只对顶级容器有效
  45. this.setSize(MainWindows_WIDTH,MainWindows_HIGHTH);
  46. //窗体关闭时结束程序
  47. this.setDefaultCloseOperation(3);
  48. //设置窗体居中
  49. this.setLocationRelativeTo(null);
  50. this.setResizable(false);
  51. jPanel1= new JPanel();
  52. jPanelback2=new JPanel();
  53. jPanelback3=new JPanel();
  54. //下拉可选框
  55. String[] choose={"仿射","流密码RC4","流密码LFSRJK","DES","RSA"};
  56. JComboBox box=new JComboBox(choose);
  57. //三个按钮
  58. mnFile= new JButton("选择文件");
  59. jButton1= new JButton("加密");
  60. jButton2= new JButton("解密");
  61. //设置为边界布局
  62. this.setLayout(new BorderLayout());
  63. box.setPreferredSize(new Dimension(Button_WIDTH, Button_HIGHTH));
  64. mnFile.setPreferredSize(new Dimension(Button_WIDTH, Button_HIGHTH));
  65. jButton1.setPreferredSize(new Dimension(Button_WIDTH, Button_HIGHTH));
  66. jButton2.setPreferredSize(new Dimension(Button_WIDTH, Button_HIGHTH));
  67. //在画板面板添加组件
  68. jPanel1.add(mnFile);
  69. jPanel1.add(box);
  70. jPanel1.add(jButton1);
  71. jPanel1.add(jButton2);
  72. jPanel1.setPreferredSize(new Dimension(NorthPanel_WIDTH,NorthPanel_HIGHTH));
  73. jPanelback2.setPreferredSize(new Dimension(WestPanel_WIDTH,WestPanel_HIGHTH));
  74. jPanelback3.setPreferredSize(new Dimension(EastPanel_WIDTH,EastPanel_HIGHTH));
  75. //待处理的信息,将选择的待处理文本显示到界面上
  76. jTextAreainput=new JTextArea();
  77. jPanel2= new JScrollPane(jTextAreainput);
  78. jPanel2.setBackground(Color.LIGHT_GRAY);
  79. jPanel2.setBounds(41,34, WestPanel_WIDTH, 194);
  80. jPanel2.setBorder(BorderFactory.createTitledBorder("待处理的信息"));
  81. jPanel2.setPreferredSize(new Dimension(WestPanel_WIDTH,WestPanel_HIGHTH));
  82. //处理后的信息,将处理后的文本信息显示到界面上
  83. jTextAreaoutput=new JTextArea();
  84. jPanel3= new JScrollPane(jTextAreaoutput);
  85. jPanel3.setBackground(Color.LIGHT_GRAY);
  86. jPanel3.setBounds(41,34, EastPanel_WIDTH, 194);
  87. jPanel3.setBorder(BorderFactory.createTitledBorder("加/解密后的信息"));
  88. jPanel3.setPreferredSize(new Dimension(EastPanel_WIDTH,EastPanel_HIGHTH));
  89. jPanelback2.add(jPanel2);
  90. jPanelback3.add(jPanel3);
  91. //将界面加到布局上
  92. this.add(jPanel1,BorderLayout.NORTH);
  93. this.add(jPanelback2,BorderLayout.WEST);
  94. this.add(jPanelback3,BorderLayout.EAST);
  95. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  96. //设置界面可见
  97. this.setVisible(true);
  98. //为文件选择按钮添加监听机制
  99. mnFile.addActionListener(new ActionListener() {
  100. public void actionPerformed(ActionEvent e) {
  101. try {
  102. PlayerMain.openVideo();
  103. } catch (IOException e1) {
  104. // TODO Auto-generated catch block
  105. e1.printStackTrace();
  106. }
  107. }
  108. });
  109. //为可选框添加监听机制
  110. box.addActionListener(new ButtonListener(this,box));
  111. //为按钮1,2添加监听机制
  112. jButton1.addActionListener(new ButtonListener(this));
  113. jButton2.addActionListener(new ButtonListener(this));
  114. }
  115. //将处理信息加到左边界面的方法
  116. public void addmessageleft(ArrayList<String> text) throws FileNotFoundException{
  117. this.text = text;
  118. jTextAreainput.append("当前进行加/解密的文本\n");
  119. jTextAreainput.paintImmediately(jTextAreainput.getBounds());
  120. for(int i=0;i<text.size();i++){
  121. jTextAreainput.append(text.get(i)+"\n");
  122. jTextAreainput.paintImmediately(jTextAreainput.getBounds());
  123. }
  124. }
  125. //将处理后的信息加到右边界面上
  126. public void addmessageright(ArrayList<String> processed_text) throws FileNotFoundException{
  127. this.processed_text = processed_text;
  128. jTextAreaoutput.append("当前加/解密后得到的文本\n");
  129. jTextAreaoutput.paintImmediately(jTextAreainput.getBounds());
  130. for(int i=0;i<processed_text.size();i++){
  131. jTextAreaoutput.append(processed_text.get(i)+"\n");
  132. jTextAreaoutput.paintImmediately(jTextAreaoutput.getBounds());
  133. }
  134. }
  135. //把处理后信息输入到文本文件中
  136. public void WriteStringToFile(ArrayList<String> processed_text,String filepath) throws IOException {
  137. OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filepath),"UTF-8");
  138. for(int i=0;i<processed_text.size();i++){
  139. osw.append(processed_text.get(i)+"\n");
  140. }
  141. osw.close();
  142. }
  143. }

界面监听类:

  1. package player3;
  2. //设置按钮监听方法ButttonLitener类
  3. import java.awt.event.ActionListener;
  4. import java.awt.event.ActionEvent;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;
  7. import java.util.ArrayList;
  8. import javax.swing.JComboBox;
  9. import des.DESUtil;
  10. import jklfsr.Jk;
  11. import fangshe.Fangshe;
  12. import rc4.Stream_cipher;
  13. import rsa.RSA;
  14. //实现对JPanel的监听接口处理
  15. public class ButtonListener implements ActionListener{
  16. public JComboBox box;
  17. public MessageWindows mw;
  18. public Fangshe fs=new Fangshe();
  19. public RSA rsa=new RSA();
  20. public Stream_cipher rc4=new Stream_cipher();
  21. public Jk jk=new Jk();
  22. public DESUtil des=new DESUtil();
  23. //构造方法一,只需要传界面对象
  24. public ButtonListener(MessageWindows mw){
  25. this.mw=mw;
  26. }
  27. //构造方法二,需要传界面对象和下拉可选框的对象
  28. public ButtonListener(MessageWindows mw,JComboBox box){
  29. this.mw=mw;
  30. this.box=box;
  31. }
  32. //在console中展示当前文本
  33. public void showtext(ArrayList<String>text){
  34. for(int i=0;i<text.size();i++){
  35. System.out.println(text.get(i));
  36. }
  37. }
  38. //当界面发生操作时进行处理
  39. public void actionPerformed(ActionEvent e) {
  40. //根据点击的按钮做出相应的处理
  41. if(e.getActionCommand().equals("加密")) {
  42. //选择进行仿射加密
  43. if(mw.choosetype==0){
  44. ArrayList<String>tmp=new ArrayList();
  45. for(int i=0;i<mw.text.size();i++){
  46. tmp.add(fs.encrypt(mw.text.get(i)));
  47. }
  48. showtext(tmp);
  49. mw.processed_text=tmp;
  50. try {
  51. //将加密结果输出到文件
  52. mw.WriteStringToFile(mw.processed_text, "C:\\Users\\Administrator\\Documents\\仿射密文.txt");
  53. } catch (IOException e2) {
  54. // TODO Auto-generated catch block
  55. e2.printStackTrace();
  56. }
  57. try {
  58. mw.addmessageright(mw.processed_text);
  59. } catch (FileNotFoundException e1) {
  60. // TODO Auto-generated catch block
  61. e1.printStackTrace();
  62. }
  63. }
  64. //选择流密码RC4进行加密
  65. else if(mw.choosetype==1){
  66. ArrayList<String>tmp=new ArrayList();
  67. for(int i=0;i<mw.text.size();i++){
  68. tmp.add(PlayerMain.toBinary(rc4.RC4_encrypt(mw.text.get(i))));
  69. }
  70. showtext(tmp);
  71. try {
  72. mw.WriteStringToFile(tmp, "C:\\Users\\Administrator\\Documents\\RC4密文.txt");
  73. } catch (IOException e2) {
  74. // TODO Auto-generated catch block
  75. e2.printStackTrace();
  76. }
  77. mw.processed_text=tmp;
  78. try {
  79. mw.addmessageright(mw.processed_text);
  80. } catch (FileNotFoundException e1) {
  81. // TODO Auto-generated catch block
  82. e1.printStackTrace();
  83. }
  84. }
  85. //选择流密码LFSRJK进行加密
  86. else if(mw.choosetype==2){
  87. ArrayList<String>tmp=new ArrayList();
  88. for(int i=0;i<mw.text.size();i++){
  89. tmp.add(PlayerMain.toBinary(jk.JK_encrypt(mw.text.get(i))));
  90. }
  91. showtext(tmp);
  92. mw.processed_text=tmp;
  93. try {
  94. mw.WriteStringToFile(tmp, "C:\\Users\\Administrator\\Documents\\LFSRJK密文.txt");
  95. } catch (IOException e2) {
  96. // TODO Auto-generated catch block
  97. e2.printStackTrace();
  98. }
  99. try {
  100. mw.addmessageright(mw.processed_text);
  101. } catch (FileNotFoundException e1) {
  102. // TODO Auto-generated catch block
  103. e1.printStackTrace();
  104. }
  105. }
  106. //选择DES进行加密
  107. else if(mw.choosetype==3){
  108. ArrayList<String>tmp=new ArrayList();
  109. for(int i=0;i<mw.text.size();i++){
  110. tmp.add(PlayerMain.convertByteToHexString(des.jdkDECENcode(mw.text.get(i))));
  111. }
  112. showtext(tmp);
  113. mw.processed_text=tmp;
  114. try {
  115. mw.WriteStringToFile(mw.processed_text, "C:\\Users\\Administrator\\Documents\\DES密文.txt");
  116. } catch (IOException e2) {
  117. // TODO Auto-generated catch block
  118. e2.printStackTrace();
  119. }
  120. try {
  121. mw.addmessageright(mw.processed_text);
  122. } catch (FileNotFoundException e1) {
  123. // TODO Auto-generated catch block
  124. e1.printStackTrace();
  125. }
  126. }
  127. //选择进行RSA加密
  128. else if(mw.choosetype==4){
  129. ArrayList<String>tmp=new ArrayList();
  130. for(int i=0;i<mw.text.size();i++){
  131. tmp.add(PlayerMain.toBinary(rsa.encryption(mw.text.get(i))));
  132. }
  133. showtext(tmp);
  134. mw.processed_text=tmp;
  135. try {
  136. mw.WriteStringToFile(tmp, "C:\\Users\\Administrator\\Documents\\RSA密文.txt");
  137. } catch (IOException e2) {
  138. // TODO Auto-generated catch block
  139. e2.printStackTrace();
  140. }
  141. try {
  142. mw.addmessageright(mw.processed_text);
  143. } catch (FileNotFoundException e1) {
  144. // TODO Auto-generated catch block
  145. e1.printStackTrace();
  146. }
  147. }
  148. }
  149. //判断当前点击的按钮是不是解密
  150. else if(e.getActionCommand().equals("解密")) {
  151. if(mw.choosetype==0){
  152. ArrayList<String>tmp=new ArrayList();
  153. for(int i=0;i<mw.text.size();i++){
  154. tmp.add(fs.deciphering(mw.text.get(i)));
  155. }
  156. showtext(tmp);
  157. mw.processed_text=tmp;
  158. try {
  159. mw.addmessageright(mw.processed_text);
  160. } catch (FileNotFoundException e1) {
  161. // TODO Auto-generated catch block
  162. e1.printStackTrace();
  163. }
  164. }
  165. //选择RC4进行解密
  166. else if(mw.choosetype==1){
  167. ArrayList<String>tmp=new ArrayList();
  168. for(int i=0;i<mw.text.size();i++){
  169. System.out.println(mw.text.get(i));
  170. tmp.add(rc4.RC4_encrypt(PlayerMain.BinstrToStr(mw.text.get(i))));
  171. }
  172. showtext(tmp);
  173. mw.processed_text=tmp;
  174. try {
  175. mw.addmessageright(mw.processed_text);
  176. } catch (FileNotFoundException e1) {
  177. // TODO Auto-generated catch block
  178. e1.printStackTrace();
  179. }
  180. }
  181. //选择流密码LFSRJK进行解密
  182. else if(mw.choosetype==2){
  183. ArrayList<String>tmp=new ArrayList();
  184. for(int i=0;i<mw.text.size();i++){
  185. tmp.add(jk.JK_encrypt(PlayerMain.BinstrToStr(mw.text.get(i))));
  186. }
  187. showtext(tmp);
  188. mw.processed_text=tmp;
  189. try {
  190. mw.addmessageright(mw.processed_text);
  191. } catch (FileNotFoundException e1) {
  192. // TODO Auto-generated catch block
  193. e1.printStackTrace();
  194. }
  195. }
  196. //选择DES进行解密
  197. else if(mw.choosetype==3){
  198. ArrayList<String>tmp=new ArrayList();
  199. for(int i=0;i<mw.text.size();i++){
  200. System.out.println(mw.text.get(i));
  201. byte[] bytetmp=PlayerMain.convertHexStringToByte(mw.text.get(i));
  202. tmp.add(new String(des.jdkDECDecode(bytetmp)));
  203. }
  204. showtext(tmp);
  205. mw.processed_text=tmp;
  206. try {
  207. mw.addmessageright(mw.processed_text);
  208. } catch (FileNotFoundException e1) {
  209. // TODO Auto-generated catch block
  210. e1.printStackTrace();
  211. }
  212. }
  213. //选择RSA进行解密
  214. else if(mw.choosetype==4){
  215. //选择进行RSA解密
  216. ArrayList<String>tmp=new ArrayList();
  217. for(int i=0;i<mw.text.size();i++){
  218. tmp.add(rsa.decrypt(PlayerMain.BinstrToStr(mw.text.get(i))));
  219. }
  220. showtext(tmp);
  221. mw.processed_text=tmp;
  222. try {
  223. mw.addmessageright(mw.processed_text);
  224. } catch (FileNotFoundException e1) {
  225. // TODO Auto-generated catch block
  226. e1.printStackTrace();
  227. }
  228. }
  229. }
  230. //"仿射","流密码RC4","流密码LFSRJK","DES","RSA"
  231. else if(box.getSelectedItem().equals("仿射")) {
  232. mw.choosetype=0;
  233. }
  234. else if(box.getSelectedItem().equals("流密码RC4")){
  235. mw.choosetype=1;
  236. }
  237. else if(box.getSelectedItem().equals("流密码LFSRJK")){
  238. mw.choosetype=2;
  239. }
  240. else if(box.getSelectedItem().equals("DES")) {
  241. mw.choosetype=3;
  242. }
  243. else if(box.getSelectedItem().equals("RSA")){
  244. mw.choosetype=4;
  245. }
  246. }
  247. }

选择文件类:

  1. package player3;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.Scanner;
  6. import javax.swing.JFileChooser;
  7. public class PlayerMain {
  8. //界面类
  9. static MessageWindows frame;
  10. //待加解密的字符串
  11. public static ArrayList<String> text = new ArrayList();
  12. //处理后的字符串
  13. public static ArrayList<String> processed_text = new ArrayList();
  14. //程序的主函数入口,相当于c++的main函数
  15. public static void main(String[] args) {
  16. //创建主程序界面运行窗体
  17. frame=new MessageWindows();
  18. frame.setVisible(true);
  19. }
  20. //byte数组转十六进制字符串
  21. public static String convertByteToHexString(byte[] bytes) {
  22. String result = "";
  23. for(int i=0;i<bytes.length; i++) {
  24. int temp = bytes[i]&0xff;
  25. String tempHex = Integer.toHexString(temp);
  26. if(tempHex.length()<2) {
  27. result +="0"+tempHex;
  28. }
  29. else {
  30. result += tempHex;
  31. }
  32. }
  33. return result;
  34. }
  35. //将字符串转为二进制流
  36. public static String toBinary(String str){
  37. char[] strChar=str.toCharArray();
  38. String result="";
  39. for(int i=0;i<strChar.length;i++){
  40. result +=Integer.toBinaryString(strChar[i])+ " ";
  41. }
  42. return result;
  43. }
  44. private static int[] BinstrToIntArray(String binStr) {
  45. char[] temp=binStr.toCharArray();
  46. int[] result=new int[temp.length];
  47. for(int i=0;i<temp.length;i++) {
  48. result[i]=temp[i]-48;
  49. }
  50. return result;
  51. }
  52. //将二进制转换成字符
  53. private static char BinstrToChar(String binStr){
  54. int[] temp=BinstrToIntArray(binStr);
  55. int sum=0;
  56. for(int i=0; i<temp.length;i++){
  57. sum +=temp[temp.length-1-i]<<i;
  58. }
  59. return (char)sum;
  60. }
  61. public static String BinstrToStr(String binStr){
  62. String[] tempStr=binStr.split(" ");
  63. char[] tempChar=new char[tempStr.length];
  64. for(int i=0;i<tempStr.length;i++) {
  65. tempChar[i]=BinstrToChar(tempStr[i]);
  66. }
  67. return String.valueOf(tempChar);
  68. }
  69. //十六进制字符串转为byte数组
  70. public static byte[] convertHexStringToByte(String str) {
  71. System.out.println(str);
  72. if(str == null || str.trim().equals("")) {
  73. return new byte[0];
  74. }
  75. byte[] bytes = new byte[str.length() / 2];
  76. for(int i = 0; i < str.length() / 2; i++) {
  77. String subStr = str.substring(i * 2, i * 2 + 2);
  78. bytes[i] = (byte) Integer.parseInt(subStr, 16);
  79. }
  80. return bytes;
  81. }
  82. //打开文件
  83. public static void openVideo() throws IOException {
  84. JFileChooser chooser=new JFileChooser();
  85. int v=chooser.showOpenDialog(null);
  86. if(v==JFileChooser.APPROVE_OPTION){
  87. File file=chooser.getSelectedFile();
  88. ArrayList<String> tmp = new ArrayList();
  89. Scanner sc = new Scanner(file);
  90. while(sc.hasNextLine()){
  91. tmp.add(sc.nextLine());
  92. }
  93. System.out.println("tmp="+tmp);
  94. text = tmp;
  95. //把选择的文件传过去
  96. frame.addmessageleft(text);
  97. }
  98. }
  99. }

 

四、注意事项

(一)、编码问题:不同加密方式产生的字符各不相同,DES等加密算法加密后生成的字符无论是utf-8还是GBK异或是unicode都没办法很好地表示出来。如果直接把DES加密后字符串写到文本中,会出现乱码的问题。于是最终我决定把加密后的信息都转为二进制字符串进行保存,等待需要解密时再转为字符串进行处理。

(二)、JScrollPane必须放在JPanel上面,如果直接放在JFrame的布局上,会出现无法调节JScrollPane大小的问题。

(三)、外部包的导入与生成

外部包的生成:右击要生成外部包的包,选择Export->JAR file

外部包的导入

先把外部包粘贴到lib中

右击要导入的包,选择build path即可。导入成功后我们是可以在Referenced Libraries中看到相应的包的

 

这篇博客只讲了整个系统的架构实现,具体的算法实现涉及的内容太多,这里就不展开讲了。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/900949
推荐阅读
相关标签
  

闽ICP备14008679号