DSA数字签名算法

一、DSA概述
为了确保数据传输的安全性,不得不采取一系列的安全技术,如加密技术、数字签名、身份认证、密钥管理、防火墙、安全协议等。其中数字签名就是实现网上交易安全的核心技术之一,它可以保证信息传输的保密性、数据交换的完整性、发送信息的不可否认性、交易者身份的确定性等。

有关数据类型和数据转换处理请参考上海尚学堂以下两篇文章《数据类型及其转换》、《ajax+json数据处理

DSA(Digital Signature Algorithm,数字签名算法,用作数字签名标准的一部分),它是另一种公开密钥算法,它不能用作加密,只用作数字签名。DSA使用公开密钥,为接受者验证数据的完整性和数据发送者的身份。它也可用于由第三方去确定签名和所签数据的真实性。DSA算法的安全性基于解离散对数的困难性,这类签字标准具有较大的兼容性和适用性,成为网络安全体系的基本构件之一。

数字签名在ISO7498—2标准中定义为:“附加在数据单元上的一些数据,或是对数据单元所作的密码变换,这种数据和变换允许数据单元的接收者用以确认数据单元来源和数据单元的完整性,并保护数据,防止被人(例如接收者)进行伪造”。 数字签名是通过一个单向函数对要传送的信息进行处理得到的用以认证信息来源并核实信息在传送过程中是否发生变化的一个字母数字串。数字签名提供了对信息来源的确定并能检测信息是否被篡改。

二、DSA原理

图片描述

处理过程: (采用双重加密)
(1)使用SHA编码将发送文件加密产生128bit的数字摘要;
(2)发送方用自己的专用密钥对摘要再加密,形成数字签名;
(3)将原文和加密的摘要同时传给对方;
(4)接受方用发送方的公共密钥对摘要解密,同时对收到的文件用SHA编码加密产生同一摘要;
(5)将解密后的摘要和收到的文件在接受方重新加密产生的摘要相互对比,如果两者一致,则说明在传送过程中信息没有破坏和篡改。否则,则说明信息已经失去安全性和保密性。

三、JDK中对于DSA的实现
1、KeyPairGenerator

KeyPairGenerator 类用于生成公钥和私钥对。密钥对生成器是使用 getInstance 工厂方法(返回一个给定类的实例的静态方法)构造的。 

特定算法的密钥对生成器可以创建能够与此算法一起使用的公钥/私钥对。它还可以将特定于算法的参数与每个生成的密钥关联。
有两种生成密钥对的方式:与算法无关的方式和特定于算法的方式。

下面我们将按照指定RSA算法去生成秘钥KeyPairGenerator.getInstance("RSA");

2、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的实现步骤类似于我们之前学习的RSA数字签名算法.

实现步骤

第一步:初始化化秘钥组,生成DSA算法的公钥和私钥
第二步:执行私钥签名, 使用私钥签名,生成私钥签名
第三步:执行公钥签名,生成公钥签名
第四步:使用公钥验证私钥签名

备注:所谓的公钥与私钥匙成对出现。 遵从的原则就是“私钥签名、公钥验证”。

示例代码如下:

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 = "hello";

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();

        // 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(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();
    }

}

}

五、DSA算法特点
1、DSA是以RSA为基础形成的
2、java6提供了DSA的实现,但是java6只提供了SHA1withDSA的实现
3、bouncycastle扩展提供了其他的DSA实现方式
4、遵循“私钥签名,公钥验证”的原则

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值