📄 myteaa.java
字号:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.*;
public class MyTeaA extends Applet implements ActionListener
{
private final static int[] KEY =
new int[]{11111111,22222222,33333333,44444444 };
String message ;//原信息(待加密信息)
byte[] enMessage ;//加密后的信息
String deMessage ;//解密后的信息
//按钮
private Button reset=new Button("复位");
private Button B1=new Button("加密");
private Button B2=new Button("解密");
//标签
private Label L1=new Label("原信息");
private Label L2=new Label("经过加密后的信息");
private Label L3=new Label("解密后还原的信息");
//文本框
private TextField T1=new TextField("",50);
private TextField T2=new TextField("",50);
private TextField T3=new TextField("",50);
private void setup()
{
add(L1);add(T1);
add(L2);add(T2);
add(L3);add(T3);
add(reset); add(B1); add(B2);
}
public void init()
{
setup();
message=T1.getText(); //将输入在文本框T1的内容赋值给成员变量message
reset.addActionListener(this);//点击复位按钮触发
B1.addActionListener(this); //点击加密按钮触发
B2.addActionListener(this); //点击解密按钮触发
}
//按钮触发事件
public void actionPerformed(ActionEvent e)
{
Object target=e.getSource(); //事件源
message=T1.getText(); //将文本框T1的信息赋值给message
if(target==reset) //如果点击“复位”按钮
handleReset(); //则执行handleReset()方法
else if(target==B1) //点击“加密”按钮
{
enMessage= encryptString(message);//执行加密方法
T2.setText(display(enMessage)); //将加密后的信息显示在文本框T2中
}
else //否则,即点击“解密”按钮
{
deMessage= decryptString(enMessage);//执行解密方法
T3.setText(deMessage); //将解密后的信息(即还原信息)显示在文本框T2中
}
}
//加密任意长度的信息,参数为字符串
private byte[] encryptString(String mess){
byte[] temp = mess.getBytes();
int n = 8 - temp.length % 8;//若temp的位数不足8的倍数,需要填充的位数
byte[] tempEnStr = new byte[temp.length + n];
tempEnStr[0] = (byte)n;
System.arraycopy(temp, 0, tempEnStr, n, temp.length);
byte[] result = new byte[tempEnStr.length];
for(int offset = 0; offset < result.length; offset += 8){
byte[] tempEncrpt = encrypt(tempEnStr, offset, KEY, 32);
System.arraycopy(tempEncrpt, 0, result, offset, 8);
}
return result;
}
//解密任意长度的信息,参数为字节数组
private String decryptString(byte[] message){
byte[] decryptStr = null;
byte[] tempDecrypt = new byte[message.length];
for(int offset = 0; offset < message.length; offset += 8){
decryptStr = decrypt(message, offset, KEY, 32); //调用TEA解密算法
System.arraycopy(decryptStr, 0, tempDecrypt, offset, 8);
}
int n = tempDecrypt[0];
return new String(tempDecrypt, n, decryptStr.length - n);
}
//TEA加密算法,只加密64位信息
public byte[] encrypt(byte[] message, int offset, int[] key, int times){
int[] tempInt = byteToInt(message, offset);
int y = tempInt[0], z = tempInt[1], sum = 0, i;
int delta=0x9e3779b9;
int a = key[0], b = key[1], c = key[2], d = key[3];
for (i = 0; i < times; i++) {
sum += delta;
y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
}
tempInt[0]=y;
tempInt[1]=z;
return intToByte(tempInt, 0);
}
//TEA解密算法,只解密64位信息
public byte[] decrypt(byte[] message, int offset, int[] key, int times){
int[] tempInt = byteToInt(message, offset);
int y = tempInt[0], z = tempInt[1], sum = 0, i;
int delta=0x9e3779b9;
int a = key[0], b = key[1], c = key[2], d = key[3];
if (times == 32)
sum = 0xC6EF3720;
else if (times == 16)
sum = 0xE3779B90;
else
sum = delta * times;
for(i = 0; i < times; i++) {
z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
sum -= delta;
}
tempInt[0] = y;
tempInt[1] = z;
return intToByte(tempInt, 0);
}
//byte[]型数据转成int[]型数据
private int[] byteToInt(byte[] mess, int offset){
int[] result = new int[mess.length >> 2];//右移2位 即 mess.length / 4
for(int i = 0, j = offset; j < mess.length; i++, j += 4){
result[i] = change(mess[j + 3]) | change(mess[j + 2]) << 8 |
change(mess[j + 1]) << 16 | (int)mess[j] << 24;
}
return result;
}
//int[]型数据转成byte[]型数据
private byte[] intToByte(int[] mess, int offset){
byte[] result = new byte[mess.length << 2];//左移2位 mess.length * 4
for(int i = 0, j = offset; j < result.length; i++, j += 4){
result[j + 3] = (byte)(mess[i] & 0xff);
result[j + 2] = (byte)((mess[i] >> 8) & 0xff);
result[j + 1] = (byte)((mess[i] >> 16) & 0xff);
result[j] = (byte)((mess[i] >> 24) & 0xff);
}
return result;
}
//若某字节为负数则需将其转成无符号正数
private static int change(byte temp){
int result = (int)temp;
if(result < 0){
result += 256;
}
return result;
}
//在文本框显示信息
private String display(byte[] m)
{ String k="";
for(byte i : m)
k=k+i+" ";
return k;
}
//复位,将三个文本框的信息清空
private void handleReset()
{
T1.setText("");
T2.setText("");
T3.setText("");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -