用swt做个一个东西,至于为什么叫东西,是因为还有些内容没有完成。全部代码如下: package com; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.math.BigInteger; import java.security.InvalidKeyException; import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.KeyStore; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.PrivateKey; import java.security.Provider; import java.security.PublicKey; import java.security.SecureRandom; import java.security.Security; import java.security.Signature; import java.security.SignatureException; import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateException; import java.security.cert.CertificateExpiredException; import java.security.cert.CertificateFactory; import java.security.cert.CertificateNotYetValidException; import java.security.cert.X509Certificate; import java.util.Date; import java.util.Hashtable; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.asn1.DERObjectIdentifier; import org.bouncycastle.asn1.DEROutputStream; import org.bouncycastle.asn1.x509.BasicConstraints; import org.bouncycastle.jce.X509Principal; import org.bouncycastle.jce.X509V3CertificateGenerator; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Base64; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.Text; public class Fmain { private Text keypass; private Text country; private Text city; private Text state; private Text department; private Text company; private Text commonname; private Text keystorepass; private Combo validity; private Combo sigalg; private Text alias; private Combo keyalg; private Text text_6; private Text decdata; private Text secdata; private Text sendcer; private Text text_5; private Text recalis; private Text rkeystore; private Text text_2; private Text sendencdata; private Text senddata; private Text recevercer; private Text text_4; private Text sendalias; private Text skeystore; private Text keystorefile; protected Shell shell; public static final int kBufferSize = 8192; public static KeyStore oKs; public static String okeystorefile; public static String oAlias; public static String oPasswd; public static String oRecvcert; public static String oSendcert; public static String oInputfile; public static String oOutputfile; /** * Launch the application * * @param args */ public static void main(String[] args) { try { Fmain window = new Fmain(); window.open(); } catch (Exception e) { e.printStackTrace(); } } /** * Open the window */ public void open() { final Display display = Display.getDefault(); createContents(); shell.open(); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } /** * Create contents of the window */ protected void createContents() { shell = new Shell(); shell.setText("安全报文系统"); shell.setSize(408, 500); final TabFolder tabFolder = new TabFolder(shell, SWT.NONE); tabFolder.setBounds(8, 0, 382, 456); final TabItem tabItem = new TabItem(tabFolder, SWT.NONE); tabItem.setText("生成密钥库"); final Group group = new Group(tabFolder, SWT.NONE); group.setText("密钥库及条目生成"); tabItem.setControl(group); final Label label = new Label(group, SWT.NONE); label.setText("keystore文件名:"); label.setBounds(20, 334, 106, 22); keystorefile = new Text(group, SWT.BORDER); keystorefile.setToolTipText("欲更改密钥库文件,自行输入或点击/"更换库文件/",选择一个已存在的。"); keystorefile.setText("D://mykeystore.keystore"); keystorefile.setBounds(140, 331, 215, 25); final Button button = new Button(group, SWT.NONE); button.addSelectionListener(new codecreateListener()); button.setText("使用代码生成"); button.setBounds(165, 374, 84, 22); final Button button_1 = new Button(group, SWT.NONE); button_1.addSelectionListener(new cercreateListener()); button_1.setText("导出证书"); button_1.setBounds(268, 374, 70, 22); final Label label_7 = new Label(group, SWT.NONE); label_7.setText("alias别名:"); label_7.setBounds(35, 25, 70, 22); final Label label_8 = new Label(group, SWT.NONE); label_8.setToolTipText("密钥类型有:DES,RSA等"); label_8.setText("私钥类型:"); label_8.setBounds(35, 58, 70, 22); final Label label_9 = new Label(group, SWT.NONE); label_9.setText("签名算法:"); label_9.setBounds(193, 58, 60, 22); keyalg = new Combo(group, SWT.NONE); keyalg.setItems(new String[] {"RSA", "DSA"}); keyalg.select(0); keyalg.setBounds(105, 55, 80, 20); alias = new Text(group, SWT.BORDER); alias.setToolTipText("默认别名为mykey"); alias.setText("mykey"); alias.setBounds(105, 24, 80, 25); sigalg = new Combo(group, SWT.NONE); sigalg.setItems(new String[] {"SHA1withRSA", "MD5withDSA", "MD5withRSA", "SHA1withDSA"}); sigalg.select(0); sigalg.setBounds(259, 55, 96, 20); final Label label_11 = new Label(group, SWT.NONE); label_11.setText("keystore密码6位:"); label_11.setBounds(20, 301, 106, 22); keystorepass = new Text(group, SWT.BORDER); keystorepass.setText("111111"); keystorepass.setToolTipText("请确保密码位数为6位以上。"); keystorepass.setBounds(140, 300, 113, 25); final Button button_4 = new Button(group, SWT.NONE); button_4.addSelectionListener(new cmdcreateListener()); button_4.setText("使用CMD生成"); button_4.setBounds(79, 374, 80, 22); final Group group_2 = new Group(group, SWT.NONE); group_2.setText("证书识别信息"); group_2.setBounds(20, 101, 332, 182); final Label label_12 = new Label(group_2, SWT.NONE); label_12.setText("名称:"); label_12.setBounds(10, 25, 54, 22); commonname = new Text(group_2, SWT.BORDER); commonname.setText("长工院"); commonname.setBounds(70, 24, 80, 25); final Label label_10 = new Label(group_2, SWT.NONE); label_10.setBounds(170, 25,64, 22); label_10.setText("证书期限:"); validity = new Combo(group_2, SWT.NONE); validity.setItems(new String[] {"1天", "1个月", "3个月", "一年"}); validity.select(1); validity.setBounds(240, 26,80, 20); final Label label_13 = new Label(group_2, SWT.NONE); label_13.setText("公司:"); label_13.setBounds(10, 62, 54, 22); final Label label_14 = new Label(group_2, SWT.NONE); label_14.setText("部门:"); label_14.setBounds(170, 62, 54, 22); final Label label_15 = new Label(group_2, SWT.NONE); label_15.setText("省份:"); label_15.setBounds(10, 99, 54, 22); final Label label_16 = new Label(group_2, SWT.NONE); label_16.setText("城市:"); label_16.setBounds(170, 99, 54, 22); final Label label_17 = new Label(group_2, SWT.NONE); label_17.setText("国家:"); label_17.setBounds(10, 136, 54, 22); company = new Text(group_2, SWT.BORDER); company.setText("长春研究所"); company.setBounds(70, 61, 80, 25); department = new Text(group_2, SWT.BORDER); department.setText("软件研发部"); department.setBounds(240, 61, 80, 25); state = new Text(group_2, SWT.BORDER); state.setText("吉林"); state.setBounds(70, 98, 80, 25); city = new Text(group_2, SWT.BORDER); city.setText("长春"); city.setBounds(240, 98, 80, 25); country = new Text(group_2, SWT.BORDER); country.setText("CN"); country.setBounds(70, 133, 80, 25); final Button button_5 = new Button(group, SWT.NONE); button_5.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent e) { FileDialog dialog = new FileDialog(shell, SWT.OPEN); dialog.setFilterExtensions(new String[] {"*.keystore", "*.txt", "*.dat", "*.cer", "*.*" }); String file = dialog.open(); if(file!=null) { keystorefile.setText(file); } } }); button_5.setText("更换库文件"); button_5.setBounds(277, 301, 78, 22); final Label label_18 = new Label(group, SWT.NONE); label_18.setText("条目密码:"); label_18.setBounds(193, 25, 60, 22); keypass = new Text(group, SWT.BORDER); keypass.setText("111111"); keypass.setBounds(258, 24, 96, 25); final TabItem tabItem_1 = new TabItem(tabFolder, SWT.NONE); tabItem_1.setText("文件加密"); final Group group_1 = new Group(tabFolder, SWT.NONE); group_1.setText("加密"); tabItem_1.setControl(group_1); final Label label_1 = new Label(group_1, SWT.NONE); label_1.setText("密文文件:"); label_1.setBounds(15, 168, 82, 18); final Label label_2 = new Label(group_1, SWT.NONE); label_2.setText("密钥仓库文件:"); label_2.setBounds(10, 25, 82, 18); final Label label_3 = new Label(group_1, SWT.NONE); label_3.setText("别名:"); label_3.setBounds(15, 63, 64, 18); final Label label_4 = new Label(group_1, SWT.NONE); label_4.setText("待传输文件:"); label_4.setBounds(15, 133, 82, 18); final Label label_5 = new Label(group_1, SWT.NONE); label_5.setText("密钥仓库密码:"); label_5.setBounds(180, 63, 82, 18); final Label label_6 = new Label(group_1, SWT.NONE); label_6.setText("接收者证书:"); label_6.setBounds(15, 98, 82, 18); final Button button_2 = new Button(group_1, SWT.NONE); button_2.addSelectionListener(new secbtnListener()); button_2.setText("加密"); button_2.setBounds(283, 399, 48, 22); skeystore = new Text(group_1, SWT.BORDER); skeystore.setText("C://Documents and Settings//幽游白书//workspace//myswt//mysender.keystore"); skeystore.setBounds(98, 22, 194, 25); sendalias = new Text(group_1, SWT.BORDER); sendalias.setText("sender"); sendalias.setBounds(98, 60, 64, 25); text_4 = new Text(group_1, SWT.BORDER); text_4.setToolTipText("默认为6个/"1/",若不是请点击此处更改"); text_4.setText("111111"); text_4.setBounds(270, 60, 93, 25); recevercer = new Text(group_1, SWT.BORDER); recevercer.setText("myrecever.cer"); recevercer.setBounds(98, 95, 194, 25); senddata = new Text(group_1, SWT.BORDER); senddata.setText("send.txt"); senddata.setBounds(98, 130, 194, 25); sendencdata = new Text(group_1, SWT.BORDER); sendencdata.setText("sendsec.dat"); sendencdata.setBounds(98, 165, 194, 25); final Button button_3 = new Button(group_1, SWT.NONE); button_3.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(final SelectionEvent e) { FileDialog dialog = new FileDialog(shell, SWT.OPEN); dialog.setFilterExtensions(new String[] {"*.keystore","*.*" }); String file = dialog.open(); if(file!=null) { skeystore.setText(file); } } }); button_3.setText("浏览.."); button_3.setBounds(315, 20, 48, 22); final Button button_6 = new Button(group_1, SWT.NONE); button_6.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent e) { FileDialog dialog = new FileDialog(shell, SWT.OPEN); dialog.setFilterExtensions(new String[] {"*.cer","*.keystore", "*.txt", "*.dat", "*.*" }); String file = dialog.open(); recevercer.setText(file); } }); button_6.setText("浏览.."); button_6.setBounds(315, 96, 48, 22); final Button button_7 = new Button(group_1, SWT.NONE); button_7.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent e) { FileDialog dialog = new FileDialog(shell, SWT.OPEN); dialog.setFilterExtensions(new String[] { "*.txt", "*.dat","*.doc", "*.cer", "*.*" }); String file = dialog.open(); if(file!=null) { senddata.setText(file); sendencdata.setText(file+".dat"); } } }); button_7.setText("浏览.."); button_7.setBounds(315, 131, 48, 22); final Button button_8 = new Button(group_1, SWT.NONE); button_8.setEnabled(false); button_8.setText("浏览.."); button_8.setBounds(315, 166, 48, 22); text_2 = new Text(group_1, SWT.WRAP | SWT.READ_ONLY | SWT.MULTI | SWT.BORDER); text_2.setBounds(15, 213, 348, 120); final ProgressBar progressBar = new ProgressBar(group_1, SWT.SMOOTH); progressBar.setRedraw(true); progressBar.setBounds(72, 350, 291, 17); final Label label_19 = new Label(group_1, SWT.NONE); label_19.setText("处理进度"); label_19.setBounds(20, 350, 48, 18); final TabItem tabItem_2 = new TabItem(tabFolder, SWT.NONE); tabItem_2.setText("文件解密"); final Group group_1_1 = new Group(tabFolder, SWT.NONE); group_1_1.setText("解密"); tabItem_2.setControl(group_1_1); final Label label_1_1 = new Label(group_1_1, SWT.NONE); label_1_1.setBounds(15, 168, 82, 18); label_1_1.setText("解码后文件:"); final Label label_2_1 = new Label(group_1_1, SWT.NONE); label_2_1.setBounds(10, 25, 82, 18); label_2_1.setText("密钥仓库文件:"); final Label label_3_1 = new Label(group_1_1, SWT.NONE); label_3_1.setBounds(15, 63, 64, 18); label_3_1.setText("别名:"); final Label label_4_1 = new Label(group_1_1, SWT.NONE); label_4_1.setBounds(15, 133, 82, 18); label_4_1.setText("待解密文件:"); final Label label_5_1 = new Label(group_1_1, SWT.NONE); label_5_1.setBounds(180, 63, 82, 18); label_5_1.setText("密钥仓库密码:"); final Label label_6_1 = new Label(group_1_1, SWT.NONE); label_6_1.setBounds(15, 98, 82, 18); label_6_1.setText("发送者证书:"); final Button button_2_1 = new Button(group_1_1, SWT.NONE); button_2_1.addSelectionListener(new dencfileListener()); button_2_1.setBounds(283, 399, 48, 22); button_2_1.setText("解密"); rkeystore = new Text(group_1_1, SWT.BORDER); rkeystore .setText("E://J2EE//eclipse//workspace//JSecurity//sender.keystore"); rkeystore.setBounds(98, 22, 194, 25); recalis = new Text(group_1_1, SWT.BORDER); recalis.setText("receveralias"); recalis.setBounds(98, 60, 64, 25); text_5 = new Text(group_1_1, SWT.BORDER); text_5.setText("111111"); text_5.setBounds(270, 60, 93, 25); sendcer = new Text(group_1_1, SWT.BORDER); sendcer.setText("sender.cer"); sendcer.setBounds(98, 95, 194, 25); secdata = new Text(group_1_1, SWT.BORDER); secdata.setText("secdatafile.dat"); secdata.setBounds(98, 130, 194, 25); decdata = new Text(group_1_1, SWT.BORDER); decdata.setText("decipherfile.dat"); decdata.setBounds(98, 165, 194, 25); final Button button_3_1 = new Button(group_1_1, SWT.NONE); button_3_1.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent e) { FileDialog dialog = new FileDialog(shell, SWT.OPEN); dialog.setFilterExtensions(new String[] {"*.keystore", "*.*" }); String file = dialog.open(); if(file!=null) { rkeystore.setText(file); } } }); button_3_1.setBounds(315, 20, 48, 22); button_3_1.setText("浏览.."); final Button button_6_1 = new Button(group_1_1, SWT.NONE); button_6_1.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent e) { FileDialog dialog = new FileDialog(shell, SWT.OPEN); dialog.setFilterExtensions(new String[] {"*.keystore", "*.txt", "*.dat", "*.cer", "*.*" }); String file = dialog.open(); if(file!=null) { sendcer.setText(file); } } }); button_6_1.setBounds(315, 96, 48, 22); button_6_1.setText("浏览.."); final Button button_7_1 = new Button(group_1_1, SWT.NONE); button_7_1.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent e) { FileDialog dialog = new FileDialog(shell, SWT.OPEN); dialog.setFilterExtensions(new String[] {"*.keystore", "*.txt", "*.dat", "*.cer", "*.*" }); String file = dialog.open(); if(file!=null) { secdata.setText(file); decdata.setText(file+".dat"); } } }); button_7_1.setBounds(315, 131, 48, 22); button_7_1.setText("浏览.."); final Button button_8_1 = new Button(group_1_1, SWT.NONE); button_8_1.setEnabled(false); button_8_1.setBounds(315, 166, 48, 22); button_8_1.setText("浏览.."); text_6 = new Text(group_1_1, SWT.READ_ONLY | SWT.MULTI | SWT.BORDER); text_6.setBounds(15, 213, 348, 180); } private class browerListener extends SelectionAdapter { public void widgetSelected(final SelectionEvent e) { FileDialog dialog = new FileDialog(shell, SWT.OPEN); dialog.setFilterExtensions(new String[] {"*.keystore","*.*" }); String file = dialog.open(); if(file!=null) { skeystore.setText(file); rkeystore.setText(file); recevercer.setText(file); sendcer.setText(file); // sendalias.setText(file); senddata.setText(file); sendencdata.setText(file+".dat"); secdata.setText(file); decdata.setText(file+".dat"); System.out.println(file); } } } public static void PrintHex(byte data[], int len) { int i; int tmp; String Tmp = ""; for (i = 0; i < len; i++) { if (i % 16 == 0) { System.out.println(""); // 0x0000 if (i < 0x10) Tmp = "0x000"; if ((i < 0x100) && (i >= 0x10)) Tmp = "0x00"; if ((i >= 0x100) && (i < 0x1000)) Tmp = "0x0"; if (i >= 0x1000) Tmp = "0x"; System.out.print(Tmp + Integer.toHexString(i) + "h: "); } tmp = data[i]; if (tmp < 0) tmp = 256 + tmp; if (tmp < 0x10) System.out.print("0" + Integer.toHexString(tmp) + " "); else System.out.print(Integer.toHexString(tmp) + " "); } System.out.println(""); } private class secbtnListener extends SelectionAdapter { public void widgetSelected(final SelectionEvent e) { okeystorefile = skeystore.getText(); oAlias = sendalias.getText(); oPasswd = text_4.getText(); oRecvcert = recevercer.getText(); oInputfile = senddata.getText(); oOutputfile = sendencdata.getText(); try { // 打开发送者keystore文件 oKs = KeyStore.getInstance("JKS"); java.io.FileInputStream fis = new java.io.FileInputStream( okeystorefile); oKs.load(fis, oPasswd.toCharArray()); fis.close(); // 产生随机会话密钥 KeyGenerator keyGen = KeyGenerator.getInstance("DES"); keyGen.init(56); Key key = keyGen.generateKey(); byte[] keyencode = key.getEncoded(); PrintHex(keyencode, keyencode.length); // 读取接收者证书 InputStream inStream = new FileInputStream(oRecvcert); CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509Certificate oCert = (X509Certificate) cf .generateCertificate(inStream); inStream.close(); // 使用接收者证书加密会话密钥 Cipher cipherRsa = Cipher.getInstance("RSA/ECB/PKCS1Padding", new BouncyCastleProvider()); // new org.bouncycastle.jce.provider.BouncyCastleProvider()); cipherRsa.init(Cipher.ENCRYPT_MODE, oCert); byte[] cipherkey = cipherRsa.doFinal(keyencode); PrintHex(cipherkey, cipherkey.length); text_2.setText(okeystorefile + " /n" + oAlias + oPasswd + oRecvcert + oInputfile + oOutputfile); // 对原文进行签名 Key oKey = oKs.getKey(oAlias, oPasswd.toCharArray()); // 创建签名对象/ Signature oSign = Signature.getInstance("SHA1withRSA"); // 初始化签名对象 oSign.initSign((PrivateKey) oKey); // 参数为签名者私钥对象 byte[] signedBuf = null; byte[] buffer = new byte[kBufferSize]; int len; System.out.println(oInputfile); FileInputStream fin = new FileInputStream(new File(oInputfile)); // len = fin.read(buffer); while ((len = fin.read(buffer)) != -1) { System.out.println(Integer.toString(len)); oSign.update(buffer, 0, len); } fin.close(); // // 获得签名值 signedBuf = oSign.sign(); System.out.println("signedBuf:"); PrintHex(signedBuf, signedBuf.length); // 使用会话密钥对文件加密。 Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key); fin = new java.io.FileInputStream(new File(oInputfile)); // |签名信息长度4Bytes|签名信息|会话密钥的密文长度4Bytes|会话密钥密文|原文数据的密文 java.io.FileOutputStream fout = new java.io.FileOutputStream( new File(oOutputfile)); byte[] blen = new byte[4]; int datalen = signedBuf.length; blen[0] = (byte) (datalen & 0xff); blen[1] = (byte) ((datalen >> 8) & 0xff); blen[2] = (byte) ((datalen >> 16) & 0xff); blen[3] = (byte) (datalen >>> 24); fout.write(blen);// 写入签名值长度到输出文件 fout.write(signedBuf);// 写入签名值到输出文件 datalen = cipherkey.length; blen[0] = (byte) (datalen & 0xff); blen[1] = (byte) ((datalen >> 8) & 0xff); blen[2] = (byte) ((datalen >> 16) & 0xff); blen[3] = (byte) (datalen >>> 24); fout.write(blen);// 写入密文会话密钥长度到输出文件 fout.write(cipherkey);// 写入密文会话密钥到输出文件 byte[] cipherbuffer = null; while ((len = fin.read(buffer)) != -1)// 读取原文,加密并写密文到输出文件。 { cipherbuffer = cipher.update(buffer, 0, len); fout.write(cipherbuffer); } fin.close(); cipherbuffer = cipher.doFinal(); fout.write(cipherbuffer); fout.close(); text_2.setText("succeed in file encryption, secret data file is"+oOutputfile); } catch (Exception e3) { text_2.setText("Failure in file encryption."); System.out.println("Error happen in file encryption."); e3.printStackTrace(); } } } private class dencfileListener extends SelectionAdapter { public void widgetSelected(final SelectionEvent e) { okeystorefile = rkeystore.getText(); oAlias = recalis.getText(); oPasswd = text_5.getText(); oSendcert = sendcer.getText(); oInputfile = secdata.getText(); oOutputfile = decdata.getText(); try { // 打开接收者keystore文件 oKs = KeyStore.getInstance("JKS"); java.io.FileInputStream fis = new java.io.FileInputStream( okeystorefile); oKs.load(fis, oPasswd.toCharArray()); fis.close(); /* * 密文文件格式: |签名信息长度4Bytes|签名信息|会话密钥的密文长度4Bytes|会话密钥密文|原文数据的密文 */ // 读取签名值、会话密钥的密文 int len; byte[] blen = new byte[4]; java.io.FileInputStream fin = new java.io.FileInputStream( oInputfile); fin.read(blen);// 读取签名值长度 len = (blen[0] & 0xff) | ((blen[1] << 8) & 0xff00) | ((blen[2] << 24) >>> 8) | (blen[3] << 24); byte[] signedBuf = new byte[len]; fin.read(signedBuf);// 读取签名值 fin.read(blen);// 读取密文会话密钥长度 len = (blen[0] & 0xff) | ((blen[1] << 8) & 0xff00) | ((blen[2] << 24) >>> 8) | (blen[3] << 24); byte[] cipherkey = new byte[len]; fin.read(cipherkey);// 读取密文会话密钥 PrintHex(signedBuf, signedBuf.length); PrintHex(cipherkey, cipherkey.length); // 解密cipherkey Cipher cipherRsa = Cipher .getInstance( "RSA/ECB/PKCS1Padding", new org.bouncycastle.jce.provider.BouncyCastleProvider()); Key oRsaKey = oKs.getKey(oAlias, oPasswd.toCharArray()); cipherRsa.init(Cipher.DECRYPT_MODE, oRsaKey); byte[] keyencode = cipherRsa.doFinal(cipherkey); PrintHex(keyencode, keyencode.length); Key oKey = new SecretKeySpec(keyencode, "DES"); // 解密密文 byte[] buffer = new byte[kBufferSize]; Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, oKey); byte[] plainbuffer = null; java.io.FileOutputStream fout = new java.io.FileOutputStream( new File(oOutputfile)); text_6.setText(okeystorefile + " /n" + oAlias + oPasswd + oSendcert + oInputfile + oOutputfile); while ((len = fin.read(buffer)) != -1) { plainbuffer = cipher.update(buffer, 0, len); fout.write(plainbuffer); } fin.close(); plainbuffer = cipher.doFinal(); fout.write(plainbuffer); fout.close(); // 验证签名 // 读取证书 InputStream inStream = new FileInputStream(oSendcert); CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509Certificate oCert = (X509Certificate) cf .generateCertificate(inStream); inStream.close(); Signature oSign = Signature.getInstance("SHA1withRSA"); oSign.initVerify(oCert); fin = new FileInputStream(new File(oOutputfile)); while ((len = fin.read(buffer)) != -1) { oSign.update(buffer, 0, len); } fin.close(); // 验证签名 boolean bVerifyed = false; bVerifyed = oSign.verify(signedBuf); if (bVerifyed) { text_6.setText("验证签名正确。"); } else { text_6.setText("验证签名不正确,原文可能被篡改!"); } } catch (Exception e4) { System.out.println("Error happen in file decipher."); e4.printStackTrace(); } } } private class cmdcreateListener extends SelectionAdapter { public void widgetSelected(final SelectionEvent e) { int day = 0; switch(validity.getSelectionIndex()) { case 0: day=0; break; case 1: day=30; break; case 2: day=90; break; case 3: day=365; break; } try { String cmd = "keytool -genkey -dname /"CN=" +commonname.getText() +", OU=" +company.getText() +", O=" +department.getText() +", L=" +city.getText() +", S="+state.getText() +", C=" +country.getText() +"/" -alias " +alias.getText() +" -keyalg "+keyalg.getText() +" -sigalg "+sigalg.getText() +" -keystore "+keystorefile.getText() +" -storepass "+keystorepass.getText() +" -keypass "+keypass.getText() +" -validity "+day; Process process = Runtime.getRuntime().exec("cmd /c " + cmd); BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); int res = process.waitFor(); if(0 == res) System.out.println("Succeess!"); else System.out.println("Failed:" + br.readLine()); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (InterruptedException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } } private class cercreateListener extends SelectionAdapter { public void widgetSelected(final SelectionEvent e) { try { String cmd = "keytool -export -alias " +alias.getText() +" -keystore "+keystorefile.getText() +" -storepass "+keystorepass.getText() +" -keypass "+keypass.getText() +" -file "+commonname.getText()+".cer"; Process process = Runtime.getRuntime().exec("cmd /c " + cmd); BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); int res = process.waitFor(); if(0 == res) System.out.println("Succeess!"); else System.out.println("Failed:" + br.readLine()); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (InterruptedException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } } private class codecreateListener extends SelectionAdapter { public void widgetSelected(final SelectionEvent e) { // KeyPairGenerator g=KeyPairGenerator.getInstance(algorithm) Provider pro[]=Security.getProviders(); String name=pro[1].getInfo(); System.out.println(name); Security.addProvider(new BouncyCastleProvider()); // 获得密钥对生成器,提供者指定为Bouncy Castle KeyPairGenerator g = null; try { g = KeyPairGenerator.getInstance("RSA","SunRsaSign"); } catch (NoSuchAlgorithmException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (NoSuchProviderException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // 用SecureRandom()初始化生成器,长度为1024Bit,也可以使用自己的随机数来初始化 g.initialize(1024, new SecureRandom()); // 生成并得到私钥和公钥 KeyPair p = g.generateKeyPair(); PrivateKey privKey = p.getPrivate(); PublicKey pubKey = p.getPublic(); Hashtable attrs = new Hashtable(); attrs.put(X509Principal.CN, "LinYongxiang"); //Common Name, attrs.put(X509Principal.C, "CN"); //国家代码,两位英文,CN为中国 attrs.put(X509Principal.O, "CCIT"); //组织名称 attrs.put(X509Principal.L, "Changchun"); //Locality attrs.put(X509Principal.ST, "JiLin"); //State or Province name // attrs.put(X509Principal.E, "linyongxiang@CA.com"); //Email Address // 产生一个X.509 V3版的证书生成器 X509V3CertificateGenerator certGen = new X509V3CertificateGenerator(); //设置证书信息 certGen.setSerialNumber(BigInteger.valueOf(44)); //序列号, certGen.setIssuerDN(new X509Principal(attrs)); //Issuer certGen.setSubjectDN(new X509Principal(attrs)); //Subject certGen.setNotBefore(new Date(System.currentTimeMillis() - 50000)); certGen.setNotAfter(new Date(System.currentTimeMillis() + 25000000)); //证书有效期 certGen.setPublicKey(pubKey); //设置公钥信息 certGen.setSignatureAlgorithm("SHA1withRSA"); //设置签名算法,各算法代//码请参看BC的API文档 /* X.509证书是经过ASN.1 distinguished encoding rules * (DER) [X.690]编码后的数据。ASN.1 DER编码是将每个元素表达成 * tag, length, value(类型、长度、值)的一种编码系统。(参见。。。) // */ BasicConstraints bc=new BasicConstraints(true,1); // true,本证书执有者为CA certGen.addExtension(new DERObjectIdentifier("2.5.29.19"),true, bc); // 用私钥签名证书 X509Certificate cert = null; try { cert = certGen.generateX509Certificate(privKey); } catch (InvalidKeyException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (SecurityException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (SignatureException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // 验证有效期 try { cert.checkValidity(new Date()); } catch (CertificateExpiredException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (CertificateNotYetValidException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // 用公钥验证证书签名 try { cert.verify(pubKey); } catch (InvalidKeyException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (CertificateException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (NoSuchAlgorithmException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (NoSuchProviderException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (SignatureException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } ByteArrayOutputStream sbOut = new ByteArrayOutputStream(); // 将证书以DER编码 DEROutputStream sdOut = new DEROutputStream(sbOut); // 证书文件用Base64编码(可选) try { sdOut.write(Base64.encode(cert.getEncoded())); //System.out.println(new String(cert.getEncoded())); } catch (CertificateEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } OutputStream fw = null; try { fw = new FileOutputStream("FileName.Cer"); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { sbOut.writeTo(fw); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { fw.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } InputStream inStream = null; try { inStream = new FileInputStream("FileName.Cer"); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } CertificateFactory cf = null; try { cf = CertificateFactory.getInstance("X.509"); } catch (CertificateException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { X509Certificate certs = (X509Certificate)cf.generateCertificate(inStream); } catch (CertificateException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { inStream.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } } 相关图片: