0


【密码学】Java课设-文件加密系统(适用于任何文件)

Java实现文件加密解密


前言

文档显示乱码相信大家一定不陌生,一份很喜欢的文档内容/数据,下载到自己电脑上却是这样的

在这里插入图片描述
项目中一些核心程序打开是这样的
在这里插入图片描述
文件加密,不仅可以提高数据安全性,还可以在很大程度上保护个人权益/财产不被侵犯。
本篇文章采用的是对称加密方式,效果如下。
在这里插入图片描述


一、密码学入门

常见的加密方式分为两种,对称加密和非对称加密。

1.对称加密

对称加密简单来说就是两个相同的钥匙开同一把锁。

它符合大多数人的思维逻辑,就好比你们家钥匙可以在门内外实现上锁开锁操作。缺点就是解密是加密的逆过程,知道加密规则立马可以获得解密规则,安全性较低。

对称加密最早使用是在公元前54年,古罗马军事统帅凯撒大帝发明的凯撒密码,在战争中把写在长布条上的情报系在信使的腰上进行传递。
在这里插入图片描述
只有将该布条缠在特定粗细的木棒中,横向观看才能看到传递的真正信息,单截获一个布条很难获取到上面的信息。

在信息传递落后的时代中由于凯撒密码的使用,使得凯撒大帝在战争中占据了先发优势,并赢得了多次胜利。
在这里插入图片描述
但是由于凯撒加密规则过于简单,它仅采用位移加密方式,只对26个字母进行位移替换加密,破译相对简单,最多尝试25次即可破解内容。

即便如此,在一战和二战中对称加密仍然应用非常广泛,编译员使用英文字母,阿拉伯数字,符号进行对称加密。但加密原理不变,破译只需花费更多时间。
在这里插入图片描述
这也就解释了为什么在谍战片中总能看到一群人在不停的计算所有的可能性,利用归纳出的各字符频率来还原密钥
在这里插入图片描述

2.非对称加密

非对称加密简单来说就是两个不同的钥匙开同一把锁。

非对称加密分为公钥和私钥,接发双方各有一个私钥,公钥公开运输。甲将消息“我爱你”利用公钥加密,并附属私钥A加密过的签名运输到乙,乙接到消息用私钥B解密并确认签名正确后则成功接收。
在这里插入图片描述
总结:
1.发送者只需要知道加密密钥;
2.接收者只需要知道解密密钥
3.解密密钥不可以被窃听者获取
4.加密密钥被窃听者获取也不影响信息安全
在这里插入图片描述

通俗来说,对于对称加密方式,直接用密钥传输,破译者更易抢夺密钥,通过暴力破解来获取信息;

而对于非对称加密方式,破译者不易抢夺私钥,并且获取单向私钥无法解开密文,通常采用截取公钥并替换内容,伪装成发送方对接收方进行信息篡改和窃取来达到己方利益。

因此,对于公钥信息的可靠性问题,研究人员提出了私钥数字签名的方式来解决信息传递安全。下图显示的文件就是数字签名的实例。
在这里插入图片描述

生活中最典型的例子就是,淘宝买家和卖家依靠阿里巴巴中间过渡来进行可靠交流。

二、程序代码

1.welcome类(欢迎界面)

设计很简单,一张背景图片,中间添加进入系统按钮,实现如下:

在这里插入图片描述

package 九芒星加密;importjava.awt.Container;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.Image;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.ImageIcon;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;publicclass welcome extendsJFrame{//创建一个容器Container ct;//创建背景面板BackgroundPanel bgp;publicstaticvoidmain(String[] args){newwelcome();}publicwelcome(){
        ct=this.getContentPane();this.setLayout(null);setTitle("九芒星_文件加密/解密工具");
        bgp=newBackgroundPanel((newImageIcon("src/image/welcome.jpg")).getImage());
        bgp.setBounds(0,0,600,400);
        ct.add(bgp);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);JLabel show=newJLabel("欢迎进入九芒星加密系统");JButton in=newJButton("点击进入");    
        in.setFont(newFont("黑体",Font.BOLD,25));
        show.setBounds(250,20,500,50);//组件位置
        show.setFont(newFont("黑体",Font.BOLD,30));Container mk=getContentPane();//获取一个容器
        in.setBounds(230,200,150,50);setBounds(660,340,600,400);
        mk.add(show);
        mk.add(in);setVisible(true);//使窗体可视化
        mk.setLayout(null);
        
        in.addActionListener(newActionListener(){//对注册按钮添加监听事件@SuppressWarnings("deprecation")@OverridepublicvoidactionPerformed(ActionEvent arg0){// TODO Auto-generated method stubnewLog();}});}}classBackgroundPanelextendsJPanel{Image im;publicBackgroundPanel(Image im){this.im=im;this.setOpaque(true);}//Draw the back ground.publicvoidpaintComponent(Graphics g){super.paintComponents(g);
           g.drawImage(im,0,0,this.getWidth(),this.getHeight(),this);}}

