javaGUI案例--rsaTool (rsa加解密图形化工具)

本篇,我们尝试使用java开发一个图形化小工具(rsaTool)。 

最终运行效果如下:   界面最上方有4个tab标签, 这4个标签页中分别实现了rsa加密、解密、签名、验签的功能。

 

下面我们来具体介绍下项目代码开发过程。

此项目使用的IDE是spring STS ,由于开发的是GUI程序,我们可以先安装一款可视化编辑器工具windowbuilder ,安装步骤如图:

在 help--》eclipse Marketplace --》search  --》windowbuilder--》  安装 即可。

new一个java工程,起名为rsaTool。 

java开发人员,无论开发什么都必须面向对象,对整个项目进行MVC划分。

img :图标资源

model: 模型层 ,java实体bean,业务bean等。

view :视图层,主要是JFrame 窗体等

 

由于RSA加解密需要依赖包 bcprov-jdk16-1.46.jar ,故需要在项目根目录中新建一个lib目录,将bcprov-jdk16-1.46.jar放入lib目录中并加入classpath 中。

 

ok,我们先来看看model 模型层 : 有两个工具类,一个业务类。

Base64.java

package com.tingcream.rsaTool.model;

public final class Base64 {

    static private final int     BASELENGTH           = 128;
    static private final int     LOOKUPLENGTH         = 64;
    static private final int     TWENTYFOURBITGROUP   = 24;
    static private final int     EIGHTBIT             = 8;
    static private final int     SIXTEENBIT           = 16;
    static private final int     FOURBYTE             = 4;
    static private final int     SIGN                 = -128;
    static private final char    PAD                  = '=';
    static private final boolean fDebug               = false;
    static final private byte[]  base64Alphabet       = new byte[BASELENGTH];
    static final private char[]  lookUpBase64Alphabet = new char[LOOKUPLENGTH];

    static {
        for (int i = 0; i < BASELENGTH; ++i) {
            base64Alphabet[i] = -1;
        }
        for (int i = 'Z'; i >= 'A'; i--) {
            base64Alphabet[i] = (byte) (i - 'A');
        }
        for (int i = 'z'; i >= 'a'; i--) {
            base64Alphabet[i] = (byte) (i - 'a' + 26);
        }

        for (int i = '9'; i >= '0'; i--) {
            base64Alphabet[i] = (byte) (i - '0' + 52);
        }

        base64Alphabet['+'] = 62;
        base64Alphabet['/'] = 63;

        for (int i = 0; i <= 25; i++) {
            lookUpBase64Alphabet[i] = (char) ('A' + i);
        }

        for (int i = 26, j = 0; i <= 51; i++, j++) {
            lookUpBase64Alphabet[i] = (char) ('a' + j);
        }

        for (int i = 52, j = 0; i <= 61; i++, j++) {
            lookUpBase64Alphabet[i] = (char) ('0' + j);
        }
        lookUpBase64Alphabet[62] = (char) '+';
        lookUpBase64Alphabet[63] = (char) '/';

    }

    private static boolean isWhiteSpace(char octect) {
        return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
    }

    private static boolean isPad(char octect) {
        return (octect == PAD);
    }

    private static boolean isData(char octect) {
        return (octect < BASELENGTH && base64Alphabet[octect] != -1);
    }

    
    
    
    public static String encodeFromStr(String str){
    	return     encode(str.getBytes());
    }
    /**
     * Encodes hex octects into Base64
     * @param binaryData Array containing binaryData
     * @return Encoded Base64 array
     */
    public static String encode(byte[] binaryData) {

        if (binaryData == null) {
            return null;
        }

        int lengthDataBits = binaryData.length * EIGHTBIT;
        if (lengthDataBits == 0) {
            return "";
        }

        int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
        int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
        int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;
        char encodedData[] = null;

        encodedData = new char[numberQuartet * 4];

        byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;

        int encodedIndex = 0;
        int dataIndex = 0;
        if (fDebug) {
            System.out.println("number of triplets = " + numberTriplets);
        }

        for (int i = 0; i < numberTriplets; i++) {
            b1 = binaryData[dataIndex++];
            b2 = binaryData[dataIndex++];
            b3 = binaryData[dataIndex++];

            if (fDebug) {
                System.out.println("b1= " + b1 + ", b2= " + b2 + ", b3= " + b3);
            }

            l = (byte) (b2 & 0x0f);
            k = (byte) (b1 & 0x03);

            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
            byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
            byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);

            if (fDebug) {
                System.out.println("val2 = " + val2);
                System.out.println("k4   = " + (k << 4));
                System.out.println("vak  = " + (val2 | (k << 4)));
            }

            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
            encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
            encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];
            encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];
        }

        // form integral number of 6-bit groups
        if (fewerThan24bits == EIGHTBIT) {
            b1 = binaryData[dataIndex];
            k = (byte) (b1 & 0x03);
            if (fDebug) {
                System.out.println("b1=" + b1);
                System.out.println("b1<<2 = " + (b1 >> 2));
            }
            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
            encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];
            encodedData[encodedIndex++] = PAD;
            encodedData[encodedIndex++] = PAD;
        } else if (fewerThan24bits == SIXTEENBIT) {
            b1 = binaryData[dataIndex];
            b2 = binaryData[dataIndex + 1];
            l = (byte) (b2 & 0x0f);
            k = (byte) (b1 & 0x03);

            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
            byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);

            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
            encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
            encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];
            encodedData[encodedIndex++] = PAD;
        }

        return new String(encodedData);
    }

    public static String decodeToStr(String encoded){
    	return new String(decode(encoded));
    }
    
    /**
     * Decodes Base64 data into octects
     *
     * @param encoded string containing Base64 data
     * @return Array containind decoded data.
     */
    public static byte[] decode(String encoded) {

        if (encoded == null) {
            return null;
        }

        char[] base64Data = encoded.toCharArray();
        // remove white spaces
        int len = removeWhiteSpace(base64Data);

        if (len % FOURBYTE != 0) {
            return null;//should be divisible by four
        }

        int numberQuadruple = (len / FOURBYTE);

        if (numberQuadruple == 0) {
            return new byte[0];
        }

        byte decodedData[] = null;
        byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
        char d1 = 0, d2 = 0, d3 = 0, d4 = 0;

        int i = 0;
        int encodedIndex = 0;
        int dataIndex = 0;
        decodedData = new byte[(numberQuadruple) * 3];

        for (; i < numberQuadruple - 1; i++) {

            if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))
                || !isData((d3 = base64Data[dataIndex++]))
                || !isData((d4 = base64Data[dataIndex++]))) {
                return null;
            }//if found "no data" just return null

            b1 = base64Alphabet[d1];
            b2 = base64Alphabet[d2];
            b3 = base64Alphabet[d3];
            b4 = base64Alphabet[d4];

            decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
            decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
            decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
        }

        if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) {
            return null;//if found "no data" just return null
        }

        b1 = base64Alphabet[d1];
        b2 = base64Alphabet[d2];

        d3 = base64Data[dataIndex++];
        d4 = base64Data[dataIndex++];
        if (!isData((d3)) || !isData((d4))) {//Check if they are PAD characters
            if (isPad(d3) && isPad(d4)) {
                if ((b2 & 0xf) != 0)//last 4 bits should be zero
                {
                    return null;
                }
                byte[] tmp = new byte[i * 3 + 1];
                System.arraycopy(decodedData, 0, tmp, 0, i * 3);
                tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
                return tmp;
            } else if (!isPad(d3) && isPad(d4)) {
                b3 = base64Alphabet[d3];
                if ((b3 & 0x3) != 0)//last 2 bits should be zero
                {
                    return null;
                }
                byte[] tmp = new byte[i * 3 + 2];
                System.arraycopy(decodedData, 0, tmp, 0, i * 3);
                tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
                tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
                return tmp;
            } else {
                return null;
            }
        } else { //No PAD e.g 3cQl
            b3 = base64Alphabet[d3];
            b4 = base64Alphabet[d4];
            decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
            decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
            decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);

        }

        return decodedData;
    }

    /**
     * remove WhiteSpace from MIME containing encoded Base64 data.
     *
     * @param data  the byte array of base64 data (with WS)
     * @return      the new length
     */
    private static int removeWhiteSpace(char[] data) {
        if (data == null) {
            return 0;
        }

        // count characters that's not whitespace
        int newSize = 0;
        int len = data.length;
        for (int i = 0; i < len; i++) {
            if (!isWhiteSpace(data[i])) {
                data[newSize++] = data[i];
            }
        }
        return newSize;
    }
}

RSA.java

package com.tingcream.rsaTool.model;

import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import org.bouncycastle.jce.provider.BouncyCastleProvider; 
 

public class RSA {
  
	
	private static String RSA_JAVA = "RSA/None/PKCS1Padding";
	public static final String  SIGN_ALGORITHMS = "SHA1WithRSA";
	
 
	
	/**
	 * 通过rsa私钥字符串    创建RSA私钥对象
	 */
	public static RSAPrivateKey getPrivateKeyFromStr(String privatekeyStr) {
		try {
			    byte[] buffer = Base64.decode(privatekeyStr);
			    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
			    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			    RSAPrivateKey privatekey = (RSAPrivateKey)keyFactory.generatePrivate(keySpec);
			    return privatekey;
		} catch (Exception e) {
			 e.printStackTrace();
		   throw new RuntimeException("RSA私钥文件已损坏");
		}
	  
	 }
	
	/**
	 * 通过rsa公钥字符串    创建RSA公钥对象
	 */
	  public static  RSAPublicKey getPublickeyFromStr(String publickeyStr)  {
		  try {
			  byte[] buffer = Base64.decode(publickeyStr);
			    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
			    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			    RSAPublicKey publickey = (RSAPublicKey)keyFactory.generatePublic(keySpec);
			    return publickey;
		} catch (Exception e) {
             e.printStackTrace();
			throw new RuntimeException("RSA公钥文件已损坏");
		}
	   
	  }
	 
	  /**
	   * rsa 加密方法
	   *  入参 rsa公钥 、待加密内容
	   */
	  public static String encrypt(RSAPublicKey publicKey, String content)   {
		    if(content==null){
		    	return "";
		    }
		    if (publicKey == null) {
		       throw new RuntimeException("publickey 值不能为空");
		    }
		    Cipher cipher = null;
		    try {
		      cipher = Cipher.getInstance(RSA_JAVA, new BouncyCastleProvider());
		      cipher.init(1, publicKey);
		      byte[] binaryData = cipher.doFinal(content.getBytes("utf-8"));
		      String str = Base64.encode(binaryData);
		      return str;
		    } catch (Exception e) {
		    	 throw new RuntimeException(e);
		    }
		  }
	  
	 
	  
