异或加密
异或加密是一种很简单的加密算法。
- 原理:根据异或的运算规则,在二进制中,相同为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);
}
}
第二版
- 实现使用异或运算对字符串进行加解密。
- 实现密钥可以使用各种可打印字符。限制密钥长度小于明文长度,且输入的密钥字符数可以与明文字符数不相同。
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);
}
}
第三版
整理函数
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();
}
});
}
}