数字签名是一种以电子形式给消息签名的方法,是只有信息发送方才能进行的签名、信息发送方进行签名后将产生一段任何人都无法伪造的字符串,这段特殊的字符串同时也是对签名真实性的一种证明。电子信息在传输过程中,通过数字签名达到与传统手写签名相同的效果。
数字签名的实现原理简单地说,就是发送方利用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。
本文介绍了数字签名的概念及其在电子信息传输中的作用,重点解析了DSA(Digital Signature Algorithm)的原理和实现过程,包括密钥生成、签名算法和验证算法。DSA涉及到的参数如p、q、g和公私钥的生成方法进行了详细阐述,并提到了DSA在实际应用中的安全性考虑。此外,还提及了相关接口如DSAPublicKey和Signature在实现数字签名功能中的作用。

442

被折叠的 条评论
为什么被折叠?



