理解DSA算法原理

本文介绍了数字签名的概念及其在电子信息传输中的作用,重点解析了DSA(Digital Signature Algorithm)的原理和实现过程,包括密钥生成、签名算法和验证算法。DSA涉及到的参数如p、q、g和公私钥的生成方法进行了详细阐述,并提到了DSA在实际应用中的安全性考虑。此外,还提及了相关接口如DSAPublicKey和Signature在实现数字签名功能中的作用。

数字签名是一种以电子形式给消息签名的方法,是只有信息发送方才能进行的签名、信息发送方进行签名后将产生一段任何人都无法伪造的字符串,这段特殊的字符串同时也是对签名真实性的一种证明。电子信息在传输过程中,通过数字签名达到与传统手写签名相同的效果。
数字签名的实现原理简单地说,就是发送方利用hash算法对要传送的信息计算得到一个固定长度的消息摘要值,用发送方的私钥加密此消息的hash值所生成的密文即数字签名;然后将数字签名和消息一同发送给接收方。接收方收到消息和数字签名后,用同样的hash算法对消息进行计算,得到新的hash值,再用发送方的公钥对数字签名解密,将解密后的结果与新的hash值比较,如果相等则说明消息确实来自发送方。
一,简述
DSA(Digital Signature Algorithm)源于ElGamal和Schnorr签名算法,1991年被美国NIST采纳为数字签名标准

DSA算法中应用了下述参数:
p:L bits长的素数。L是64的倍数,范围是512到1024;
q:p – 1的160bits的素因子;
g:g = h^((p-1)/q) mod p,h满足h < p – 1, h^((p-1)/q) mod p > 1;
p, q,g可由一组用户共享,但在实际应用中,使用公共模数可能会带来一定的威胁。
x:x < q,x为私钥 ;
y:y = g^x mod p ,(p, q, g, y )为公钥;
H( x ):One-Way Hash函数。DSS中选用SHA( Secure Hash Algorithm)

1.密钥生成算法
1)选取160比特长的素数q和比特长的素数,满足,其中且;
2)随机选取正整数h,1<h<(p-1),令>1;q,p和g作为系统公开参数;
3)每个用户,随机选取正整数,,计算;用户的公钥为y,私钥为x。
2.签名算法
对于消息M,首先随机选取整数k,,计算

则M的签名为,其中H为Hash函数SHA。
3.验证算法
接收方收到消息M和签名后,计算

验证等式

如果成立,则说明消息确实来自发送方。
DSA算法实验步骤和调试过程

DSA算法实验步骤和调试过程

/***
 * wulara
 * 豆瓣:尧白
 * 交个盆友吧~
 * 
 */


import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.DSAPrivateKey;
import java.security.interfaces.DSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.xml.bind.DatatypeConverter;
public class DSAUtil {
	private static String src = "I LOVE CHINA!";

	public static void main(String[] args) {
	    jdkDSA();
	}

	public static void jdkDSA() {
	    // 1. 初始化 秘钥
	    try {
	        KeyPairGenerator generator = KeyPairGenerator.getInstance("DSA");
	        generator.initialize(512);

	        KeyPair keyPair = generator.generateKeyPair();
	        DSAPublicKey dsaPublicKey = (DSAPublicKey) keyPair.getPublic();
	        DSAPrivateKey dsaPrivateKey = (DSAPrivateKey) keyPair.getPrivate();
	        System.out.println("public="+dsaPublicKey);
	     
	        System.out.println("x="+dsaPrivateKey.getX());
	   

	        // 2。 执行签名
	        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded());
	        KeyFactory factory = KeyFactory.getInstance("DSA");
	        PrivateKey privateKey = factory.generatePrivate(pkcs8EncodedKeySpec);

	        Signature signature = Signature.getInstance("SHA1withDSA");
	        signature.initSign(privateKey);
	        signature.update(src.getBytes());
	        byte[] sign = signature.sign();
	System.out.println("sign=\n"+DatatypeConverter.printHexBinary(sign));
	        // 验证签名
	        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded());

	        factory = KeyFactory.getInstance("DSA");
	        PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec);

	        signature = Signature.getInstance("SHA1withDSA");
	        signature.initVerify(publicKey);
	        signature.update(src.getBytes());

	        boolean verify = signature.verify(sign);

	        System.out.println(verify);

	    } catch (Exception e) {
	        e.printStackTrace();
	    }

	}
}


DSAPublicKey
DSA 公用密钥的接口
3、DSAPublicKey
DSA 专用密钥的接口
4、PKCS8EncodedKeySpec
PKCS8EncodedKeySpec类继承EncodedKeySpec类,以编码格式来表示私钥。
PKCS8EncodedKeySpec类使用PKCS#8标准作为密钥规范管理的编码格式
5、Signature
Signature 类用来为应用程序提供数字签名算法功能。数字签名用于确保数字数据的验证和完整性。
在所有算法当中,数字签名可以是 NIST 标准的 DSA,它使用 DSA 和 SHA-1。可以将使用 SHA-1 消息摘要算法的 DSA 算法指定为 SHA1withDSA。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阢Lara

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值