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

📄 mainrsa.java

📁 RSA加密算法演示程序.包括公钥与私钥的生成算法.自定义公钥与私钥的长度
💻 JAVA
字号:
package org.xiaolq.rsa;


import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class MainRSA {

	private JTextArea textFieldC;
	private JTextArea textFieldM;
	private JFrame frame;
	private JLabel titleLabel;
	private JLabel pLabel;
	private JLabel qLabel;
	private JLabel nLabel;
	private JLabel eLabel;
	private JLabel dLabel;
	
	private JLabel label_p;
	private JLabel label_q;
	private JButton runButton;
	private JButton encriptButton;
	private JButton decodeButton;
	private JButton getTextCButton;
	private JOptionPane message;
	private JLabel textC_label;
	private JLabel textM_label;
	
	private BigInteger biP, biQ, biN, biD, biE, biOL;
	
	private BigInteger textM;
	private Map<Integer, BigInteger> map;
	
	RSATool tools;
	
	/**
	 * Launch the application
	 * @param args
	 */
	public static void main(String args[]) {
		try {
			MainRSA window = new MainRSA();
			window.frame.setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Create the application
	 */
	public MainRSA() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame
	 */
	private void initialize() {
		
		tools = new RSATool();
		map = new HashMap<Integer, BigInteger>();
		
		frame = new JFrame();
		frame.setTitle("RSA加密算法演示");
		frame.getContentPane().setLayout(null);
		frame.setBounds(350, 100, 374, 507);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		titleLabel = new JLabel();
		titleLabel.setFont(new Font("@宋体", Font.BOLD, 42));
		titleLabel.setText("RSA算法演示");
		titleLabel.setBounds(37, 10, 278, 39);
		frame.getContentPane().add(titleLabel);

		pLabel = new JLabel(); 
		pLabel.setFont(new Font("", Font.PLAIN, 16));
		pLabel.setText("p:");
		pLabel.setBounds(153, 74, 17, 15);
		frame.getContentPane().add(pLabel);

		qLabel = new JLabel();
		qLabel.setFont(new Font("", Font.PLAIN, 16));
		qLabel.setText("q:");
		qLabel.setBounds(153, 104, 16, 15);
		frame.getContentPane().add(qLabel);

		runButton = new JButton();
		runButton.setText("产生密钥");
		runButton.setBounds(9, 183, 99, 23);
		runButton.setEnabled(false);
		frame.getContentPane().add(runButton);

		nLabel = new JLabel();
		nLabel.setText("n=pq");
		nLabel.setFont(new Font("", Font.PLAIN, 12));
		nLabel.setBounds(135, 146, 211, 30);
		frame.getContentPane().add(nLabel);

		eLabel = new JLabel();
		eLabel.setText("公钥={e,n}");
		eLabel.setFont(new Font("宋体", Font.PLAIN, 12));
		eLabel.setBounds(135, 179, 211, 31);
		frame.getContentPane().add(eLabel);

		dLabel = new JLabel();
		dLabel.setText("私钥={d,n}");
		dLabel.setFont(new Font("宋体", Font.PLAIN, 12));
		dLabel.setBounds(135, 216, 211, 29);
		frame.getContentPane().add(dLabel);

		final JLabel label = new JLabel();
		label.setText("加密");
		label.setBounds(9, 250, 30, 15);
		frame.getContentPane().add(label);

		final JLabel label_1 = new JLabel();
		label_1.setText("解密");
		label_1.setBounds(9, 353, 30, 15);
		frame.getContentPane().add(label_1);

		encriptButton = new JButton();
		encriptButton.setEnabled(false);
		encriptButton.setText("加密");
		encriptButton.setBounds(153, 324, 65, 23);
		frame.getContentPane().add(encriptButton);

		final JLabel label_3 = new JLabel();
		label_3.setText("密文C=");
		label_3.setBounds(34, 303, 45, 15);
		frame.getContentPane().add(label_3);

		textC_label = new JLabel();
		textC_label.setText("?");
		textC_label.setBounds(84, 303, 231, 15);
		frame.getContentPane().add(textC_label);

		decodeButton = new JButton();
		decodeButton.setEnabled(false);
		decodeButton.setText("解密");
		decodeButton.setBounds(153, 418, 65, 23);
		frame.getContentPane().add(decodeButton);

		final JLabel label_6 = new JLabel();
		label_6.setText("明文P=");
		label_6.setBounds(37, 399, 45, 15);
		frame.getContentPane().add(label_6);

		textM_label = new JLabel();
		textM_label.setText("?");
		textM_label.setBounds(84, 399, 231, 15);
		frame.getContentPane().add(textM_label);

		final JSeparator separator = new JSeparator();
		separator.setBounds(10, 251, 346, 14);
		frame.getContentPane().add(separator);

		final JSeparator separator_1 = new JSeparator();
		separator_1.setBounds(10, 353, 346, 10);
		frame.getContentPane().add(separator_1);

		final JSeparator separator_2 = new JSeparator();
		separator_2.setBounds(9, 59, 347, 20);
		frame.getContentPane().add(separator_2);

		final JMenuBar menuBar = new JMenuBar();
		frame.setJMenuBar(menuBar);

		final JMenu menu = new JMenu();
		menu.setText("帮助");
		menu.addMouseListener(new MouseAdapter(){
			public void mouseClicked(MouseEvent e) {
				//弹出帮助菜单
				String help = "1.选择2个保密的大素数p和q;\n2.计算n=p*q和欧拉函数值o=(p-1)(q-1);\n" +
							  "3.选一整数e,且满足1<e<o和gcd(o,e)=1;\n4.计算d,且满足d*e=1 mod o;\n" +
							  "5.公钥为{e,n},私钥为{d,n}";
				message.showMessageDialog(frame, help);
				
			}
			
		});
		menuBar.add(menu);
		
		JMenu jm = new JMenu();
		jm.setToolTipText("关于");
		jm.setText("关于");
		menuBar.add(jm);
		jm.addMouseListener(new MouseAdapter(){
			public void mouseClicked(MouseEvent e) {
				String about = "本软件最终拥有权属于肖亮庆!";
				message.showMessageDialog(frame, about);
			}
		});

		final JButton producePrime = new JButton();
		producePrime.setText("生成素数p和q");
		producePrime.setBounds(9, 85, 115, 23);
		frame.getContentPane().add(producePrime);

		label_p = new JLabel();
		label_p.setBounds(176, 75, 158, 15);
		frame.getContentPane().add(label_p);

		label_q = new JLabel();
		label_q.setBounds(175, 105, 159, 15);
		frame.getContentPane().add(label_q);

		final JLabel label_2 = new JLabel();
		label_2.setBounds(34, 271, 44, 15);
		frame.getContentPane().add(label_2);
		label_2.setText("明文P=");

		final JLabel label_5 = new JLabel();
		label_5.setBounds(37, 371, 43, 15);
		frame.getContentPane().add(label_5);
		label_5.setText("密文C=");

		textFieldC = new JTextArea();
		textFieldC.setBounds(87, 369, 200, 20);
		frame.getContentPane().add(textFieldC);

		final JSeparator separator_3 = new JSeparator();
		separator_3.setBounds(9, 127, 347, 13);
		frame.getContentPane().add(separator_3);

		getTextCButton = new JButton();
		getTextCButton.setText("获取");
		getTextCButton.setEnabled(false);
		getTextCButton.setBounds(293, 369, 68, 23);
		frame.getContentPane().add(getTextCButton);
		/**
		 * 响应产生p和q的事件
		 */
		producePrime.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				biP = tools.producePrimeNum();
				biQ = tools.producePrimeNum();
				label_p.setText(biP.toString());
				label_q.setText(biQ.toString());
				
				runButton.setEnabled(true);
			}
		});
		
		/**
		 * 响应解密事件
		 */
		decodeButton.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent ex) {
				//解密
				String c = null;
				BigInteger bi = null;
				int i = 0;
				try {
					c = textFieldC.getText();
					StringTokenizer st = new StringTokenizer(c," ",false);
					while(st.hasMoreTokens()) {
						bi = new BigInteger(st.nextToken());
						map.put(i, bi);
						i++;
					}
					textM = tools.decode(map, biD, biN);
					textM_label.setText(textM.toString());
				} catch (NumberFormatException e) {
					message.showMessageDialog(frame, "请输入密文");
				}
			}
		});
		
		/**
		 * 响应加密事件
		 */
		encriptButton.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent ex) {
				//加密
				String m1 = null, m2 = null;
				try {
					m1 = textFieldM.getText();
					m2 = tools.encript(m1, biE, biN);
					textC_label.setText(m2);
					getTextCButton.setEnabled(true);
				} catch (NumberFormatException e) {
					message.showMessageDialog(frame, "请输入明文");
				}
			}
		});
		
		/**
		 * 响应该产生密钥事件
		 */
		runButton.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				count();
				encriptButton.setEnabled(true);
				decodeButton.setEnabled(true);
			}
		});
		
		/**
		 * 响应获取密文事件
		 */
		getTextCButton.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				String tempC = textC_label.getText();
				textFieldC.setText(tempC);
			}
		});

		textFieldM = new JTextArea();
		textFieldM.setBounds(84, 271, 203, 24);
		frame.getContentPane().add(textFieldM);
		textFieldM.setColumns(50);
		textFieldM.setRows(20);
	}
	/**
	 * 产生密钥
	 *
	 */
	public void count() {
		biN = biP.multiply(biQ);
		nLabel.setText("n=pq=" + biN.toString());
		
		biE = tools.checkE(biP, biQ, this);
		eLabel.setText("公钥为:{e,n}={" + biE + "," + biN + "}");
		
		biD = tools.checkD(biE, biOL);
		dLabel.setText("私钥为:{d,n}={" + biD + "," + biN + "}");
	}

	public BigInteger getBiOL() {
		return biOL;
	}

	public void setBiOL(BigInteger biOL) {
		this.biOL = biOL;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -