`

DSA数字签名例子

 
阅读更多

1、DSA公钥私钥生成类:

import java.io.FileNotFoundException;   
import java.io.FileOutputStream;   
import java.io.IOException;   
import java.io.ObjectOutputStream;   
import java.security.KeyPair;   
import java.security.KeyPairGenerator;   
import java.security.NoSuchAlgorithmException;   
import java.security.SecureRandom;   
  
/**
 * <p>
 * Title:  * 生成DSA密钥对的工具类  
 * 使用方法:java DSAKeyPairGenerator -genkey public.key private.key  
 * public.key--生成的公钥文件名  
 * private.key--生成的私钥文件名  
 * </p>
 * 
 * <p>
 * Description: 
 * </p>
 * 
 * <p>
 * Copyright: 融博技术有限公司 2012
 * </p>
 * 
 * @author 袁泉锋HO174959
 * @version 1.0
 * @date Jul 30, 2012
 *
 */
public class DSAKeyPairGenerator {   
    private static final int KEYSIZE=512;   
    /**  
     * 生成DSA密钥对的工具类  
     * 使用方法:java DSAKeyPairGenerator -genkey public.key private.key  
     * public.key--生成的公钥文件名  
     * private.key--生成的私钥文件名  
     * @param args  
     */  
    public static void main(String[] args) {   
        if(args[0].equals("-genkey")){   
            try {   
                KeyPairGenerator pairgen=KeyPairGenerator.getInstance("DSA");   
                SecureRandom random=new SecureRandom();   
                pairgen.initialize(KEYSIZE, random);   
                KeyPair keyPair=pairgen.generateKeyPair();   
                   
                ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(args[1]));   
                out.writeObject(keyPair.getPublic());   
                out.close();   
                   
                out=new ObjectOutputStream(new FileOutputStream(args[2]));   
                out.writeObject(keyPair.getPrivate());   
                out.close();   
            } catch (NoSuchAlgorithmException e) {   
                // TODO 自动生成 catch 块   
                e.printStackTrace();   
            } catch (FileNotFoundException e) {   
                // TODO 自动生成 catch 块   
                e.printStackTrace();   
            } catch (IOException e) {   
                // TODO 自动生成 catch 块   
                e.printStackTrace();   
            }   
        }   
    }   
  
}  

 

 

2、DSA服务类

import java.io.ObjectInputStream;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
  
  
/**
 * <p>
 * Title: 签名服务类
 * </p>
 * 
 * <p>
 * Description: 
 * </p>
 * 
 * <p>
 * Copyright: 融博技术有限公司 2012
 * </p>
 * 
 * @author 袁泉锋HO174959
 * @version 1.0
 * @date Jul 30, 2012
 *
 */
public class DSAService {   
	private PublicKey publicKey;    //公钥  给对方的
    private PrivateKey privateKey;    //私钥  自己保存好
	public DSAService() throws Exception	{
		try {   
            ObjectInputStream keyIn = new ObjectInputStream(DSAService.class.getResourceAsStream("/bb.key"));   
            privateKey = (PrivateKey) keyIn.readObject();   
            keyIn.close();   
            ObjectInputStream keyIn2 = new ObjectInputStream(DSAService.class.getResourceAsStream("/aa.key")); 
            publicKey = (PublicKey) keyIn2.readObject();   
            keyIn2.close();   
		} catch (Exception e) {   
            throw e;   
        }   
	}
    /**
     * <Description>对内容进行签名
     *
     * @since Jul 30, 2012
     * @param content
     * @return
     * @throws Exception <Description>
     *
     */
    public String sign(String content) throws Exception {   
        try {   
            Signature signalg = Signature.getInstance("DSA");   
            signalg.initSign(privateKey);   
            signalg.update(content.getBytes());   
            byte[] signature = signalg.sign();   
            return encodeHex(signature);   
        } catch (Exception e) {   
        	e.printStackTrace();
            throw e;   
        }   
    }   
  
    /**
     * <Description>对明文进行验签,确定contecnt是否是对方的信息
     *
     * @since Jul 30, 2012
     * @param signature
     * @param contecnt
     * @return
     * @throws Exception <Description>
     *
     */
    public boolean verify(String signature, String contecnt) throws Exception {   
        try {   
            Signature verifyalg = Signature.getInstance("DSA");   
            verifyalg.initVerify(publicKey);   
  
            verifyalg.update(contecnt.getBytes());   
  
            return verifyalg.verify(decodeHex(signature));   
        } catch (Exception e) {   
        	e.printStackTrace();
        	throw e;   
        }   
    }   
    /**
     * <Description>把二进制对象转化为16进制串(用字符串表示)
     *
     * @since Jul 30, 2012
     * @param bytes
     * @return <Description>
     *
     */
    private  String encodeHex(byte[] bytes) {
		StringBuffer buf = new StringBuffer(bytes.length * 2);
		for (int i = 0; i < bytes.length; ++i) {
			if ((bytes[i] & 0xFF) < 16) {
				buf.append("0");
			}
			buf.append(Long.toString(bytes[i] & 0xFF, 16));
		}
		return buf.toString();
	}
    /**
     * <Description>把字符串(该串标表示的是16进制)转化为二进制对象
     *
     * @since Jul 30, 2012
     * @param hex
     * @return <Description>
     *
     */
    private byte[] decodeHex(String hex) {
		char[] chars = hex.toCharArray();
		byte[] bytes = new byte[chars.length / 2];
		int byteCount = 0;
		for (int i = 0; i < chars.length; i += 2) {
			byte newByte = 0;
			newByte = (byte) (newByte | hexCharToByte(chars[i]));
			newByte = (byte) (newByte << 4);
			newByte = (byte) (newByte | hexCharToByte(chars[(i + 1)]));
			bytes[byteCount] = newByte;
			++byteCount;
		}
		return bytes;
	}
	private byte hexCharToByte(char ch) {
		switch (ch) {
		case '0':
			return 0;
		case '1':
			return 1;
		case '2':
			return 2;
		case '3':
			return 3;
		case '4':
			return 4;
		case '5':
			return 5;
		case '6':
			return 6;
		case '7':
			return 7;
		case '8':
			return 8;
		case '9':
			return 9;
		case 'a':
			return 10;
		case 'b':
			return 11;
		case 'c':
			return 12;
		case 'd':
			return 13;
		case 'e':
			return 14;
		case 'f':
			return 15;
		}
		return 0;
	}
	public static void main(String[] aa){
		try {
			DSAService ss = new DSAService();
			String dd = ss.sign("yqf"); //对"yqf"签名
			System.out.println(dd); //签名后
			boolean isSucc = ss.verify(dd, "yqf"); //对明文进行验签
			System.out.println(isSucc); 
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	} 
}  

 

 

 

通过例子,不难发现,DSA只能做签名,不是做加密用的。

签名是什么概念,就是说,你收到一个东西,你要验证下是不是你希望的那个人发送过来的,否则我不要,这就是签名。

分享到:
评论

相关推荐

    C#实现数字签名算法

    数字签名通常基于非对称加密算法,如RSA或DSA。它的工作原理是:发送者使用私钥对消息的哈希值进行加密,这个加密后的结果就是数字签名。接收者收到消息和数字签名后,会使用发送者的公钥解密签名,并计算原始消息的...

    RSA数字签名算法的具体实现

    RSA数字签名算法是一种基于公钥...这个项目对于理解RSA数字签名的工作原理和Java实现提供了直观的例子,对于密码学课程设计或实际应用开发都是宝贵的资源。通过学习和实践,你可以更好地掌握这一关键的网络安全技术。

    signature数字签名

    数字签名的工作原理基于公钥加密算法,如RSA、DSA(数字签名算法)或ECC(椭圆曲线加密)。这些算法通常包括一对密钥:公钥和私钥。公钥是公开的,可以分发给任何需要与你通信的人;而私钥则必须保密,只有拥有者...

    数字签名代码

    数字签名是利用非对称加密算法(如RSA或DSA)生成的,它将原始数据的哈希值与签名者的私钥结合在一起。接收者可以通过验证签名者的公钥和签名来确认数据的完整性和发送者的身份。这种机制可以防止数据被篡改,并能...

    数字签名算法及其比较.docx

    数字签名算法的应用非常广泛,以下是一些典型的例子: 1. 电子商务:在电子商务平台上,卖家可以用数字签名算法对商品信息进行签名,以确保信息的真实性和完整性。买家可以通过验证数字签名来确认商品的真实性。 2....

    数字签名数字签名数字签名

    数字签名是一种重要的信息安全技术,主要用于验证数据的完整性和发送者的身份。在计算机科学,特别是密码学领域,数字签名并非实际的笔迹签名,而是通过复杂的数学算法生成的一段固定长度的二进制数据。这个数据附加...

    数字签名器

    在PurrfectPetShop1.0.exe的例子中,数字签名可能被用来保证软件的源代码完整无损,以及为用户提供一个安全的下载和安装体验。理解并正确使用数字签名对于维护网络安全至关重要,尤其是在处理敏感信息和重要应用程序...

    DSA主题8个

    标题中的“DSA”通常指的是“Dynamic Signature Algorithm”,这是一种在数字签名和加密领域中常见的算法。在IT行业中,DSA常用于确保数据的完整性和来源的不可否认性。它是一种非对称加密算法,由美国国家标准与...

    DSA升级程序

    DSA(Dynamic Signature Algorithm)是一种广泛应用于安全认证和数字签名的技术,尤其在智能卡、嵌入式系统以及软件更新流程中。在这个场景中,"DSA升级程序"指的是一个用于更新DSA相关数据或系统的工具。 DSA...

    数据签名防篡改工作原理和例子

    数据签名是一种用于验证电子信息完整性和发送者身份的技术,它在网络安全和数字信息交换中起着至关重要的作用。在JavaScript开发中,确保应用的安全性尤其重要,因为JavaScript代码通常运行在客户端,更容易受到攻击...

    DSAExample

    在IT领域,数字签名算法(Digital Signature Algorithm,简称DSA)是一种广泛应用的公钥密码学算法,主要用于数据的签名和验证,以确保数据的完整性和发送者的身份。C#是一种广泛用于开发Windows应用程序、Web服务和...

    数字签名,

    数字签名并非我们日常生活中的物理签名,而是一种电子形式的认证,它使用非对称加密算法,如RSA或DSA。在这个过程中,信息发送者(签发者)使用他们的私钥对消息的散列值进行加密,生成一个数字签名。接收者可以通过...

    使用DSA加密

    DSA(Digital Signature Algorithm,数字签名算法)是一种广泛应用于数据加密和验证身份的公钥密码体制。本篇文章将详细探讨如何在Java编程环境下使用DSA进行数据加密。 首先,我们需要理解DSA的基本原理。DSA基于...

    Java加密和数字签名编程快速入门[整理].pdf

    4)数字签名:数字签名是一种用于验证数据完整性和发送者身份的技术。它结合了消息摘要和非对称加密。发送者使用自己的私钥对消息摘要进行加密,接收者可以使用发送者的公钥解密这个签名,然后对比解密后的摘要和...

    纯Java实现数字证书生成签名的简单实例

    在这个例子中,可能使用`KeyPairGenerator.getInstance()`方法指定算法(如RSA或DSA),并设置密钥长度。 2. **证书主体信息**:这通常包括证书序列号、有效期、主题(通常是请求证书的实体信息)、发行者(通常是...

    第六章答案 20141124_1647521

    第六章主要讨论的是数字签名标准(DSS)和其中的具体应用,特别是DSA(Digital Signature Algorithm)算法。DSS是用于确保电子通信中信息完整性和发送者身份验证的一种方法,而DSA是实现这一标准的一种具体算法。 ...

    各种加密算法教学例子

    RSA广泛应用于数字签名和密钥交换,ECC则以其更小的密钥长度和更高的安全性脱颖而出,DSA主要用于数字签名。 3. **哈希函数**:哈希函数将任意长度的输入转换为固定长度的输出,如MD5(Message-Digest Algorithm 5...

    ssh加密技术研究及实现.doc

    * 应用:DSA 算法广泛应用于数字签名、身份验证等领域。 六、安全 SSH 的工作原理 * SSH 的体系结构:SSH 的体系结构包括客户端、服务器端和网络传输层。 * SSH 的认证和加密方式:SSH 使用公钥加密和对称加密来...

Global site tag (gtag.js) - Google Analytics