	  /**
       * rsa 解密方法
       * rsa私钥、密文字符串  (密文编码默认utf8)
       */
	  public static  String decrypt(RSAPrivateKey privateKey, String cipherContent)  {
		  if(cipherContent==null){
			  return "";
		  }
	    byte[] data = Base64.decode(cipherContent);

	    if (privateKey == null) {
	      throw new RuntimeException("privateKey 不能为空");
	    }
	    Cipher cipher = null;
	    try {
	      cipher = Cipher.getInstance(RSA_JAVA, new BouncyCastleProvider());
	      cipher.init(2, privateKey);
	      byte[] output = cipher.doFinal(data);
	      String str = Base64.encode(output);
	      String text = new String(Base64.decode(str), "utf-8");
	      return text;
	    } catch (NoSuchAlgorithmException e) {
	       throw new RuntimeException("无此解密算法"); 
	       } 
	    catch (Exception e) {
	    	 throw new RuntimeException("密文数据已损坏");
	    }
	  }
	 
		
		/**
		* RSA验签名检查
		* @param content 待签名数据
		* @param sign 签名值
		* @param pubKey rsa公钥
		* @return 布尔值
		*/
		public static boolean verify(String content, String sign, PublicKey pubKey)
		{
			try 
			{ 
				java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
				signature.initVerify(pubKey);
				signature.update( content.getBytes("utf-8") );
				boolean bverify = signature.verify( Base64.decode(sign) ); 
				return bverify;
			} 
			catch (Exception e) 
			{
				e.printStackTrace();
			}
			return false;
		}
	 
	   /**
		* RSA签名
		* @param content 待签名数据
		* @param privateKey 商户私钥
		* @param input_charset 编码格式
		* @return 签名值
		*/
		public static String sign(String content,   PrivateKey priKey )
		{
	        try 
	        {
	            java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);

	            signature.initSign(priKey);
	            signature.update( content.getBytes("utf-8") );

	            byte[] signed = signature.sign();
	            
	            return Base64.encode(signed);
	        }
	        catch (Exception e) 
	        {
	        	e.printStackTrace();
	        }
	        
	        return "";
	    }
		  
		  
}


RSAHelper.java

package com.tingcream.rsaTool.model;

import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
/**
 * RSA 辅助类
 * @author jelly
 *
 */
public class RSAHelper {
	 
	/**
	 * rsa 加密     (公钥加密)
	 * @param content  明文内容
	 * @param rsaPublickeyStr  公钥字符串
	 * @return  加密结果
	 */
	public   String rsaEncrypt(String content ,String rsaPublickeyStr) {
	    RSAPublicKey rsaPublicKey=	RSA.getPublickeyFromStr(rsaPublickeyStr);
	   return  RSA.encrypt(rsaPublicKey, content);
		 
	}
	/**
	 * rsa 解密  (私钥解密)
	 * @param cipherContent 密文内容
	 * @param rsaPrivatekeyStr 私钥字符串
	 * @return 解密结果
	 */
	public   String rsaDecrypt(String cipherContent ,String rsaPrivatekeyStr) {
		RSAPrivateKey  rsaPrivateKey = RSA.getPrivateKeyFromStr(rsaPrivatekeyStr);
		return RSA.decrypt(rsaPrivateKey, cipherContent);
	}
	
	/**
	 * rsa 签名  (私钥签名)
	 * @param content  明文内容
	 * @param rsaPrivatekeyStr 私钥字符串
	 * @return 签名结果
	 */
	public  String rsaSign (String content ,String rsaPrivatekeyStr ) {
		
		 RSAPrivateKey  rsaPrivateKey = RSA.getPrivateKeyFromStr(rsaPrivatekeyStr);
		 return RSA.sign(content, rsaPrivateKey);
		
	}
	
	/**
	 * rsa 验证签名 (公钥验签)
	 * @param content
	 * @param sign
	 * @param rsaPublicKeyStr
	 * @return
	 */
	public boolean  rsaSignVerify(String content ,String sign,String rsaPublicKeyStr ) {
		RSAPublicKey rsaPublicKey=	RSA.getPublickeyFromStr(rsaPublicKeyStr);
		
		return RSA.verify(content, sign, rsaPublicKey);
	}
	
 

}

 

view 视图层 (JFrame):

MainFrame.java 主窗体 

package com.tingcream.rsaTool.view;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import java.awt.Color;
import javax.swing.ImageIcon;
import java.awt.Font;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import java.awt.Toolkit;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.LayoutStyle.ComponentPlacement;

import com.tingcream.rsaTool.model.RSAHelper;

import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.JTextArea;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JScrollPane;
/**
 * rsaTool 主窗体
 * @author jelly
 *
 */
