`
阿尔萨斯
  • 浏览: 4110528 次
社区版块
存档分类
最新评论

Java加密算法 DSA 和 数字签名

 
阅读更多
package com.stone.security;

import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)。
 * 简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。
 * 如果数据和签名不匹配则认为验证失败!即 传输中的数据 可以不再加密,接收方获得数据后,拿到公钥与签名 验证数据是否有效
 * 
 * @author stone
 * @date 2014-03-11 09:50:51
 */
public class DSA {
	//不仅可以使用DSA算法,同样也可以使用RSA算法做数字签名
	/*public static final String KEY_ALGORITHM = "RSA";
	public static final String SIGNATURE_ALGORITHM = "MD5withRSA";*/
	
	public static final String KEY_ALGORITHM = "DSA";
	public static final String SIGNATURE_ALGORITHM = "DSA";
	
	public static final String DEFAULT_SEED = "$%^*%^()(HJG8awfjas7"; //默认种子
	public static final String PUBLIC_KEY = "DSAPublicKey";
	public static final String PRIVATE_KEY = "DSAPrivateKey";
	
	public static void main(String[] args) throws Exception {
		String str = "!@#$!#^$#&ZXVDF呆军工路爱着你*()_+";
		byte[] data = str.getBytes();
		
		Map<String, Object> keyMap = initKey();// 构建密钥
		PublicKey publicKey = (PublicKey) keyMap.get(PUBLIC_KEY);
		PrivateKey privateKey = (PrivateKey) keyMap.get(PRIVATE_KEY);
		System.out.println("私钥format:" + privateKey.getFormat());
		System.out.println("公钥format:" + publicKey.getFormat());
		
		
		// 产生签名
		String sign = sign(data, getPrivateKey(keyMap));
		
		// 验证签名 
		boolean verify1 = verify("aaa".getBytes(), getPublicKey(keyMap), sign);
		System.err.println("经验证 数据和签名匹配:" + verify1);   
		
		boolean verify = verify(data, getPublicKey(keyMap), sign);
		System.err.println("经验证 数据和签名匹配:" + verify);   
	}
	
    /**  
     * 生成密钥  
     *   
     * @param seed 种子  
     * @return 密钥对象  
     * @throws Exception  
     */
	public static Map<String, Object> initKey(String seed) throws Exception {
		System.out.println("生成密钥");
		
		KeyPairGenerator keygen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
		SecureRandom secureRandom = new SecureRandom();   
        secureRandom.setSeed(seed.getBytes()); 
        //Modulus size must range from 512 to 1024 and be a multiple of 64
        keygen.initialize(640, secureRandom);  
        
        KeyPair keys = keygen.genKeyPair();
        PrivateKey privateKey = keys.getPrivate();
        PublicKey publicKey = keys.getPublic();
        
        Map<String, Object> map = new HashMap<String, Object>(2);
        map.put(PUBLIC_KEY, publicKey);   
        map.put(PRIVATE_KEY, privateKey);
        return map;
	}
	
	/**  
     * 生成默认密钥  
     *   
     * @return 密钥对象  
     * @throws Exception  
     */  
    public static Map<String, Object> initKey() throws Exception {   
        return initKey(DEFAULT_SEED);   
    }
    
    /**  
     * 取得私钥  
     *   
     * @param keyMap  
     * @return  
     * @throws Exception  
     */  
    public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {   
        Key key = (Key) keyMap.get(PRIVATE_KEY);   
        return encryptBASE64(key.getEncoded()); //base64加密私钥
    }   
  
    /**  
     * 取得公钥  
     *   
     * @param keyMap  
     * @return  
     * @throws Exception  
     */  
    public static String getPublicKey(Map<String, Object> keyMap) throws Exception {   
        Key key = (Key) keyMap.get(PUBLIC_KEY);   
        return encryptBASE64(key.getEncoded()); //base64加密公钥
    }   
	
	/**
	 *  用私钥对信息进行数字签名
	 * @param data	加密数据
	 * @param privateKey 私钥-base64加密的
	 * @return 
	 * @throws Exception
	 */
	public static String sign(byte[] data, String privateKey) throws Exception {
		System.out.println("用私钥对信息进行数字签名");
		
		byte[] keyBytes = decryptBASE64(privateKey);
		PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
		KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
		PrivateKey priKey = factory.generatePrivate(keySpec);//生成 私钥
		
		//用私钥对信息进行数字签名
		Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
		signature.initSign(priKey);
		signature.update(data);
		return encryptBASE64(signature.sign());
	}
	
	/**
	 * BASE64Encoder 加密
	 * @param data 要加密的数据
	 * @return 加密后的字符串
	 */
	private static String encryptBASE64(byte[] data) {
		BASE64Encoder encoder = new BASE64Encoder();
		String encode = encoder.encode(data);
		return encode;
	}
	
	/**
	 * BASE64Decoder 解密
	 * @param data 要解密的字符串
	 * @return 解密后的byte[]
	 * @throws Exception 
	 */
	private static byte[] decryptBASE64(String data) throws Exception {
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] buffer = decoder.decodeBuffer(data);
		return buffer;
	}
	
	/**
	 * 校验数字签名
	 * @param data 加密数据
	 * @param publicKey
	 * @param sign 数字签名
	 * @return
	 * @throws Exception
	 */
	public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
		byte[] keyBytes = decryptBASE64(publicKey); 
		X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);  
		PublicKey pubKey = keyFactory.generatePublic(keySpec);
		
		Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);   
        signature.initVerify(pubKey); 
        signature.update(data);
        
        return signature.verify(decryptBASE64(sign)); //验证签名
	}
	
}

参考地址:http://63938525.iteye.com/blog/1051565

http://www.iteye.com/topic/1122076

分享到:
评论

相关推荐

    java加密算法:Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法

    java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...

    java 加密算法的代码实现

    java 加密算法包括:消息摘要(MD5、SHA)、对称加密算法(DES),非对称加密算法RSA,数字签名DSA

    DSA签名算法的Java实现

    来自StackOverflow的 Jeffrey Walton 的文章中dsa数字签名算法的java实现,包括生成签名,消息签名,验证签名三个功能的实现。

    Java加密技术介绍.docx

    Java加密技术(六)——数字签名算法DSA Java加密技术(七)——非对称加密算法最高级ECC Java加密技术(八)——数字证书 Java加密技术(九)——初探SSL Java加密技术(十)——单向认证 Java加密技术(十一)——...

    java 加解密算法,摘要算法和数字签名算法

    包含Base64 包含对称加密算法:DES,3DEA,AES,PBE 包含对称加密算法:DH,RAS,ElGamal 包含摘要算法:MD2,MD4...数字签名算法:RSA,DSA,ECDSA 详情请查看:http://blog.csdn.net/baidu_34012226/article/details/53331147

    Java中常用的加密算法及其实现原理详解-保护信息的铠甲,静默守护你的隐私

    然后,我们将介绍非对称加密算法,包括RSA和DSA。继而,我们将介绍散列算法,包括MD5和SHA,最后,我们将介绍数字签名算法。  对称加密算法使用相同的密钥对数据进行加密和解密。DES(Data Encryption Standard)...

    rsa-elgamal-dsa.rar_DSA算法_ELGAMAL_dsa_dsa签名算法_elgamal java

    rsa Elgamal及DSA的使用实例,运用此类算法加密解密及签名验签

    Java加密与解密的艺术

    对称加密网络应用2427.8 小结254第8章高等数据加密—非对称加密算法2568.1 非对称加密算法简述2568.2 密钥交换算法—DH 2588.3 典型非对称加密算法—RSA 2698.4 常用非对称加密算法—ElGamal2778.5 实例:非对称加密...

    Java加密与解密的艺术配书源代码

    对称加密网络应用242 7.8 小结254 第8章高等数据加密—非对称加密算法256 8.1 非对称加密算法简述256 8.2 密钥交换算法—DH 258 8.3 典型非对称加密算法—RSA 269 8.4 常用非对称加密算法—ElGamal277 8.5 实例:非...

    常用数字签名算法RSA与DSA的Java程序内实现示例

    主要介绍了常用数字签名算法RSA与DSA的Java程序内实现示例,一般来说DSA算法用于签名的效率会比RSA要快,需要的朋友可以参考下

    java各种加密算法

    JAVA各种加密算法开发,气象万千,包罗万象,详情请下载。

    BM算法+DES算法+DSA签名

    BM算法求线性综合解和DES加密是用C++写的,DSA签名使用java写的。

    Java_security:Java加密算法(Base64、MD5、AES、DES)

    java_security JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy ...数字签名:JDK实现 com.timliu.security.signature 1.RSA 2.DSA 3.ECDSA 五。对称加密算法:com.timliu.security.symmetric_encryption 1

    SHA.rar_DSA java_SHA哈希算法

    SHA加密算法,安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。

    Java常见加密技术全景展示_附Java代码实现

    113页资料全面体现JCE安全,加密算法,绝对有帮助。 如基本的单向加密算法: ● BASE64 严格地说,... ● DSA(Digital Signature Algorithm,数字签名) ● ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)

    JAVA_API1.6文档(中文)

    java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-186 中定义的 DSA(数字签名算法)...

    信息安全课程设计报告

    数字签名算法的编程实现 ...5.1DSA加密算法 10 5.2DSA算法概述 10 5.3 DSA算法原理 10 5.4安全性分析 11 5.5 DSA算法的实现 11 6. 测试 14 6.1认证功能 14 6.2完整性 14 6.3不可抵赖 16 7. 结论 17 参考文献 19 附录 20

    手写SHA1加密算法(Java版)

    1:安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。 2:1byte等于二进制8位,则分成高四位和第四位...

    Java 1.6 API 中文 New

    java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-186 中定义的 DSA(数字签名算法)...

    java api最新7.0

    java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-186 中定义的 DSA(数字签名算法)...

Global site tag (gtag.js) - Google Analytics