?? mainrsa.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 + -