异或加密

异或加密

异或加密是一种很简单的加密算法。

  • 原理:根据异或的运算规则,在二进制中,相同为0,不同为1。
  • 且:某个数与0异或等于这个数的本身,与1异或等于这个数的相反。
  • 特性:异或运算具有可逆性。
    即:若a xor b=c,则有b xor c=a (a,b,c分别表示0或1)

由上式可得,若a是发送方想要加密的明文信息,则设置一个密钥b,对a和b做异或运算,得到的c就是加密后的密文信息,可进行传输。接收方得到密文信息c后,只需要再与密钥b做异或运算,即可得到原明文信息a。


代码

第一版

  • 实现使用异或运算对字符串进行加解密。
  • 未实现密钥可以使用各种可打印字符。局限:输入的密钥与明文信息字符数必须相同,否则报错。 【因为str.charAt(i)和key.charAt(i)是同一个i】
import java.util.Scanner;

public class xor {
    public static void main(String[] args) {
        System.out.println("请输入要加密的明文信息:");
        Scanner M = new Scanner(System.in);
        String str = M.nextLine();//原明文信息

        System.out.println("请输入密钥:");
        Scanner K = new Scanner(System.in);
        String key = K.nextLine();//密钥

        StringBuffer str2 = new StringBuffer();  //存储加密后的密文信息
        StringBuffer str3 = new StringBuffer();  //存储解密后的明文信息

        //加密过程
        for(int i=0;i<str.length();i++)
        {
            char c = (char)(str.charAt(i) ^ (char)(key.charAt(i)));
            str2.append(c);
        }
        //解密过程
        for(int i=0;i<str2.length();i++)
        {
            char a = (char)(str2.charAt(i) ^ (char)(key.charAt(i)));
            str3.append(a);
        }
        
        System.out.println("原始 的明文信息为:" + str);
        System.out.println("您输入的 密钥 为:" + key);
        System.out.println("加密后 的密文信息为:" + str2);
        System.out.println("解密后 的明文信息为:" + str3);
    }
}

1.2.png
1.png

第二版

  • 实现使用异或运算对字符串进行加解密。
  • 实现密钥可以使用各种可打印字符。限制密钥长度小于明文长度,且输入的密钥字符数可以与明文字符数不相同。
import java.util.Scanner;

public class xor {
    public static void main(String[] args) {
        System.out.println("请输入要加密的明文信息:");
        Scanner M = new Scanner(System.in);
        String str = M.nextLine();//原明文信息

        System.out.println("请输入密钥:");
        Scanner K = new Scanner(System.in);
        String key = K.nextLine();//密钥

        StringBuilder str2 = new StringBuilder();  //存储加密后的密文信息
        StringBuilder str3 = new StringBuilder();  //存储解密后的明文信息

        //加密过程
        if(str.length() >= key.length()){
            for(int i=0;i<str.length();i++)
            {
                char c = (char)(str.charAt(i) ^ (key.charAt(i%key.length())));
                str2.append(c);
            }
        }
        else{
            System.out.println("警告:密钥长度应小于明文长度!");
            return;
        }
        //解密过程
        for(int i=0;i<str2.length();i++)
        {
            char a = (char)(str2.charAt(i) ^ (key.charAt(i%key.length())));
            str3.append(a);
        }

        System.out.println("原始 的明文信息为:" + str);
        System.out.println("您输入的 密钥 为:" + key);
        System.out.println("加密后 的密文信息为:" + str2);
        System.out.println("解密后 的明文信息为:" + str3);
    }
}

2.png
3.png

第三版

整理函数

import java.util.Scanner;
import javax.swing.*;

public class xor {
    public static String ED_ALG(String M,String K){ //加密算法
        StringBuffer Dec = new StringBuffer();
        if(M.length() >= K.length()){
            for(int i=0;i<M.length();i++) {
                char c = (char)(M.charAt(i) ^ (K.charAt(i%K.length())));
                Dec.append(c);
            }
            String D = Dec.toString();
            return D;
        } else{
            System.out.println("警告:密钥长度应小于明文长度!");
            JOptionPane.showMessageDialog(null, "密钥长度应小于明文长度!!", "警告:", JOptionPane.ERROR_MESSAGE);
            return "";
        }
    }

    public static void main(String[] args) {
        System.out.println("请输入要加密的明文信息:");
        Scanner M = new Scanner(System.in);
        String str = M.nextLine();//原明文信息

        System.out.println("请输入密钥:");
        Scanner K = new Scanner(System.in);
        String key = K.nextLine();//密钥

        String str2 = ED_ALG(str,key);  //存储加密后的密文信息
        String str3 = ED_ALG(str2,key);  //存储解密后的明文信息

        System.out.println("原始 的明文信息为:" + str);
        System.out.println("您输入的 密钥 为:" + key);
        System.out.println("加密后 的密文信息为:" + str2);
        System.out.println("解密后 的明文信息为:" + str3);
    }
}

第四版

构建用户界面。

import javax.swing.*;
import java.awt.event.*;


public class GUI {
    public static void main(String[] args) {
        JFrame f = new JFrame("字符串加/解密"); // 创建窗体对象,设置窗体标题
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭
        f.setBounds(400, 200, 400, 300);// 设置窗体大小,设置窗体位置

        JPanel panel = new JPanel();
        f.add(panel);
        placeComponents(panel);//调用并添加组件到面板
        f.setVisible(true);//设置让窗体可见
    }

    private static void placeComponents(JPanel panel1){
        //创建JLabel
        panel1.setLayout(null);
        JLabel mesLabel = new JLabel("请输入原始信息:");
        mesLabel.setBounds(20,20,150,25);
        panel1.add(mesLabel);
        JLabel keyLabel = new JLabel("请输入密钥:");
        keyLabel.setBounds(20,60,150,25);
        panel1.add(keyLabel);

        //创建文本域用于用户输入
        //请输入原始信息
        JTextField messText = new JTextField();
        messText.setBounds(140,20,220,25);
        panel1.add(messText);
        //请输入密钥
        JTextField keyText = new JTextField();
        keyText.setBounds(140,60,220,25);
        panel1.add(keyText);

        //创建加密 解密按钮
        JButton encBut = new JButton("加密");
        JButton decBut = new JButton("解密");
        encBut.setBounds(50,100,100,25);
        decBut.setBounds(230,100,100,25);
        panel1.add(encBut);
        panel1.add(decBut);

        JLabel resLabel = new JLabel("输出:");
        resLabel.setBounds(20,140,150,25);
        panel1.add(resLabel);

        encBut.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JLabel mes = new JLabel();
                mes.setText("原始信息为:" + messText.getText());
                mes.setBounds(20,160,150,25);
                panel1.add(mes);
                JLabel key = new JLabel();
                key.setText("密钥为:" + keyText.getText());
                key.setBounds(20,180,150,25);
                panel1.add(key);
                JLabel En = new JLabel();
                En.setText("加密后的信息为:" + xor.ED_ALG(messText.getText(),keyText.getText()));
                En.setBounds(20,200,150,25);
                panel1.add(En);
                JLabel De = new JLabel();
                De.setText("解密后的信息为:" + xor.ED_ALG(xor.ED_ALG(messText.getText(),keyText.getText()),keyText.getText()));
                De.setBounds(20,220,150,25);
                panel1.add(De);

                panel1.updateUI();

            }
        });
        decBut.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JLabel mes = new JLabel();
                mes.setText("原始信息为:" + messText.getText());
                mes.setBounds(20,160,150,25);
                panel1.add(mes);
                JLabel key = new JLabel();
                key.setText("密钥为:" + keyText.getText());
                key.setBounds(20,180,150,25);
                panel1.add(key);
                JLabel res = new JLabel();
                res.setText("加/解密后的信息为:" + xor.ED_ALG(messText.getText(),keyText.getText()));
                res.setBounds(20,200,150,25);
                panel1.add(res);

                panel1.updateUI();
            }
        });
    }
}

4.png

posted @ 2020-11-07 16:14  小朋君  阅读(551)  评论(0编辑  收藏  举报