用DSA算法实现数字签名

下面是一个在JAVA语言中,使用 DSA签名算法 来进行 进行数字签名的一个示例。
DSA (Digital Signature Algorithm)是Schnorr和ElGamal签名算法的变种,被美国NIST作为数字签名标准(DigitalSignature Standard)。
参照JDK文档中关于Signature类的叙述:NIST标准的DSA算法应该本身就包含了 散列算法 SHA-1 加密算法 DSA
Signature.getInstance("DSA") 等同于 Signature.getInstance("SHA1withDSA");
如果使用 DSA 作为数字签名的加密算法,则只能使用 SHA1 作为消息散列(即消息摘要)算法。
如果使用 RSA 为数字签名加密算法,对消息摘要算法则会有多种选择,因此,可以将签名算法指定为  MD2withRSA MD5withRSA  或 SHA1withRSA
关于使用RSA实现数字签名请参照《 用RSA实现数字签名
如果你对 数字签名 还不熟悉,请先阅读《 数字签名简介 》及《 Java的数字签名和数字证书
DSA_Demo.java文件
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
public class DSA_Demo {
DSA_Demo()
{
init();
}
private void init()
{
prepare();
doSenderWork();
doReceiverWork();
}
//share by sender and receiver
Signature  sign;
//belong to sender,it visible to sender and receiver
PublicKey  publicKey;
//belong to sender,it is only visible to sender
PrivateKey  privateKey;
private void prepare()
{
KeyPairGenerator keyGen=null;
try {
//实例化一个DSA算法的公钥/私钥对生成器
keyGen=KeyPairGenerator.getInstance(" DSA");
catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int keysize=1024;
//设置公钥/私钥对的长度
keyGen.initialize(keysize);
//生成一个RSA算法的公钥/私钥
KeyPair keyPair=keyGen.generateKeyPair();
privateKey=keyPair.getPrivate();
publicKey=keyPair.getPublic();
try {
//实例化一个DSA签名算法的Signature.
sign=Signature.getInstance(" DSA");
catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
void doSenderWork()
{
String words="This is robin.How are you?This a DSA Signature Demo";
Message msg=new Message(words.getBytes());
try {
//设置加密散列码用的私钥
sign.initSign(privateKey);
catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
//设置散列算法的输入
sign.update(msg.getBody());
catch (SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte data[]=null;
try {
//进行散列,对产生的散列码进行加密并返回
data=sign.sign();
catch (SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//把加密后散列(即签名)加到消息中
msg.setSignature(data);
//发送消息
sendMsg(msg);
}
Message sendingMsg;
void sendMsg(Message sendMsg)
{
sendingMsg=sendMsg;
System.out.println("sending Message Signed by DSA");
}
void doReceiverWork()
{
//收到消息
Message msg=getReceivedMsg();
try {
//设置解密散列码用的公钥。
sign.initVerify(publicKey);
catch (InvalidKeyException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
//设置散列算法的输入
sign.update(msg.getBody());
catch (SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
/*进行散列计算,比较计算所得散列码是否和解密的散列码是否一致。
 * 一致则验证成功,否则失败
*/
if( sign.verify(msg.getSignature()))
{
System.out.println("数字签名验证成功!");
}
else
{
System.out.println("数字签名验证失败!");
}
catch (SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Message getReceivedMsg()
{
System.out.println("receiving Message");
return sendingMsg;
}
}
class Message
{
private byte [] body;
private byte [] signature;
Message( byte data[])
{
body=data;
}
byte[] getBody()
{
return body;
}
byte[] getSignature()
{
return signature;
}
void setSignature( byte data[])
{
signature=data;
}
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DSA(Digital Signature Algorithm数字签名算法是一种常用的数字签名算法,其基于离散对数问题,利用数论知识和哈希函数来实现数字签名。下面是一份C语言实现DSA数字签名算法示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <openssl/bn.h> #include <openssl/dsa.h> #define P_BITS 1024 #define Q_BITS 160 int main() { // 初始化DSA结构体 DSA *dsa = DSA_new(); DSA_generate_parameters_ex(dsa, P_BITS, NULL, Q_BITS, NULL, NULL, NULL); // 生成DSA密钥对 DSA_generate_key(dsa); // 待签名的原始数据 char *msg = "Hello, world!"; // 计算哈希值 unsigned char hash[SHA_DIGEST_LENGTH]; SHA1((unsigned char *)msg, strlen(msg), hash); // 签名 unsigned char *sig = (unsigned char *)malloc(DSA_size(dsa)); unsigned int sig_len; DSA_sign(0, hash, SHA_DIGEST_LENGTH, sig, &sig_len, dsa); // 验证签名 int ret = DSA_verify(0, hash, SHA_DIGEST_LENGTH, sig, sig_len, dsa); if (ret == 1) { printf("DSA signature verification succeeded!\n"); } else { printf("DSA signature verification failed!\n"); } // 释放内存 free(sig); DSA_free(dsa); return 0; } ``` 在该示例代码中,我们使用了OpenSSL库中提供的DSA相关API来实现DSA数字签名算法。具体步骤如下: 1. 使用`DSA_generate_parameters_ex()`函数生成DSA结构体的参数; 2. 使用`DSA_generate_key()`函数生成DSA密钥对; 3. 计算待签名数据的哈希值; 4. 使用`DSA_sign()`函数进行签名; 5. 使用`DSA_verify()`函数进行签名验证。 其中,签名和验签函数中的第一个参数表示消息类型,我们使用了默认值0。在实际使用中,可以根据具体应用场景选择不同的消息类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值