2.Log类(登录界面)

添加几个面板,按钮,条件判断用户名和密码正确性(没有连数据库,感兴趣可以自己链接)
注:密码采用密文输入

在这里插入图片描述

package 九芒星加密;importjava.awt.*;importjavax.swing.*;importjava.awt.event.ActionListener;importjava.awt.event.ActionEvent;publicclassLogextendsJFrame{publicLog(){setSize(600,400);//设计窗体的大小this.getContentPane().setBackground(Color.CYAN);//设置窗口背景颜色JLabel title=newJLabel("登录界面");JLabel root=newJLabel("用户名");//实例化JLabel对象        JLabel ps=newJLabel("密码");JTextField rootTXT=newJTextField(15);//实例化用户名文本框        JPasswordField psTXT=newJPasswordField(15);//实例化密码框        
        
        psTXT.setEchoChar('*');//将输入密码框中的密码以*显示出来JButton log=newJButton("登录");JButton register=newJButton("注册");        
        title.setBounds(250,20,500,50);//组件位置
        title.setFont(newFont("黑体",Font.BOLD,30));
        
        root.setBounds(100,100,500,50);//组件位置
        root.setFont(newFont("黑体",Font.BOLD,30));
        
        ps.setBounds(100,170,500,50);//组件位置
        ps.setFont(newFont("黑体",Font.BOLD,30));
        
        log.setFont(newFont("黑体",Font.BOLD,25));
        register.setFont(newFont("黑体",Font.BOLD,25));setTitle("九芒星_文件加密/解密工具");setVisible(true);//使窗体可视化Container mk=getContentPane();//获取一个容器
              
        mk.add(title);
        mk.add(root);
        mk.add(ps);
        mk.add(rootTXT);
        mk.add(psTXT);
        mk.add(log);
        mk.add(register);setBounds(660,340,600,400);
        mk.setLayout(null);
        rootTXT.setBounds(200,100,300,40);
        psTXT.setBounds(200,170,300,40);
        log.setBounds(180,260,100,50);
        register.setBounds(360,260,100,50);
            
        log.addActionListener(newActionListener(){//对确定按钮添加监听事件@SuppressWarnings("deprecation")@OverridepublicvoidactionPerformed(ActionEvent arg0){// TODO Auto-generated method stubif(rootTXT.getText().trim().equals("root")&&newString(psTXT.getPassword()).equals("123456")){//equals函数进行用户名和密码的匹配JOptionPane.showMessageDialog(null,"登录成功,即将进入文件加密系统");newIndex("九芒星_文件加密/解密工具");}elseif(!rootTXT.getText().trim().equals("root")){JOptionPane.showMessageDialog(null,"请输入正确的用户名!");}elseif(newString(psTXT.getPassword()).length()<6||newString(psTXT.getPassword()).length()>6){JOptionPane.showMessageDialog(null,"请输入6位密码!");}else{JOptionPane.showMessageDialog(null,"登录失败,请确认用户名和密码无误");}}});
        register.addActionListener(newActionListener(){//对注册按钮添加监听事件@SuppressWarnings("deprecation")@OverridepublicvoidactionPerformed(ActionEvent arg0){// TODO Auto-generated method stubnewRegister();}});}publicstaticvoidmain(String[] args){newLog();}}

3.Register类(注册界面)

和登录界面类似,由于注册需要数据库支持,我就简单写了一个图形化界面。
是个空架子,各位有兴趣自己发挥!

在这里插入图片描述

package 九芒星加密;importjava.awt.*;importjavax.swing.*;importjava.awt.event.ActionListener;importjava.awt.event.ActionEvent;importjava.sql.*;importjavax.swing.JButton;importjavax.swing.JLabel;importjavax.swing.JPasswordField;importjavax.swing.JTextField;publicclassRegisterextendsJFrame{publicRegister(){setSize(600,400);//设计窗体的大小setTitle("九芒星_文件加密/解密工具");//设置背景图ImageIcon backbround =newImageIcon("./me1.jpg");//将背景图进行压缩,一般如果你想显示一整张图片,就得把大小设置跟窗口一样Image image = backbround.getImage();Image smallImage = image.getScaledInstance(500,500,Image.SCALE_FAST);ImageIcon backbrounds =newImageIcon(smallImage);//将图片添加到JLable标签 JLabel jlabel =newJLabel(backbrounds);//设置标签的大小
        jlabel.setBounds(0,0,getWidth(),getHeight());//将图片添加到窗口add(jlabel);this.getContentPane().setBackground(Color.PINK);//设置窗口背景颜色JLabel root=newJLabel("用户名");//实例化JLabel对象        JLabel ps=newJLabel("密码");JLabel again=newJLabel("再次确认");JTextField rootTXT=newJTextField(15);//实例化用户名文本框        JPasswordField psTXT=newJPasswordField(15);//实例化密码框    JPasswordField againTXT=newJPasswordField(15);//实例化文本框    

        psTXT.setEchoChar('*');JButton log=newJButton("返回");JButton register=newJButton("注册");setVisible(true);Container mk=getContentPane();
        
        mk.add(root);
        mk.add(ps);
        mk.add(again);
        mk.add(rootTXT);
        mk.add(psTXT);
        mk.add(againTXT);
        mk.add(log);
        mk.add(register);setBounds(660,340,600,400);
        mk.setLayout(null);
        root.setBounds(70,50,500,50);//组件位置
        root.setFont(newFont("黑体",Font.BOLD,30));
        
        ps.setBounds(70,120,500,50);//组件位置
        ps.setFont(newFont("黑体",Font.BOLD,30));
        
        again.setBounds(70,190,500,50);//组件位置
        again.setFont(newFont("黑体",Font.BOLD,30));
        
        log.setFont(newFont("黑体",Font.BOLD,25));
        log.setBounds(360,260,100,50);
        
        register.setFont(newFont("黑体",Font.BOLD,25));
        register.setBounds(180,260,100,50);
        
        rootTXT.setBounds(200,50,300,40);
        psTXT.setBounds(200,120,300,40);
        againTXT.setBounds(200,190,300,40);
        
        
        register.addActionListener(newActionListener(){@SuppressWarnings("deprecation")@OverridepublicvoidactionPerformed(ActionEvent arg0){// TODO Auto-generated method stubnewLog();}});
        log.addActionListener(newActionListener(){@SuppressWarnings("deprecation")@OverridepublicvoidactionPerformed(ActionEvent arg0){// TODO Auto-generated method stubnewLog();}});}}

4.Index类(首页界面)

首页设计,很简单,主要是鼠标事件监听。
首页共有五个按钮。加密,解密负责跳转到对应页面,实现文件加密系统的基本功能;通过找回密码按钮可以直接打开存放文件加密密码本的文件;如遇紧急情况,可点击保护隐私按钮,程序将调用计算机外部exe,实现锁屏防偷窥。

在这里插入图片描述

package 九芒星加密;importjavax.swing.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.awt.event.MouseMotionAdapter;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclassIndexextendsJFrameimplementsActionListener{privatestaticfinalint WIDTH =600;privatestaticfinalint HEIGHT =400;privateJPanel mainPanel =newJPanel();privateJButton encryptBtn =newJButton("加密");privateJButton decryptBtn =newJButton("解密");privateJButton myself =newJButton("CSDN——九芒星#");privateJButton fondpw =newJButton("找回密码");privateJButton closenow =newJButton("保护隐私");privateJPanelJPme=newJPanel();privateJPanelJPfondpw=newJPanel();privateJPanelJPclosenow=newJPanel();privateJFrame f1;publicIndex(String title){super(title);this.init();}//初始化publicvoidinit(){JPme.add(myself);JPfondpw.add(fondpw);JPclosenow.add(closenow);
        
        fondpw.addActionListener(this);
        closenow.addActionListener(this);
        
        mainPanel.add(JPme);
        mainPanel.add(JPfondpw);
        mainPanel.add(JPclosenow);this.setPanelFont();this.addElements();this.addListener();this.setFramePosition();}@OverridepublicvoidactionPerformed(ActionEvent e){//调用外部存放密码文件if(e.getSource()== fondpw){this.dispose();OpenPasswordFile();}//调用外部锁屏exeif(e.getSource()== closenow){this.dispose();ProtectPrivacy("E:\\kkkkk\\文件加密解密\\src\\image\\Windows密码锁.exe");}}//设置组件publicvoidsetPanelFont(){int btnWidth = WIDTH/2-20;int btnHeight = HEIGHT -80;
        mainPanel.setLayout(null);//加密按钮
        encryptBtn.setBackground(Color.YELLOW);
        encryptBtn.setFont(newFont("黑体",Font.BOLD,50));
        encryptBtn.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));//手状光标
        encryptBtn.setBounds(10,10,btnWidth,btnHeight);//组件位置//解密按钮
        decryptBtn.setBackground(Color.CYAN);
        decryptBtn.setFont(newFont("黑体",Font.BOLD,50));
        decryptBtn.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        decryptBtn.setBounds(btnWidth+20,10,btnWidth,btnHeight);//九芒星#
        myself.setBackground(Color.PINK);       
        myself.setFont(newFont("黑体",Font.BOLD,20));       
        myself.setBounds(145,335,300,25);//找回密码
        fondpw.setFont(newFont("黑体",Font.BOLD,20));       
        fondpw.setBackground(Color.ORANGE);
        fondpw.setBounds(10,335,120,25);
        fondpw.setMargin(newInsets(0,0,0,0));//保护隐私
        closenow.setBackground(Color.ORANGE);
        closenow.setFont(newFont("黑体",Font.BOLD,20));       
        closenow.setBounds(460,335,120,25);}//添加元素publicvoidaddElements(){
        mainPanel.add(encryptBtn);
        mainPanel.add(decryptBtn);
        mainPanel.add(myself);
        mainPanel.add(fondpw);
        mainPanel.add(closenow);this.add(mainPanel);}//监听publicvoidaddListener(){//加密//鼠标事件监听器
        encryptBtn.addMouseListener(newMouseAdapter(){@OverridepublicvoidmouseClicked(MouseEvent e){//鼠标点击Index.this.setVisible(false);newMajorFR("九芒星_文件加密","加密").init();//加密初始化}@OverridepublicvoidmouseExited(MouseEvent e){//鼠标离开(加密组件区域)
                encryptBtn.setFont(newFont("黑体",Font.BOLD,50));
                encryptBtn.setForeground(Color.BLACK);}});//鼠标运动监听器
        encryptBtn.addMouseMotionListener(newMouseMotionAdapter(){@OverridepublicvoidmouseMoved(MouseEvent e){//鼠标移动(加密组件区域)
                encryptBtn.setFont(newFont("黑体",Font.BOLD,60));
                encryptBtn.setForeground(Color.RED);//组件区域内保持红色}});//解密//鼠标事件监听器
        decryptBtn.addMouseListener(newMouseAdapter(){@OverridepublicvoidmouseClicked(MouseEvent e){//鼠标点击Index.this.setVisible(false);newMajorFR("九芒星_文件解密","解密").init();}@OverridepublicvoidmouseExited(MouseEvent e){//鼠标离开
                decryptBtn.setFont(newFont("黑体",Font.BOLD,50));
                decryptBtn.setForeground(Color.BLACK);}});//鼠标运动监听器
        decryptBtn.addMouseMotionListener(newMouseMotionAdapter(){@OverridepublicvoidmouseMoved(MouseEvent e){//鼠标移动
                decryptBtn.setFont(newFont("黑体",Font.BOLD,60));
                decryptBtn.setForeground(Color.RED);//组件范围内保持绿色}});
        
        myself.addActionListener(newActionListener(){//对注册按钮添加监听事件@SuppressWarnings("deprecation")@OverridepublicvoidactionPerformed(ActionEvent arg0){// TODO Auto-generated method stubnewMe();}});}//打开密码文件publicvoidOpenPasswordFile(){Runtime rn =Runtime.getRuntime();Process p =null;String cmd="rundll32 url.dll FileProtocolHandler file://E:\\kkkkk\\文件加密解密\\src\\image\\otr.txt";try{  
            p = rn.exec(cmd);}catch(Exception e){System.out.println("Error exec!");}}//调用外部exe,实现密码锁屏publicstaticStringProtectPrivacy(String command){Runtime runtime =Runtime.getRuntime();StringBuilder builder =null;try{Process process = runtime.exec("cmd /c start "+ command);BufferedReader brBufferedReader =newBufferedReader(newInputStreamReader(process.getInputStream(),"UTF-8"));String line ="";
            builder =newStringBuilder();while((line = brBufferedReader.readLine())!=null){System.out.println(line);
                builder.append(line);}}catch(IOException e){// TODO Auto-generated catch block
            e.printStackTrace();}return builder.toString();}//窗口位置privatevoidsetFramePosition(){//获得当前屏幕的长宽Dimension screenSize =Toolkit.getDefaultToolkit().getScreenSize();int screenWidth =(int)screenSize.getWidth();int screenHeight =(int)screenSize.getHeight();//组件位置this.setBounds(screenWidth/2-WIDTH/2,screenHeight/2-HEIGHT/2,WIDTH,HEIGHT);/*System.out.println(+screenWidth/2-WIDTH/2);
        System.out.println(+screenHeight/2-HEIGHT/2);
        System.out.println(+WIDTH);
        System.out.println(+HEIGHT);*/this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭this.setResizable(false);this.setVisible(true);}}

5.MajorFR类(加/解密文件操作界面)

加密解密操作界面,两块比较重要:文件导航和监听事件。
文件导航是用的JFileChooser,它提供了一种文件选择机制,可以打开文件,保存文件,很方便,可以自行查看API。

importjavax.swing.JFileChooser()

监听的话相对复杂一些,需要对加密文件的起始地址合法性进行判断,对按钮错误事件的判断提示,对输入密码进行保存等待加密操作等等。

在这里插入图片描述

package 九芒星加密;importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStreamWriter;importjava.io.UnsupportedEncodingException;publicclassMajorFRextendsJFrame{privatestaticfinalint WIDTH =600;privatestaticfinalint HEIGHT =400;privateString option;privateJFileChooser fileSelect;privateJLabel sourceVersion;privateJTextField sourceText;privateJButton sourceButton;privateJLabel aimVersion;privateJTextField aimText;privateJButton aimButton;privateJLabel selectPasswordText;privateJCheckBox selectPassword;privateJTextField inPassword;privateJButton start;privateJPanel panel1;privateJPanel panel2;privateJPanel panel3;privateJPanel panel4;privateJFrame f1;publicMajorFR(String tile,String option){super(tile);this.option = option;}//分页部件初始化privatevoidinitComponent(){//源地址
        fileSelect =newJFileChooser("C:\\");//文件导航窗口
        
        sourceVersion =newJLabel("请选择待"+option+"的文件/文件夹:");//标签
        sourceText =newJTextField(20);//文本输入
        sourceButton =newJButton("···");//选择按钮//目的地址
        aimVersion =newJLabel("请选择"+option+"后文件的存放路径:");//标签
        aimText =newJTextField(20);//文本输入
        aimButton =newJButton("···");//选择按钮//选择密码if(option.equals("加密")){
            selectPasswordText =newJLabel("使用密码"+option);}elseif(option.equals("解密")){
            selectPasswordText =newJLabel("该文件有密码");}if(option.equals("CSDN——九芒星#")){System.out.println("点击成功");}//设置密码
        selectPassword =newJCheckBox();
        inPassword =newJTextField(20);//开始加密/解密
        start =newJButton("开始"+this.option);
        start.setEnabled(false);//初始化四个面板
        panel1 =newJPanel();
        panel2 =newJPanel();
        panel3 =newJPanel();
        panel4 =newJPanel();}//初始化publicvoidinit(){this.initComponent();//分页部件this.setPanelFont();//首页组件this.addElements();//元素this.addListener();//监听this.setFramePosition();//窗口}//监听privatevoidaddListener(){//鼠标监听_源地址按钮
        sourceButton.addMouseListener(newMouseAdapter(){@OverridepublicvoidmouseClicked(MouseEvent e){//鼠标点击
                fileSelect.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);//选择文件或者文件夹
                fileSelect.showDialog(panel1,"请选择要"+option+"的文件/文件夹");File file = fileSelect.getSelectedFile();if(file!=null)
                    sourceText.setText(file.getAbsolutePath());//源地址绝对路经}});//鼠标监听_目的地址按钮
        aimButton.addMouseListener(newMouseAdapter(){@OverridepublicvoidmouseClicked(MouseEvent e){//鼠标点击
                fileSelect.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);//只能选目录,不能选单个文件
                fileSelect.showDialog(panel2,"请选择"+option+"后文件的存放路径");File file = fileSelect.getSelectedFile();if(file!=null){//从0开始索引到最后一个空字符串停止String sourceParent = sourceText.getText().substring(0, sourceText.getText().lastIndexOf("\\"));//                    System.out.println(sourceParent);
                    aimText.setText(file.getAbsolutePath());//目的地址绝对路经//                    System.out.println("--");if(aimText.getText().equals(sourceText.getText())){//原路径不能等于目的路经JOptionPane.showMessageDialog(MajorFR.this,"文件路径选择不合法,请重新选择!");
                        start.setEnabled(false);}else{
                        start.setEnabled(true);}}}});//鼠标监听_开始加密按钮
        start.addMouseListener(newMouseAdapter(){@OverridepublicvoidmouseClicked(MouseEvent e){//鼠标点击//源地址空/源地址文本为空格(空字符串)/目的地址空/目的地址文本为空格(空字符串)//trim:去掉字符串开头和结尾所有空格并返回字符串if(sourceText.getText()==null|| sourceText.getText().trim().equals("")|| aimText.getText()==null|| aimText.getText().trim().equals("")){//提示错误JOptionPane.showMessageDialog(MajorFR.this,"您还没有选择文件呢,请选择您的文件");return;}//地址赋值String sourcePath = sourceText.getText();String objPath = aimText.getText();boolean isEncryp =false;if(option.equals("加密")){
                    isEncryp =true;}elseif(option.equals("解密")){
                    isEncryp =false;}else{JOptionPane.showMessageDialog(MajorFR.this,"程序错误,请重启");}try{FileAction fileSuperOption =newFileAction();//new一个对象,保证每次的isFirstCopy刚开始都是true!!if(inPassword.getText()==null|| inPassword.getText().equals("")){//不使用密码加密/解密
                        fileSuperOption.superCopy(sourcePath, objPath, isEncryp);}else{//使用密码加密/解密
                        fileSuperOption.superCopy(sourcePath, objPath, isEncryp, inPassword.getText());}}catch(Exception ex){JOptionPane.showMessageDialog(MajorFR.this,"路径有误,建议不要手工输入!");}//JOptionPane.showMessageDialog(CoreFrame.this,option+"成功!");int item =JOptionPane.showConfirmDialog(MajorFR.this, option +"成功!是否返回功能首页?");if(item==0){MajorFR.this.setVisible(false);//隐藏当前窗体newIndex("九芒星_文件加密/解密工具");}}});//动作监听器
        selectPassword.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvent e){//事件监听String pw;if(selectPassword.isSelected()){//是否选中密码按钮组件String password =JOptionPane.showInputDialog(MajorFR.this,"请输入密码:");if(password==null||password.equals("")){
                        selectPassword.setSelected(false);}               
                    inPassword.setText(password);
                    pw = password;System.out.println("输入密码为:"+inPassword.getText());//将密码存放在指定TXT文件String path ="E:\\kkkkk\\文件加密解密\\src\\image\\otr.txt";String word = inPassword.getText();BufferedWriter out =null;try{
                        out =newBufferedWriter(newOutputStreamWriter(newFileOutputStream(path,true)));}catch(FileNotFoundException e1){// TODO Auto-generated catch block
                        e1.printStackTrace();}try{
                        out.write("   "+word+"   ");System.out.println();}catch(IOException e2){// TODO Auto-generated catch block
                        e2.printStackTrace();}try{
                        out.close();}catch(IOException e1){// TODO Auto-generated catch block
                        e1.printStackTrace();}System.out.println("密码已存入otr.txt文件中");}else{
                    inPassword.setText("");//                    System.out.println(inPassword.getText());}}});}//添加组件privatevoidaddElements(){
        panel1.add(sourceVersion);//源地址标签面板
        panel1.add(sourceText);//源地址文本框面板
        panel1.add(sourceButton);//源地址按钮面板
        panel2.add(aimVersion);//目的地址标签面板
        panel2.add(aimText);//目的地址文本框面板
        panel2.add(aimButton);//目的地址按钮面板
        panel3.add(selectPassword);//选中密码按钮面板
        panel3.add(selectPasswordText);//选中密码文本面板
        panel3.add(inPassword);//输入密码面板
        panel4.add(start);//开始加(解)密按钮面板this.add(panel1);this.add(panel2);this.add(panel3);this.add(panel4);}//首页组件privatevoidsetPanelFont(){this.setLayout(null);//绝对布局this.panel1.setBounds(20,20,500,50);this.panel2.setBounds(20,120,500,50);this.panel3.setBounds(20,220,500,50);this.inPassword.setVisible(false);this.panel4.setBounds(20,300,500,50);}privatevoidsetFramePosition(){//获得当前屏幕的长宽Dimension screenSize =Toolkit.getDefaultToolkit().getScreenSize();int screenWidth =(int)screenSize.getWidth();int screenHeight =(int)screenSize.getHeight();//组件位置this.setBounds(screenWidth/2-WIDTH/2,screenHeight/2-HEIGHT/2,WIDTH,HEIGHT);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setResizable(false);this.setVisible(true);}}

6.FileAction类(加密算法)

加密算法为对称加密,自动加索引号并首尾调换位置,可以彻底打乱字节排列顺序,进而产生乱码

举个简单例子,对原始数据89进行加密,很简单,自己参照ASCII表,可以根据加密内容反推原始数据。

在这里插入图片描述

对汉字加密,涉及比较复杂。由于字节类型取值范围是-128-127,而UTF-8把Unicode国际编码为0800到FFFF的字符用3字节表示,中文在4E00到9FBF区间内,所以本次加密采用的是三字节表示一个汉字。

在这里插入图片描述

感兴趣的朋友可以查找对应汉字中文编码,反推数据。对于不深入研究密码学的朋友们来说,意义不大。这里我展示一些汉字中文编码,以供参考。在这里插入图片描述

言归正传,以下是算法实现

package 九芒星加密;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjavax.swing.ImageIcon;publicclassFileAction{privateboolean isFirstCopy =true;privateboolean goThrough =false;privateString password =null;publicvoidsuperCopy(String path,String objPath,boolean opFlag,String...passArgs){if(passArgs.length==1){
            goThrough =true;
            password = passArgs[0];}File file =newFile(path);String historyFileName = file.getName();//首次操作且文件名为1if(isFirstCopy && file.isFile()){//获取前缀String prefix = historyFileName.substring(0, historyFileName.lastIndexOf("."));//获取后缀String suffix = historyFileName.substring(historyFileName.lastIndexOf("."));//加密if(opFlag)if(historyFileName.contains("解密版"))
                    historyFileName = historyFileName.replace("解密版","加密版");else
                    historyFileName = prefix.concat("(加密版)").concat(suffix);//解密if(!opFlag)if(historyFileName.contains("加密版"))
                    historyFileName = historyFileName.replace("加密版","解密版");else
                    historyFileName = prefix.concat("(解密版)").concat(suffix);
            isFirstCopy =false;}//首次操作且路经为1if(isFirstCopy && file.isDirectory()){if(opFlag){if(historyFileName.contains("解密版"))
                    historyFileName = historyFileName.replace("解密版","加密版");else
                    historyFileName = historyFileName.concat("(加密版)");}if(!opFlag)if(historyFileName.contains("加密版"))
                    historyFileName = historyFileName.replace("加密版","解密版");else
                    historyFileName = historyFileName.concat("(解密版)");
            isFirstCopy =false;}String newFilePath = objPath+"\\"+historyFileName;File objFile =newFile(newFilePath);File[] lists = file.listFiles();//若list没有地址,在堆内不存在if(lists!=null){//说明它是一个文件夹
            objFile.mkdir();//在目标路径创建好空的文件夹//若堆内有list且不为空if(lists.length!=0){//遍历list地址for(File f:lists){superCopy(f.getAbsolutePath(),objFile.getAbsolutePath(),opFlag);}}//list在堆内存在,说明它是一个文件}else{//节点流(直接作用于文件)FileInputStream fis =null;FileOutputStream fos =null;try{
                fis =newFileInputStream(file);
                fos =newFileOutputStream(objFile);byte[] bytes =newbyte[1024];int count = fis.read(bytes);//文件流对文件夹进行递归while(count!=-1){//递归整个文件夹//加密if(opFlag){if(count==bytes.length){if(goThrough)
                                fos.write(FileAction.encryptionByPass(bytes,password));//密码加密else
                                fos.write(FileAction.encryption(bytes));//普通加密}else{//拷贝文件byte[] b =newbyte[count];for(int i =0;i<b.length;i++){
                                b[i]= bytes[i];}if(goThrough)
                                fos.write(FileAction.encryptionByPass(b,password));else
                                fos.write(FileAction.encryption(b));}//解密}else{if(count==bytes.length){if(goThrough)
                                fos.write(FileAction.decryptionByPass(bytes,password));else
                                fos.write(FileAction.decryption(bytes));}else{//还原文件byte[] b =newbyte[count];for(int i =0;i<b.length;i++){
                                b[i]= bytes[i];}if(goThrough)
                                fos.write(FileAction.decryptionByPass(b,password));else
                                fos.write(FileAction.decryption(b));}}
                    fos.flush();//清空缓冲区数据,保证缓冲清空输出
                    count = fis.read(bytes);}}catch(IOException e){
                e.printStackTrace();}finally{try{if(fis!=null){
                        fis.close();}}catch(IOException e){
                    e.printStackTrace();}try{if(fos!=null){
                        fos.close();}}catch(IOException e){
                    e.printStackTrace();}}}}//加密算法privatestaticbyte[]encryption(byte[] bytes){System.out.println("字节总长:"+bytes.length);System.out.println();//每一个字节的值,都加上它的索引号for(int i =0;i<bytes.length;i++){System.out.println("初始bytes["+i+"]:"+bytes[i]+"    加密后bytes["+i+"]:"+(bytes[i]+i));
            bytes[i]=(byte)(bytes[i]+i);}//交换第一个字节和最后一个字节的位置byte temp = bytes[0];
        bytes[0]= bytes[bytes.length-1];
        bytes[bytes.length-1]= temp;System.out.println();return bytes;}//解密算法(加密的逆)privatestaticbyte[]decryption(byte[] bytes){System.out.println("字节总长:"+bytes.length);System.out.println();//字节首尾交换位置byte temp = bytes[0];
        bytes[0]= bytes[bytes.length-1];
        bytes[bytes.length-1]= temp;//每一个字节的值,都减去它的索引号for(int i =0;i<bytes.length;i++){System.out.println("初始bytes["+i+"]:"+bytes[i]+"    加密后bytes["+i+"]:"+(bytes[i]-i));
            bytes[i]=(byte)(bytes[i]-i);}System.out.println();return bytes;}//密码加密算法publicstaticbyte[]encryptionByPass(byte[] bytes,String password){byte[] passBytes =encryptionPass(password);//每个字节对整体长度取模System.out.println("字节总长:"+bytes.length);System.out.println();for(int i =0;i<bytes.length;i++){System.out.println("初始bytes["+i+"]:"+bytes[i]+"   →   加密后bytes["+i+"]:"+(byte)(bytes[i]+passBytes[i%passBytes.length]));
            bytes[i]=(byte)(bytes[i]+passBytes[i%passBytes.length]);System.out.println("bytes["+i+"]对应密码长度索引号:"+i%passBytes.length);System.out.println("bytes["+i+"]对应密码索引内容:"+passBytes[i%passBytes.length]);System.out.println("---------------------------");}//字节首尾交换位置byte temp = bytes[0];
        bytes[0]= bytes[bytes.length-1];
        bytes[bytes.length-1]= temp;System.out.println();System.out.println();return bytes;}//密码解密算法publicstaticbyte[]decryptionByPass(byte[] bytes,String password){byte[] passBytes =encryptionPass(password);//字节首尾交换位置byte temp = bytes[0];
        bytes[0]= bytes[bytes.length-1];
        bytes[bytes.length-1]= temp;//每个字节对整体长度取模for(int i =0;i<bytes.length;i++){System.out.println("初始bytes["+i+"]:"+bytes[i]+"   →   解密后bytes["+i+"]:"+(byte)(bytes[i]-passBytes[i%passBytes.length]));
            bytes[i]=(byte)(bytes[i]-passBytes[i%passBytes.length]);System.out.println("bytes["+i+"]对应密码长度索引号:"+i%passBytes.length);System.out.println("bytes["+i+"]对应密码索引内容:"+passBytes[i%passBytes.length]);System.out.println("---------------------------");}return bytes;}//使用加密算法,对密码进行二次加密,提高安全性privatestaticbyte[]encryptionPass(String password){byte[] passBytes = password.getBytes();//System.out.println("已经二次加密");return passBytes;//return encryption(encryption(passBytes));}publicstaticvoidmain(String[] args){FileAction fso =newFileAction();String historyFile ="F:\\第一层\\第二层(加密版)";String newFile ="F:\\第一层";String password ="123456";
        fso.superCopy(historyFile,newFile,false,password);//加密}}

