📄 dsa.java.svn-base
字号:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package mytools;import java.io.*;import java.security.*;import java.security.spec.*;/** * * @author DJ尐舞 */public class DSA { /** * 认证签名 * @param content 内容 * @param signed 签名 * @param encodedPubKey 经过X.509编码的公钥字节数组 * @return 返回只是认证结果 */ public static boolean validate(byte[] content, byte[] signed, byte[] encodedPubKey) { // 第三步 // 其他人通过公共方式得到此户的公钥和文件 // 其他人用此户的公钥,对文件进行检查,如果成功说明是此用户发布的信息. // try { //通过密钥工厂将编码过的公钥解码得到公钥 X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encodedPubKey); System.out.println("公钥:"+DSA.byte2hex(encodedPubKey));// X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(generatekey().getPublic().getEncoded()); KeyFactory keyFactory = KeyFactory.getInstance("DSA"); PublicKey pubkey = keyFactory.generatePublic(pubKeySpec); java.security.Signature signetcheck = java.security.Signature.getInstance("DSA"); signetcheck.initVerify(pubkey); signetcheck.update(content); if (signetcheck.verify(signed)) { System.out.println("签名正常"); return true; } } catch (java.lang.Exception e) { e.printStackTrace(); } System.out.println("签名失败"); return false; } /** * 对内容进行签名 * @param content 要进行签名的内容 * @return 签名的字节数组 * @throws java.lang.Exception 签名过程中的所有异常 */ public static byte[] sign(byte[] content, String userName) throws java.lang.Exception {//通过从目录下读取私钥prikey.dat来签名信息 java.io.ObjectInputStream in = new java.io.ObjectInputStream(new java.io.FileInputStream(userName + ".prikey")); PrivateKey prikey = (PrivateKey) in.readObject(); in.close(); // 用私钥对信息生成数字签名 java.security.Signature signet = java.security.Signature.getInstance("DSA"); signet.initSign(prikey); signet.update(content);// System.out.println("signed(签名内容)=" + byte2hex(signed)); return signet.sign(); // 对信息的数字签名 } /** * 生成密钥对 * @return 密钥对 * @throws java.security.NoSuchAlgorithmException 找不到DSA算法 */ public static KeyPair generatekey() throws NoSuchAlgorithmException { KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA"); keygen.initialize(512);//初始化512位的密钥 return keygen.genKeyPair(); } /** * 保存私钥 * @param encodedPriKey * @return 是否保存成功 */ public static boolean savePrikey(byte[] encodedPriKey, String userName) { java.io.ObjectOutputStream out = null; try { //对于DSA的私钥是用PKCS#8编码 PKCS8EncodedKeySpec priKeySpec = new PKCS8EncodedKeySpec(encodedPriKey); KeyFactory keyFactory = KeyFactory.getInstance("DSA"); PrivateKey prikey = keyFactory.generatePrivate(priKeySpec); out = new java.io.ObjectOutputStream(new java.io.FileOutputStream(userName + ".prikey")); out.writeObject(prikey); out.close(); return true; } catch (IOException ex) { ex.printStackTrace(); System.out.println("保存私钥失败"); } catch (InvalidKeySpecException ex) { ex.printStackTrace(); System.out.println("保存私钥失败:密钥无效"); } catch (NoSuchAlgorithmException ex) { ex.printStackTrace(); System.out.println("保存私钥失败:找不到DSA算法"); } finally { try { out.close(); } catch (IOException ex) { } } return false; } /** * 将字节数组转换为十六进制字符串 * @param 字节数组 * @return 十六进制数字符串 */ public static String byte2hex(byte[] b) { String hs = ""; String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) { hs = hs + "0" + stmp; } else { hs = hs + stmp; } if (n < b.length - 1) { hs = hs + ":"; } } return hs.toUpperCase(); }}// public static boolean generatekey(byte[] encodedPubkey, byte[] encodedPrikey) {// try {// KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA");// keygen.initialize(512);//初始化512位的密钥// KeyPair keys = keygen.genKeyPair();// PublicKey pubkey = keys.getPublic();// PrivateKey prikey = keys.getPrivate();//// java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(// new java.io.FileOutputStream("prikey.dat"));// out.writeObject(prikey);// out.close();// System.out.println("创建私钥成功");// out = new java.io.ObjectOutputStream(new java.io.FileOutputStream(// "pubkey.dat"));// out.writeObject(pubkey);// out.close();// System.out.println("创建公钥成功");// System.out.println("生成密钥对成功");// return true;// } catch (java.lang.Exception e) {// e.printStackTrace();// System.out.println("生成密钥对失败");// return false;// }//// }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -