⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myteaa.java

📁 TEA算法的JAVA实现,图形化运行界面
💻 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 + -