窗体离线Base64加密 解密 需要JDK 支持

Runable jar file     地址:http://pan.baidu.com/s/1hqefLLa    ; 遇到bug 予以告诉 谢谢
//窗体类

package cn.lovly.base64;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class BaseFrame  extends Frame{
    public static void main(String[] args) {
        new BaseFrame();
    }
    
    private Label label=null;
    private TextArea ta=null,ta1=null;
    private Button btkey=null,btNoKey=null;
    private Choice ColorChooser=null;
    public BaseFrame(){
        this.setBounds(600, 150, 300, 280);
        this.setVisible(true);
        //给窗体添加关闭事件
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent arg0) {
                System.exit(0);
            }
        });
        this.setResizable(false);//不可以改变窗体的大小
        Panel p=new Panel();
        
        label=new Label("请输入加密或解密的字符串");
        /*下拉列表*/
        ColorChooser = new Choice();
        ColorChooser.add("GBK");
        ColorChooser.add("UTF-8");
        /*文本域*/
        Panel p1=new Panel();
        ta= new TextArea("请输入加密或解密的字符串", 5, 30);
        ta1= new TextArea("", 5, 30);
        /*按钮*/
        Panel p2=new Panel();
        btkey=new Button("加密");
        btNoKey=new Button("解密");
        /*绑定控件 */
        p.add(label);
        p.add(ColorChooser);
        
        p1.add(ta);
        p1.add(ta1);
        
        p2.add(btkey);
        p2.add(btNoKey);
        
        this.add(p,BorderLayout.NORTH);
        this.add(p1,BorderLayout.CENTER);
        this.add(p2,BorderLayout.SOUTH);
        
        
        ta.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if(ta.getText().equals("请输入加密或解密的字符串"))
                ta.setText("");
            }
        });
        
        btkey.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
            String strKey=ta.getText();
            String encoding=ColorChooser.getSelectedItem();
            String outKey=Base64_Demo.encoding(strKey, encoding);
            ta1.setText(outKey);
            }
        });
        
        btNoKey.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                String strKey=ta.getText();
                String encoding=ColorChooser.getSelectedItem();
                String outNoKey=Base64_Demo.decoding(strKey, encoding);
                ta1.setText(outNoKey);
            }
        });
        
    }
}
// base64类  main方法没有可以去掉  
package cn.lovly.base64;

import java.io.UnsupportedEncodingException;
import java.util.Scanner;

public class Base64_Demo {
    public static void main(String[] args) {
        while(true){
            System.out.println("请输选择:1 加密   2  解密  3 退出  ");
            Scanner input=new Scanner(System.in);
            int isKey=input.nextInt();
            switch (isKey) {
            case 1:
                System.out.println("请输入需要加密的字符串");
                String strKey=input.next();
                System.out.println("请输入采用加密的编码  例如 GBK 或者UTF-8");
                String encoding=input.next();
                System.out.println("加密后的字符串是:["+Base64_Demo.encoding(strKey, encoding)+"]");
                break;
            case 2:
                System.out.println("请输入加密后的字符串");
                String str=input.next();
                System.out.println("请输入采用解密的编码  例如 GBK 或者UTF-8");
                String encoder=input.next();
                System.out.println("解密后的字符串是:["+Base64_Demo.decoding(str, encoder)+"]");
                break;
            default:
                System.exit(0);
                break;
            }
        }
    }
     private  static String base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      /*******************************************加密**********************************************/
      public static  String encoding(String str,String encoding){
          byte bt[]=null;
          try {
            bt=str.getBytes(encoding);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(encoding+"编码错误",e); //捕获异常  
        }  //根据 调用者传过来编码 进行编码     产生 byte[]数组    汉字GBK 占两个字节   UTF-8编码   汉字占三个字节..... 编码不一样产生的 字节不一样  最后的base64编码也不一样
          int count=bt.length/3; //base64 算法是 3个字节转成4个字节   求余运算   能够分成多个3个字节的整数
          int index=bt.length%3;// 求模运算
          StringBuffer sb=new  StringBuffer();
          if(count > 0){  //每三个字节 进行一次 base64编码运算
              for (int i = 0; i < bt.length-index; i+=3) {
                    sb.append(base64.charAt(((bt[i]&0xff) >> 2))); // oxff&bt[i] bt[i]转成整形  也就是4个字节   与0xff 运算   清除高位16个bits 为0
                    sb.append(base64.charAt((((bt[i]&0xff) << 4)|((bt[i+1]&0xff)>>4))&0x3f));
                    sb.append(base64.charAt((((bt[i+1]&0xff) << 2)|((bt[i+2]&0xff) >> 6))&0x3f));
                    sb.append(base64.charAt((bt[i+2]&0xff)&0x3f));
                  }
              add(sb, bt, index);
          }else{
              add(sb, bt, index);
          }
        return sb.toString();
      }
      
      public static void add(StringBuffer sb,byte [] bt,int index){
          if(index > 0){
              if(index == 1){//   1 个字节  假设 1100 1010 
                  sb.append(base64.charAt((bt[bt.length-1]&0xff) >> 2));
                  sb.append(base64.charAt(((bt[bt.length-1]&0xff) << 4) &0x3f));
                  sb.append("=="); // 补一对00 加一个=  
              }
              if(index == 2){//两个字节 
                  sb.append(base64.charAt((bt[bt.length-2]&0xff) >> 2));
                  sb.append(base64.charAt((((bt[bt.length-2]&0xff) << 4)|((bt[bt.length-1]&0xff)>>4))&0x3f));
                  sb.append(base64.charAt(((bt[bt.length-1]&0xff) << 2) &0x3f));
                  sb.append("=");
              }
          }
      }
      /*******************************解密*******************************/
    //代码中的base64_decode_map的作用就是将base64索引中的ASCII字符转换成原始的0-63的数字。
      /* tatic int base64_decode_map[256] = {  
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0   - 15  
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16  - 31  
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, // 32  - 47  
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, // 48  - 63  
    -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, // 64  - 79  
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, // 80  - 95  
    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96  - 111  
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, // 112 - 127  
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 128 - 143  
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 144 - 159   
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 160 - 175  
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 176 - 191  
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 192 - 207  
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 208 - 223  
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 224 - 239  
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 240 - 255  
    };  */
      private static byte [] base64_decode_map=new byte[256];  
      static{
          for (int i = 0; i < 256; i++) {
              base64_decode_map[i]=-1;
        }
          for (int i = 'A'; i <= 'Z'; i++) {
              base64_decode_map[i]=(byte) (i-'A');
        }
          for (int i = 'a'; i <= 'z'; i++) {
              base64_decode_map[i]=(byte) (26+i-'a');
        }
          for (int i = '0'; i <= '9'; i++) {
              base64_decode_map[i]=(byte) (52+i-'0');
        }
          base64_decode_map['+']=62;
          base64_decode_map['/']=63;
          
      }
      public static String decoding(String str,String encoding){
          char []data=str.toCharArray();
          int len=((data.length+3)/4)*3;
          if((data.length > 0)&& (data[data.length-1] == '='))
                  --len;
          if((data.length > 1)&& (data[data.length-2] == '='))
                  --len;
          byte[] out=new byte[len];
          int index=0;
          int shift=0;
          int accum=0;
          for (int i = 0; i < data.length; i++) {
            int value=base64_decode_map[data[i] & 0xff];// data[i]个人感觉 在 和1111 1111进行与运算时 会转成ASCII码里对应的位置 例如 1 会转成49
            if(value > 0)
            {
                accum <<= 6;
                  shift+=6;
                  accum|=value;
                  if(shift >= 8)
                  {
                      shift-=8;
                      out[index++]=(byte) ((accum >> shift) & 0xff); 
                  }
            }
        }
         if (index != out.length)
            throw new Error("miscalculated data length!");
         String outStr=null;
         try {
             outStr=new String(out,0,out.length,encoding);
         } catch (UnsupportedEncodingException e) {
             throw new RuntimeException("创建String错误",e);
        }
        return outStr;
      }
      
      
}

可以打成 run的jar包 需要jdk的支持 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值