package encryptdecrypt;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.ScrollPaneConstants;publicclass FileSignature {
/**
* @param args
*/publicstaticvoid main(String[ ] args) {// TODO Auto-generated method stub
DemoWindow5 dw = new DemoWindow5("文件签名");dw.setBounds(dw.getToolkit() .getScreenSize() .width / 3,dw.getToolkit()
.getScreenSize() .height / 3,dw.getToolkit() .getScreenSize() .width / 3,dw.getToolkit()
.getScreenSize() .height / 3);dw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);dw.setVisible(true) ;
}
}classDemoWindow5extends JFrame implements ActionListener {JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("文件");
JMenuItem openMenuItem = new JMenuItem("打开文件");
JMenuItem saveMenuItem = new JMenuItem("保存文件");
JMenu signMenu = new JMenu("签名验证");
JMenuItem generateItem = new JMenuItem("生成密钥对");JMenuItem signItem = new JMenuItem("签名文件") ;
JMenuItem validateItem = new JMenuItem("验证文件");
JTextArea jta = new JTextArea();intv = Sc rollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;inth = Sc rollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;JScrollPane jsp = new JScrollPane(jta, v, h) ;public DemoWindow5(String title) {super(title);fileMenu.add(openMenuItem);fileMenu.add(saveMenuItem);signMenu.add(generateItem);signMenu.add(signItem);signMenu.add(validateItem);menuBar.add(fileMenu);menuBar.add(signMenu);this.setJMenuBar(menuBar);add(jsp);openMenuItem.addActionListener(this);saveMenuItem.addActionListener(this);
generateItem.addActionListener(this);signItem.addActionListener(this);validateItem.addActionListener(this);
}publicvoid actionPerformed(ActionEvent e) {
// TODO Auto-generated method stubif (e.getSource() == openMenuItem) {openFile();
} elseif (e.getSource() == saveMenuItem) {saveFile();
} elseif (e.getSource() == generateItem) {generateKeys();
} elseif (e.getSource() == signItem) {sign();
} elseif (e.getSource() == validateItem) {validateSign();
}
}publicvoid openFile() {
String fileName = null;
// System.getProperty("user.dir")是获得用户当前的工作目录JFileChooser jfc = new
JFileChooser(System.getProperty("user.dir") ) ;jfc.setDialogTitle("打开文件");
//如果选中获取选择的文件的完整路径if (jfc.showOpenDialog(this) ==
J FileChooser.APPROVE_OPTION) {fileName = jfc.getSelectedFile() .getPath();
System.out.println(fileName);
}if (fileName == null)return;try {
FileInputStream fis = new FileInputStream(fileName);byte[ ] text = newbyte[f is.available()] ;f is.read(text);fis.close();
jta.setText(new String(text) );
} catch (Exception e1) {e1.printStackTrace();
}
}publicvoid saveFile() {
String fileName = null;
JFileChooser jfc = new
JFileChooser(System.getProperty("user.dir") ) ;jfc.setDialogTitle("保存文件");if (jfc.showSaveDialog(this) ==
J FileChooser.APPROVE_OPTION) {fileName = jfc.getSelectedFile() .getPath();
}if (fileName == null)return;try {
FileOutputStream fos = new FileOutputStream(fileName,false) ;fos.write(jta.getText() .getBytes()) ;fos.close();
} catch (Exception e1) {e1.printStackTrace();
}
}publicvoid generateKeys() {try {
String fileName = null;
JFileChooser jfc = new JFileChooser();jfc.setDialogTitle("生成密钥对");jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);if (jfc.showSaveDialog(this) ==
J FileChooser.APPROVE_OPTION) {
fileName = jfc.getSelectedFile() .getPath();}if (fileName == null)return;
File file = new File(fileName);if ( !file.exists() ) {file.mkdir();
}
//创建DSA密钥对生成器
KeyPairGenerator keygen =
KeyPairGenerator.getInstance("DSA");
//采用1024位DSA密钥keygen.initialize(1024);
//得到密钥对
KeyPair keys = keygen.generateKeyPair();
PublicKey pubkey = keys.getPublic();
PrivateKey prikey = keys.getPrivate();
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName + "/公钥.dat") );out.writeObject(pubkey);out.close();out = new ObjectOutputStream(new
FileOutputStream(fileName
+ "/私钥.dat") );out.writeObject(prikey);out.close();
} catch (Exception e1) {e1.printStackTrace();
}
}publicvoid sign() {try {
String fileName = null;
JFileChooser jfc = new JFileChooser();jfc.setDialogTitle( "导入私钥文件");
if (jfc.showOpenDialog(this) ==
J FileChooser.APPROVE_OPTION) {fileName = jfc.getSelectedFile() .getPath();}if (fileName == null)return;
//获取私钥
ObjectInputStream ois = new ObjectInputStream(newFileInputStream(f ileName) );
PrivateKey prikey = (PrivateKey) ois.readObject() ;//创建SHAlwithDSA签名类java.security.Signature dsa =java.security.Signature.getInstance(
"SHA1withDSA", "SUN");
//设置生成摘要的私钥dsa.initSign(prikey);
//对文本区的文本进行签名验证dsa.update(jta.getText() .getBytes( "UTF-8"));
//得到签名后的签名摘要值byte[ ] signText = dsa.sign();jfc = new JFileChooser();jfc.setDialogTitle("保存签名文件");if (jfc.showSaveDialog(this) ==
J FileChooser.APPROVE_OPTION) {fileName = jfc.getSelectedFile() .getPath();}if (fileName == null)return;
FileOutputStream fos = new FileOutputStream(fileName);fos.write(signText);fos.close();
} catch (Exception e1) {e1.printStackTrace();
}
}
publicvoid validateSign() {try {
String fileName = null;
JFileChooser jfc = new JFileChooser();jfc.setDialogTitle("导入公钥文件");if (jfc.showOpenDialog(this) ==
J FileChooser.APPROVE_OPTION) {fileName = jfc.getSelectedFile() .getPath();}if (fileName == null)return;
ObjectInputStream in = new ObjectInputStream(newFileInputStream(f ileName) );
PublicKey pubkey = (PublicKey) in.readObject();jfc = new JFileChooser();jfc.setDialogTitle("打开签名文件");if (jfc.showOpenDialog(this) ==
J FileChooser.APPROVE_OPTION) {fileName = jfc.getSelectedFile() .getPath();}if (fileName == null)return;
//从签名文件中读取签名摘要
FileInputStream fis = new FileInputStream(fileName);byte[ ] sigToVerfiy = newbyte[fis.available() ] ;f is.read(sigToVerf iy);fis.close();
//创建SHA1withDSA签名类java.security.Signature sig =java.security.Signature.getInstance(
"SHA1withDSA", "SUN");
//设置验证的公钥sig.initVerify(pubkey);
//验证文本区sig.update(jta.getText() .getBytes( "UTF-8"));
//显示验证信息
if (sig.verify(sigToVerfiy)) {
JOptionPane.showMessageDialog(null, "签名正确");} else {
JOptionPane.showMessageDialog(null, "签名不正确");}
} catch (Exception e1) {e1.printStackTrace();
}
}
}
小白云是一家国人自营的企业IDC,主营国内外VPS,致力于让每一个用户都能轻松、快速、经济地享受高端的服务,成立于2019年,拥有国内大带宽高防御的特点,专注于DDoS/CC等攻击的防护;海外线路精选纯CN2线路,以确保用户体验的首选线路,商家线上多名客服一对一解决处理用户的问题,提供7*24无人全自动化服务。商家承诺绝不超开,以用户体验为中心为用提供服务,一直坚持主打以产品质量用户体验性以及高效...
profitserver正在对德国vps(法兰克福)、西班牙vps(马德里)、荷兰vps(杜廷赫姆)这3处数据中心内的VPS进行5折优惠促销。所有VPS基于KVM虚拟,纯SSD阵列,自带一个IPv4,不限制流量,在后台支持自定义ISO文件,方便大家折腾!此外还有以下数据中心:俄罗斯(多机房)、捷克、保加利亚、立陶宛、新加坡、美国(洛杉矶、锡考克斯、迈阿密)、瑞士、波兰、乌克兰,VPS和前面的一样性...
触摸云触摸云(cmzi.com),国人商家,有IDC/ISP正规资质,主营香港线路VPS、物理机等产品。本次为大家带上的是美国高防2区的套餐。去程普通线路,回程cn2 gia,均衡防御速度与防御,防御值为200G,无视UDP攻击,可选择性是否开启CC防御策略,超过峰值黑洞1-2小时。最低套餐20M起,多数套餐为50M,适合有防御型建站需求使用。美国高防2区 弹性云[大宽带]· 配置:1-16核· ...