java读取OPENSSL生成的DSA的pem文件
2013-08-23 16:07
483 查看
package aa.aa.aa; import java.io.BufferedReader; import java.io.FileReader; import java.security.Key; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import org.apache.log4j.Logger; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * 常用数字签名算法DSA * */ public class DSACode extends HttpServlet { private static final long serialVersionUID = 1L; private Logger logger = Logger.getLogger(DSACode.class); // 公钥 private static final String PUBLIC_KEY = "DSAPublicKey"; // 私钥 private static final String PRIVATE_KEY = "DSAPrivateKey"; private static final String privatekeyFile = "dsa_private_key.pem"; private static final String publickeyFile = "dsa_public_key.pem"; private static PrivateKey privateKey; private static PublicKey publicKey; private static BASE64Decoder base64decoder = new BASE64Decoder(); private static BASE64Encoder base64encoder = new BASE64Encoder(); private static Map<String, Object> keyMap = new HashMap<String, Object>(); private static String path = ""; /* * (non-Javadoc) * * @see javax.servlet.GenericServlet#init() */ @Override public void init() throws ServletException { // TODO Auto-generated method stub try { path = this.getClass().getClassLoader().getResource("/").getPath(); DSACode.initKey(); } catch (Exception e) { logger.error(e); } super.init(); } /** * 初始化密钥对 * * @return Map 甲方密钥的Map * */ public static Map<String, Object> initKey() throws Exception { initPrivateKey(); initPublicKey(); // 将密钥存储在map中 keyMap = new HashMap<String, Object>(); keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); return keyMap; } /** * 取得私钥 * * @param keyMap * 密钥map * @return byte[] 私钥 * */ public static byte[] getPrivateKey(Map<String, Object> keyMap) { Key key = (Key) keyMap.get(PRIVATE_KEY); return key.getEncoded(); } /** * 取得公钥 * * @param keyMap * 密钥map * @return byte[] 公钥 * */ public static byte[] getPublicKey(Map<String, Object> keyMap) throws Exception { Key key = (Key) keyMap.get(PUBLIC_KEY); return key.getEncoded(); } /** * 读取私钥 */ private static void initPrivateKey() { try { BufferedReader br = new BufferedReader(new FileReader(path + privatekeyFile)); String s = br.readLine(); StringBuffer privatekey = new StringBuffer(); s = br.readLine(); while (s.charAt(0) != '-') { privatekey.append(s + "\r"); s = br.readLine(); } byte[] keybyte = base64decoder.decodeBuffer(privatekey.toString()); KeyFactory kf = KeyFactory.getInstance("DSA"); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keybyte); privateKey = kf.generatePrivate(keySpec); } catch (Exception e) { e.printStackTrace(); } } /** * 读取公钥 */ private static void initPublicKey() { try { BufferedReader br = new BufferedReader(new FileReader(path + publickeyFile)); String s = br.readLine(); StringBuffer publickey = new StringBuffer(); s = br.readLine(); while (s.charAt(0) != '-') { publickey.append(s + "\r"); s = br.readLine(); } byte[] keybyte = base64decoder.decodeBuffer(publickey.toString()); KeyFactory kf = KeyFactory.getInstance("DSA"); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keybyte); publicKey = kf.generatePublic(keySpec); } catch (Exception e) { } } /** * 签名 * * @param content * 待签名字符串 * @return */ public static String sign(String content) { try { Signature signalg = Signature.getInstance("DSA"); signalg.initSign(privateKey); signalg.update(content.getBytes()); byte[] signature = signalg.sign(); String sign = base64encoder.encode(signature); return sign; } catch (Exception e) { } return ""; } /** * 数字校验签名 * * @param signature * 签名串 * @param contecnt * 待校验内容 * @return */ public static boolean verify(String signature, String contecnt) { try { Signature verifyalg = Signature.getInstance("DSA"); verifyalg.initVerify(publicKey); verifyalg.update(contecnt.getBytes()); byte[] signbyte = base64decoder.decodeBuffer(signature); return verifyalg.verify(signbyte); } catch (Exception e) { e.printStackTrace(); } return false; } public static void main(String[] args) { // 初始化密钥 // 生成密钥对 Map<String, Object> keyMap; try { keyMap = DSACode.initKey(); // 公钥 byte[] publicKey = DSACode.getPublicKey(keyMap); // 私钥 byte[] privateKey = DSACode.getPrivateKey(keyMap); System.out.println("公钥:" + base64encoder.encodeBuffer(publicKey)); System.out.println("私钥:" + base64encoder.encodeBuffer(privateKey)); } catch (Exception e) { } String str = "<test></test>"; System.out.println("原文:" + str); // 甲方进行数据的加密 String sign = sign(str); System.out.println("产生签名:" + sign); // 验证签名 boolean status = verify(sign, str); System.out.println("状态:" + status); } }
相关文章推荐
- java读取OPENSSL生成的DSA的pem文件
- .NET 使用OpenSSL生成的pem文件做为RSA Key时的读取问题
- java读取openssl生成的private key文件生成密钥的问题
- 一个完整的类用来读取OpenSSL生成的pem格式的x509证书
- java小程序从数据库中(表)中读取数据然后创建文件夹生成txt文件
- 【JAVA】读取和写入数据库生成的dbf文件
- Java opencsv 生成、读取、下载、删除CSV文件
- java解析dbf之通过javadbf包生成和读取dbf文件
- java读取csv文件生成 sql
- 用java代码实现从excel表格读取数据然后写入生成国际化配置文件properties
- Java读取一个xml文件并生成相应的类
- java读取文件以字节流的形式读取 然后转化为字节流数组,最后经过SHA1加密生成返回16进制字符串存入数据库
- .NET使用OpenSSL生成的pem密钥文件【做电子商务的朋友可能需要】
- Java生成和解析XML格式文件和字符串的实例代码【dom4j中的SAXReader对象读取并解析xml文件】
- java读取excel文件里面的标准代码,并自动生成枚举类的java代码
- openssl pem 生成公钥和私钥及文件
- 从JAVA直接读取EXCEL、WORD并生成PDF文件
- java读取openssl的pkcs8格式的aes128加密的私钥文件
- java-读取文件,过滤敏感字符后生成新文件
- .NET使用OpenSSL生成的pem密钥文件(增加size为2048的密钥转换)【做电子商务的朋友可能需要】