public class MainFrame extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	private  RSAHelper rsaHelper=new  RSAHelper();
 
	
	private JTextField panel_1_textField_1;
	private JLabel   panel_1_label_1,panel_1_label_2,panel_1_label_3;
	private JButton  panel_1_button_1,panel_1_button_2;
	private JScrollPane panel_1_scrollPane_1;
	private JTextArea panel_1_textArea_1;
	private JScrollPane panel_1_scrollPane_2;
	private JTextArea panel_1_textArea_2;
	private JLabel panel_2_label_1;
	private JTextField panel_2_textField_1;
	private JLabel panel_2_label_2;
	private JScrollPane panel_2_scrollPane_1;
	private JTextArea panel_2_textArea_1;
	private JButton panel_2_button_1;
	private JButton panel_2_button_2;
	private JLabel panel_2_label_3;
	private JScrollPane panel_2_scrollPane_2;
	private JTextArea panel_2_textArea_2;
	private JLabel panel_3_label_1;
	private JLabel panel_3_label_2;
	private JLabel panel_3_label_3;
	private JTextField panel_3_textField_1;
	private JScrollPane panel_3_scrollPane_1;
	private JTextArea panel_3_textArea_1;
	private JScrollPane panel_3_scrollPane_2;
	private JTextArea panel_3_textArea_2;
	private JButton panel_3_button_1;
	private JButton panel_3_button_2;
	private JLabel panel_4_label_1;
	private JTextField panel_4_textField_1;
	private JLabel panel_4_label_2;
	private JScrollPane panel_4_scrollPane_1;
	private JTextArea panel_4_textArea_1;
	private JLabel panel_4_label_3;
	private JScrollPane panel_4_scrollPane_2;
	private JTextArea panel_4_textArea_2;
	private JButton panel_4_button_1;
	private JButton panel_4_button_2;
	private JLabel panel_4_label_4;
	private JLabel panel_4_label_5;
	
	
	
	
	

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainFrame frame = new MainFrame();
					frame.setVisible(true);
					
					frame.setLocationRelativeTo(null);//主窗体居中
					 
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public MainFrame() {
		setResizable(false);
		setIconImage(Toolkit.getDefaultToolkit().getImage(MainFrame.class.getResource("/com/tingcream/rsaTool/img/tools_24px.png")));
		setFont(new Font("微软雅黑", Font.PLAIN, 18));
		setBackground(Color.LIGHT_GRAY);
		setTitle("rsaTool加解密工具");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 635, 514);
		contentPane = new JPanel();
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));
		
		JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		tabbedPane.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		contentPane.add(tabbedPane, BorderLayout.CENTER);
		
		JPanel panel_1 = new JPanel();
		tabbedPane.addTab("rsa加密", new ImageIcon(MainFrame.class.getResource("/com/tingcream/rsaTool/img/encrypt_3_24px.png")), panel_1, null);
		tabbedPane.setForegroundAt(0, Color.BLACK);
		tabbedPane.setBackgroundAt(0, Color.WHITE);
		
		 panel_1_label_1 = new JLabel("RSA公钥:");
		panel_1_label_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_1_textField_1 = new JTextField();
		panel_1_textField_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		panel_1_textField_1.setColumns(10);
		
		 panel_1_label_2 = new JLabel("明      文:");
		panel_1_label_2.setHorizontalAlignment(SwingConstants.TRAILING);
		panel_1_label_2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		 panel_1_button_1 = new JButton("加  密");
		 panel_1_button_1.setIcon(new ImageIcon(MainFrame.class.getResource("/com/tingcream/rsaTool/img/encrypt_3_24px.png")));
		 panel_1_button_1.addActionListener(new ActionListener() {
		 	public void actionPerformed(ActionEvent e) {
		 		panel_1_button_1_click(e);
		 	}
		 });
	 
		panel_1_button_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		 panel_1_label_3 = new JLabel("密      文:");
		panel_1_label_3.setHorizontalAlignment(SwingConstants.TRAILING);
		panel_1_label_3.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		 panel_1_button_2 = new JButton("清除明/密文");
		 panel_1_button_2.setIcon(new ImageIcon(MainFrame.class.getResource("/com/tingcream/rsaTool/img/editclear_24px.png")));
		 panel_1_button_2.addActionListener(new ActionListener() {
		 	public void actionPerformed(ActionEvent e) {
		 		panel_1_textArea_1.setText("");
		 		panel_1_textArea_2.setText("");
		 	}
		 });
	 
		panel_1_button_2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		panel_1_scrollPane_1 = new JScrollPane();
		panel_1_scrollPane_2 = new JScrollPane();
		
		
		GroupLayout gl_panel_1 = new GroupLayout(panel_1);
		gl_panel_1.setHorizontalGroup(
			gl_panel_1.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel_1.createSequentialGroup()
					.addGroup(gl_panel_1.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_panel_1.createSequentialGroup()
							.addContainerGap()
							.addGroup(gl_panel_1.createParallelGroup(Alignment.LEADING, false)
								.addGroup(gl_panel_1.createSequentialGroup()
									.addComponent(panel_1_label_1)
									.addPreferredGap(ComponentPlacement.UNRELATED)
									.addComponent(panel_1_textField_1))
								.addGroup(gl_panel_1.createSequentialGroup()
									.addComponent(panel_1_label_2, GroupLayout.PREFERRED_SIZE, 75, GroupLayout.PREFERRED_SIZE)
									.addGap(16)
									.addComponent(panel_1_scrollPane_1, GroupLayout.PREFERRED_SIZE, 449, GroupLayout.PREFERRED_SIZE))))
						.addGroup(gl_panel_1.createSequentialGroup()
							.addGap(20)
							.addComponent(panel_1_label_3, GroupLayout.PREFERRED_SIZE, 75, GroupLayout.PREFERRED_SIZE)
							.addGap(13)
							.addComponent(panel_1_scrollPane_2, GroupLayout.PREFERRED_SIZE, 449, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_panel_1.createSequentialGroup()
							.addGap(105)
							.addComponent(panel_1_button_1)
							.addPreferredGap(ComponentPlacement.RELATED)
							.addComponent(panel_1_button_2)))
					.addContainerGap(51, Short.MAX_VALUE))
		);
		gl_panel_1.setVerticalGroup(
			gl_panel_1.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel_1.createSequentialGroup()
					.addGap(24)
					.addGroup(gl_panel_1.createParallelGroup(Alignment.BASELINE)
						.addComponent(panel_1_label_1)
						.addComponent(panel_1_textField_1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addGap(28)
					.addGroup(gl_panel_1.createParallelGroup(Alignment.TRAILING)
						.addGroup(gl_panel_1.createSequentialGroup()
							.addComponent(panel_1_label_2, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE)
							.addGap(102))
						.addGroup(gl_panel_1.createSequentialGroup()
							.addComponent(panel_1_scrollPane_1, GroupLayout.PREFERRED_SIZE, 109, GroupLayout.PREFERRED_SIZE)
							.addGap(16)))
					.addGroup(gl_panel_1.createParallelGroup(Alignment.BASELINE)
						.addComponent(panel_1_button_1)
						.addComponent(panel_1_button_2, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE))
					.addGroup(gl_panel_1.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_panel_1.createSequentialGroup()
							.addGap(22)
							.addComponent(panel_1_label_3, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_panel_1.createSequentialGroup()
							.addGap(24)
							.addComponent(panel_1_scrollPane_2, GroupLayout.PREFERRED_SIZE, 109, GroupLayout.PREFERRED_SIZE)))
					.addContainerGap(28, Short.MAX_VALUE))
		);
		
		panel_1_textArea_2 = new JTextArea();
		panel_1_textArea_2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		panel_1_scrollPane_2.setViewportView(panel_1_textArea_2);
		
		panel_1_textArea_1 = new JTextArea();
		panel_1_textArea_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		panel_1_scrollPane_1.setViewportView(panel_1_textArea_1);
		panel_1.setLayout(gl_panel_1);
		
		JPanel panel_2 = new JPanel();
		panel_2.setForeground(Color.WHITE);
		tabbedPane.addTab("rsa解密", new ImageIcon(MainFrame.class.getResource("/com/tingcream/rsaTool/img/decrypted_24px.png")), panel_2, null);
		
		panel_2_label_1 = new JLabel("RSA私钥:");
		panel_2_label_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_2_textField_1 = new JTextField();
		panel_2_textField_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		panel_2_textField_1.setColumns(10);
		
		panel_2_label_2 = new JLabel(" 密      文:");
		panel_2_label_2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_2_scrollPane_1 = new JScrollPane();
		
		panel_2_button_1 = new JButton("解  密");
		panel_2_button_1.setIcon(new ImageIcon(MainFrame.class.getResource("/com/tingcream/rsaTool/img/decrypted_24px.png")));
		panel_2_button_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				panel_2_button_1_click(e);
			}
		});
		panel_2_button_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_2_button_2 = new JButton("清除明/密文");
		panel_2_button_2.setIcon(new ImageIcon(MainFrame.class.getResource("/com/tingcream/rsaTool/img/editclear_24px.png")));
		panel_2_button_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				panel_2_textArea_1.setText("");
				panel_2_textArea_2.setText("");
			}
		});
		panel_2_button_2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_2_label_3 = new JLabel(" 明      文:");
		panel_2_label_3.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_2_scrollPane_2 = new JScrollPane();
 
		
		
		GroupLayout gl_panel_2 = new GroupLayout(panel_2);
		gl_panel_2.setHorizontalGroup(
			gl_panel_2.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel_2.createSequentialGroup()
					.addGroup(gl_panel_2.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_panel_2.createSequentialGroup()
							.addContainerGap()
							.addGroup(gl_panel_2.createParallelGroup(Alignment.LEADING, false)
								.addGroup(gl_panel_2.createSequentialGroup()
									.addComponent(panel_2_label_1)
									.addPreferredGap(ComponentPlacement.UNRELATED)
									.addComponent(panel_2_textField_1))
								.addGroup(gl_panel_2.createSequentialGroup()
									.addComponent(panel_2_label_2, GroupLayout.PREFERRED_SIZE, 75, GroupLayout.PREFERRED_SIZE)
									.addGap(16)
									.addComponent(panel_2_scrollPane_1, GroupLayout.PREFERRED_SIZE, 449, GroupLayout.PREFERRED_SIZE))))
						.addGroup(gl_panel_2.createSequentialGroup()
							.addGap(20)
							.addComponent(panel_2_label_3, GroupLayout.PREFERRED_SIZE, 75, GroupLayout.PREFERRED_SIZE)
							.addGap(13)
							.addComponent(panel_2_scrollPane_2, GroupLayout.PREFERRED_SIZE, 449, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_panel_2.createSequentialGroup()
							.addGap(105)
							.addComponent(panel_2_button_1)
							.addPreferredGap(ComponentPlacement.RELATED)
							.addComponent(panel_2_button_2)))
					.addContainerGap(51, Short.MAX_VALUE))
		);
		gl_panel_2.setVerticalGroup(
			gl_panel_2.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel_2.createSequentialGroup()
					.addGap(24)
					.addGroup(gl_panel_2.createParallelGroup(Alignment.BASELINE)
						.addComponent(panel_2_label_1)
						.addComponent(panel_2_textField_1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addGap(28)
					.addGroup(gl_panel_2.createParallelGroup(Alignment.TRAILING)
						.addGroup(gl_panel_2.createSequentialGroup()
							.addComponent(panel_2_label_2, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE)
							.addGap(102))
						.addGroup(gl_panel_2.createSequentialGroup()
							.addComponent(panel_2_scrollPane_1, GroupLayout.PREFERRED_SIZE, 109, GroupLayout.PREFERRED_SIZE)
							.addGap(16)))
					.addGroup(gl_panel_2.createParallelGroup(Alignment.BASELINE)
						.addComponent(panel_2_button_1)
						.addComponent(panel_2_button_2, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE))
					.addGroup(gl_panel_2.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_panel_2.createSequentialGroup()
							.addGap(22)
							.addComponent(panel_2_label_3, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_panel_2.createSequentialGroup()
							.addGap(24)
							.addComponent(panel_2_scrollPane_2, GroupLayout.PREFERRED_SIZE, 109, GroupLayout.PREFERRED_SIZE)))
					.addContainerGap(28, Short.MAX_VALUE))
		);
		
		
		
		panel_2_textArea_2 = new JTextArea();
		panel_2_textArea_2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		panel_2_scrollPane_2.setViewportView(panel_2_textArea_2);
		
		panel_2_textArea_1 = new JTextArea();
		panel_2_textArea_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		panel_2_scrollPane_1.setViewportView(panel_2_textArea_1);
		panel_2.setLayout(gl_panel_2);
		tabbedPane.setForegroundAt(1, Color.BLACK);
		
		JPanel panel_3 = new JPanel();
		tabbedPane.addTab("rsa签名", new ImageIcon(MainFrame.class.getResource("/com/tingcream/rsaTool/img/ok_signature_24px.png")), panel_3, null);
		
		panel_3_label_1 = new JLabel("RSA私钥:");
		panel_3_label_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_3_label_2 = new JLabel(" 明      文:");
		panel_3_label_2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_3_label_3 = new JLabel(" 签 名 值:");
		panel_3_label_3.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_3_textField_1 = new JTextField();
		panel_3_textField_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		panel_3_textField_1.setColumns(10);
		
		panel_3_scrollPane_1 = new JScrollPane();
		
		panel_3_scrollPane_2 = new JScrollPane();
		
		panel_3_button_1 = new JButton("签  名");
		panel_3_button_1.setIcon(new ImageIcon(MainFrame.class.getResource("/com/tingcream/rsaTool/img/ok_signature_24px.png")));
		panel_3_button_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				panel_3_button_1_click(e);
			}
		});
		panel_3_button_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_3_button_2 = new JButton("清除明文/签名值");
		panel_3_button_2.setIcon(new ImageIcon(MainFrame.class.getResource("/com/tingcream/rsaTool/img/editclear_24px.png")));
		panel_3_button_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				panel_3_textArea_1.setText("");
				panel_3_textArea_2.setText("");
			}
		});
		panel_3_button_2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		GroupLayout gl_panel_3 = new GroupLayout(panel_3);
		gl_panel_3.setHorizontalGroup(
			gl_panel_3.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel_3.createSequentialGroup()
					.addGroup(gl_panel_3.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_panel_3.createSequentialGroup()
							.addContainerGap()
							.addGroup(gl_panel_3.createParallelGroup(Alignment.LEADING, false)
								.addGroup(gl_panel_3.createSequentialGroup()
									.addComponent(panel_3_label_1)
									.addPreferredGap(ComponentPlacement.UNRELATED)
									.addComponent(panel_3_textField_1))
								.addGroup(gl_panel_3.createSequentialGroup()
									.addComponent(panel_3_label_2, GroupLayout.PREFERRED_SIZE, 75, GroupLayout.PREFERRED_SIZE)
									.addGap(16)
									.addComponent(panel_3_scrollPane_1, GroupLayout.PREFERRED_SIZE, 449, GroupLayout.PREFERRED_SIZE))))
						.addGroup(gl_panel_3.createSequentialGroup()
							.addGap(20)
							.addComponent(panel_3_label_3, GroupLayout.PREFERRED_SIZE, 75, GroupLayout.PREFERRED_SIZE)
							.addGap(13)
							.addComponent(panel_3_scrollPane_2, GroupLayout.PREFERRED_SIZE, 449, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_panel_3.createSequentialGroup()
							.addGap(105)
							.addComponent(panel_3_button_1)
							.addPreferredGap(ComponentPlacement.RELATED)
							.addComponent(panel_3_button_2)))
					.addContainerGap(51, Short.MAX_VALUE))
		);
		gl_panel_3.setVerticalGroup(
			gl_panel_3.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel_3.createSequentialGroup()
					.addGap(24)
					.addGroup(gl_panel_3.createParallelGroup(Alignment.BASELINE)
						.addComponent(panel_3_label_1)
						.addComponent(panel_3_textField_1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addGap(28)
					.addGroup(gl_panel_3.createParallelGroup(Alignment.TRAILING)
						.addGroup(gl_panel_3.createSequentialGroup()
							.addComponent(panel_3_label_2, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE)
							.addGap(102))
						.addGroup(gl_panel_3.createSequentialGroup()
							.addComponent(panel_3_scrollPane_1, GroupLayout.PREFERRED_SIZE, 109, GroupLayout.PREFERRED_SIZE)
							.addGap(16)))
					.addGroup(gl_panel_3.createParallelGroup(Alignment.BASELINE)
						.addComponent(panel_3_button_1)
						.addComponent(panel_3_button_2, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE))
					.addGroup(gl_panel_3.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_panel_3.createSequentialGroup()
							.addGap(22)
							.addComponent(panel_3_label_3, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_panel_3.createSequentialGroup()
							.addGap(24)
							.addComponent(panel_3_scrollPane_2, GroupLayout.PREFERRED_SIZE, 109, GroupLayout.PREFERRED_SIZE)))
					.addContainerGap(28, Short.MAX_VALUE))
		);
		
		
		
		panel_3_textArea_2 = new JTextArea();
		panel_3_textArea_2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		panel_3_scrollPane_2.setViewportView(panel_3_textArea_2);
		
		panel_3_textArea_1 = new JTextArea();
		panel_3_textArea_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		panel_3_scrollPane_1.setViewportView(panel_3_textArea_1);
		panel_3.setLayout(gl_panel_3);
		tabbedPane.setForegroundAt(2, Color.BLACK);
		
		JPanel panel_4 = new JPanel();
		tabbedPane.addTab("rsa验签", new ImageIcon(MainFrame.class.getResource("/com/tingcream/rsaTool/img/verified_user_24px.png")), panel_4, null);
		
		panel_4_label_1 = new JLabel("RSA公钥:");
		panel_4_label_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_4_textField_1 = new JTextField();
		panel_4_textField_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		panel_4_textField_1.setColumns(10);
		
		panel_4_label_2 = new JLabel(" 明      文:");
		panel_4_label_2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_4_scrollPane_1 = new JScrollPane();
		
		panel_4_label_3 = new JLabel(" 签 名 值:");
		panel_4_label_3.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_4_scrollPane_2 = new JScrollPane();
		
		panel_4_button_1 = new JButton("验  签");
		panel_4_button_1.setIcon(new ImageIcon(MainFrame.class.getResource("/com/tingcream/rsaTool/img/verified_user_24px.png")));
		panel_4_button_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				panel_4_button_1_click(e);
			}
		});
		panel_4_button_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_4_button_2 = new JButton("清除明文/签名值");
		panel_4_button_2.setIcon(new ImageIcon(MainFrame.class.getResource("/com/tingcream/rsaTool/img/editclear_24px.png")));
		panel_4_button_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				panel_4_textArea_1.setText("");
				panel_4_textArea_2.setText("");
			}
		});
		panel_4_button_2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_4_label_4 = new JLabel(" 验签结果:");
		panel_4_label_4.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		
		panel_4_label_5 = new JLabel("");
		panel_4_label_5.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		GroupLayout gl_panel_4 = new GroupLayout(panel_4);
		gl_panel_4.setHorizontalGroup(
			gl_panel_4.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel_4.createSequentialGroup()
					.addContainerGap()
					.addGroup(gl_panel_4.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_panel_4.createSequentialGroup()
							.addComponent(panel_4_label_1)
							.addGap(18)
							.addComponent(panel_4_textField_1, GroupLayout.PREFERRED_SIZE, 446, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_panel_4.createSequentialGroup()
							.addComponent(panel_4_label_2, GroupLayout.PREFERRED_SIZE, 75, GroupLayout.PREFERRED_SIZE)
							.addGap(18)
							.addComponent(panel_4_scrollPane_1, GroupLayout.PREFERRED_SIZE, 446, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_panel_4.createSequentialGroup()
							.addComponent(panel_4_label_3, GroupLayout.PREFERRED_SIZE, 75, GroupLayout.PREFERRED_SIZE)
							.addGap(18)
							.addGroup(gl_panel_4.createParallelGroup(Alignment.LEADING)
								.addGroup(gl_panel_4.createSequentialGroup()
									.addComponent(panel_4_button_1)
									.addPreferredGap(ComponentPlacement.RELATED)
									.addComponent(panel_4_button_2, GroupLayout.PREFERRED_SIZE, 210, GroupLayout.PREFERRED_SIZE))
								.addComponent(panel_4_scrollPane_2, GroupLayout.PREFERRED_SIZE, 446, GroupLayout.PREFERRED_SIZE)))
						.addGroup(gl_panel_4.createSequentialGroup()
							.addComponent(panel_4_label_4, GroupLayout.PREFERRED_SIZE, 92, GroupLayout.PREFERRED_SIZE)
							.addPreferredGap(ComponentPlacement.RELATED)
							.addComponent(panel_4_label_5)))
					.addContainerGap(70, Short.MAX_VALUE))
		);
		gl_panel_4.setVerticalGroup(
			gl_panel_4.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel_4.createSequentialGroup()
					.addGap(27)
					.addGroup(gl_panel_4.createParallelGroup(Alignment.BASELINE)
						.addComponent(panel_4_label_1)
						.addComponent(panel_4_textField_1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addGap(18)
					.addGroup(gl_panel_4.createParallelGroup(Alignment.LEADING)
						.addComponent(panel_4_label_2, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE)
						.addComponent(panel_4_scrollPane_1, GroupLayout.PREFERRED_SIZE, 109, GroupLayout.PREFERRED_SIZE))
					.addGap(18)
					.addGroup(gl_panel_4.createParallelGroup(Alignment.LEADING)
						.addComponent(panel_4_scrollPane_2, GroupLayout.PREFERRED_SIZE, 108, GroupLayout.PREFERRED_SIZE)
						.addComponent(panel_4_label_3, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE))
					.addGap(18)
					.addGroup(gl_panel_4.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_panel_4.createSequentialGroup()
							.addComponent(panel_4_button_1)
							.addGap(25)
							.addGroup(gl_panel_4.createParallelGroup(Alignment.BASELINE)
								.addComponent(panel_4_label_4, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE)
								.addComponent(panel_4_label_5)))
						.addComponent(panel_4_button_2, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE))
					.addContainerGap(26, Short.MAX_VALUE))
		);
		
		panel_4_textArea_2 = new JTextArea();
		panel_4_textArea_2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		panel_4_scrollPane_2.setViewportView(panel_4_textArea_2);
		
		panel_4_textArea_1 = new JTextArea();
		panel_4_textArea_1.setFont(new Font("微软雅黑", Font.PLAIN, 18));
		panel_4_scrollPane_1.setViewportView(panel_4_textArea_1);
		panel_4.setLayout(gl_panel_4);
	}
	//rsa 加密
	private void panel_1_button_1_click(ActionEvent e) {
		try {
			String publicKeyStr =this.panel_1_textField_1.getText();
			String content =   this.panel_1_textArea_1.getText();
			if(publicKeyStr==null ||publicKeyStr.trim().equals("")) {
				JOptionPane.showMessageDialog(null, "RSA公钥不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
			    return ;
			}
			if(content==null ||content.trim().equals("")) {
				//JOptionPane.showMessageDialog(null, "明文内容不能为空!", "信息", JOptionPane.INFORMATION_MESSAGE);
				  JOptionPane.showMessageDialog(null, "明文内容不能为空!");//默认的  提示框 title为“信息” type为  INFORMATION_MESSAGE
				return ;
			}
			
			String  cipherContent  = rsaHelper.rsaEncrypt(content, publicKeyStr);
			this.panel_1_textArea_2.setText(cipherContent);
		} catch (Exception e1) {
			e1.printStackTrace();
			JOptionPane.showMessageDialog(null, e1.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
		}
		
	}
	//rsa 解密
	private void panel_2_button_1_click(ActionEvent e) {
		try {
			String privateKeyStr =this.panel_2_textField_1.getText();
			String cipherContent =   this.panel_2_textArea_1.getText();
			if(privateKeyStr==null ||privateKeyStr.trim().equals("")) {
				JOptionPane.showMessageDialog(null, "RSA私钥不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
				return ;
			}
			if(cipherContent==null ||cipherContent.trim().equals("")) {
				JOptionPane.showMessageDialog(null, "密文内容不能为空!");//默认的  提示框 title为“信息” type为  INFORMATION_MESSAGE
				return ;
			}
			
			String content  = rsaHelper.rsaDecrypt(cipherContent, privateKeyStr);
			this.panel_2_textArea_2.setText(content);
			
		} catch (Exception e1) {
			e1.printStackTrace();
			JOptionPane.showMessageDialog(null, e1.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
		}
	}
	//rsa 签名
	private void panel_3_button_1_click(ActionEvent e) {
		try {
			String privateKeyStr =this.panel_3_textField_1.getText();
			String content =   this.panel_3_textArea_1.getText();
			if(privateKeyStr==null ||privateKeyStr.trim().equals("")) {
				JOptionPane.showMessageDialog(null, "RSA私钥不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
				return ;
			}
			if(content==null ||content.trim().equals("")) {
				JOptionPane.showMessageDialog(null, "明文内容不能为空!");//默认的  提示框 title为“信息” type为  INFORMATION_MESSAGE
				return ;
			}
	 
			String sign  =rsaHelper.rsaSign(content, privateKeyStr);
			this.panel_3_textArea_2.setText(sign);
			
		} catch (Exception e1) {
			e1.printStackTrace();
			JOptionPane.showMessageDialog(null, e1.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
		}
	}
	 
	//rsa 验证签名
	private void panel_4_button_1_click(ActionEvent e) {
		try {
			String publicKeyStr = this.panel_4_textField_1.getText();
			String content = this.panel_4_textArea_1.getText();
			String sign = this.panel_4_textArea_2.getText();
			if(publicKeyStr==null ||publicKeyStr.trim().equals("")) {
				JOptionPane.showMessageDialog(null, "RSA公钥不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
			    return ;
			}
			if(content==null ||content.trim().equals("")) {
				JOptionPane.showMessageDialog(null, "明文内容不能为空!");
			    return ;
			}
			if(sign==null ||sign.trim().equals("")) {
				JOptionPane.showMessageDialog(null, "签名值内容不能为空!");
				return ;
			}
			
			boolean  f=rsaHelper.rsaSignVerify(content, sign, publicKeyStr);
			if(f) {
				 this.panel_4_label_5.setForeground( new Color(0, 255, 0));
				 this.panel_4_label_5.setText("验签成功");
			}else {
				 this.panel_4_label_5.setForeground( new Color(255, 0, 0));
				 this.panel_4_label_5.setText("验签失败");
				
			}
			
		} catch (Exception e1) {
			e1.printStackTrace();
			JOptionPane.showMessageDialog(null, e1.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
		}
	}
	
}

 img层: 存放的都是图标资源 ,都是从easyicon.net上下载的, 读者们也可自行到其他网站下载合适的图标。

 

项目源码 : https://github.com/jellyflu/rsaTool  (github)

 

 

 

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RSA-Tool 2 Copyright ?2000-2002 by tE! [TMG] Introduction Please read this text carefully. This utility has been made for those who want to use the RSA public key algorithm in their own programs. It offers creation of strong keypairs and a nice integer factorization feature which makes use of several differnt factoring methods including the MPQS. It's possible to factor integers +256 bits in size but please keep in mind that this can take a *lot* of memory and time ! Thus it's not recommended to try factoring bigger numbers on slow machines with a few MB of physical Memory. Don't even think of trying to factor 512 bit numbers for example.. RSA-Tool 2 Features: - Secure keypair generation - Key test dialog - Support of multiple number bases - Auto base-conversion on select - Support of numbers up to 4096 Bits 1. About RSA RSA is a Public Key Cryptosystem developed in 1977 by Ronald Rivest, Adi Shamir and Leonard Adleman. Since 09-20-2000 the U.S. Patent #4,405,829 on this Algorithm EXPIRED! That means that the Algorithm is Public Domain now and can be used by everyone for free, even in commercial software. 2. Parameters P = 1st large prime number Q = 2nd large prime number (sizes of P and Q should not differ too much!) E = Public Exponent (a random number which must fulfil: GCD(E, (P-1)*(Q-1))==1) N = Public Modulus, the product of P and Q: N=P*Q D = Private Exponent: D=E^(-1) mod ((P-1)*(Q-1)) Parameters N and E are public whereas D is -private- and must NEVER be published! P and Q are not longer needed after keygeneration and should be destroyed. To obtain D from the public key (N, E) one needs to try splitting N in its both prime factors P and Q. For a large Modulus N (512 bit and more) with carefully chosen primefactors P and Q this is a very difficult problem. All the security of the RSA encryption scheme relies on that integer factorization problem (tough there's no mathematical proof for it). To fin
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值