7.Me类(九芒星的博客)

展示相关信息,关注我,获取更多知识。

package 九芒星加密;importjava.awt.Container;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.Image;importjavax.swing.ImageIcon;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;publicclassMeextendsJFrame{//创建一个容器Container cx;//创建背景面板BackgroundPanel bg;publicstaticvoidmain(String[] args){newMe();}publicMe(){
        
        cx=this.getContentPane();this.setLayout(null);setTitle("九芒星_文件加密/解密工具");
        
        bg=newBackgroundPanel((newImageIcon("src/image/me.jpg")).getImage());
        bg.setBounds(0,0,419,366);
        cx.add(bg);setBounds(660,340,440,400);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}}class BG extendsJPanel{Image i;publicBG(Image i){this.i=i;this.setOpaque(true);}publicvoidpaintComponent(Graphics g){super.paintComponents(g);
           g.drawImage(i,0,0,this.getWidth(),this.getHeight(),this);}}

以下是加密效果,对于图片,文字,音频,视频文件都适用。

在这里插入图片描述

注:首页中右下角保护隐私按钮,调用的是外部程序,谨慎使用,需要该锁屏程序在评论区留言,私发。

以下是保护隐私按钮的效果图

在这里插入图片描述


本文转载自: https://blog.csdn.net/weixin_48701521/article/details/124163142
版权归原作者 九芒星# 所有, 如有侵权,请联系我们删除。

“【密码学】Java课设-文件加密系统(适用于任何文件)”的评论:

还没有评论