博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DSA数字签名算法
阅读量:7013 次
发布时间:2019-06-28

本文共 3429 字,大约阅读时间需要 11 分钟。

一、DSA概述

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

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

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、遵循“私钥签名,公钥验证”的原则

转载地址:http://nlqtl.baihongyu.com/

你可能感兴趣的文章
jQuery中的join方法
查看>>
Java内存模型小析之原子性和可见性(二)
查看>>
JSP取得绝对路径
查看>>
ubuntu下修改计算机名
查看>>
WCF:百度百科
查看>>
工作中碰到的一些东西【弹出窗口】【拖放】【异步文件上传】
查看>>
浏览器中beforeunload的使用
查看>>
15.8. 日志
查看>>
如何利用docker 构建golang线上部署环境
查看>>
redis之(二十)redis的总结一
查看>>
spring boot sso
查看>>
Python Module_os_操作系统
查看>>
阿里云异构计算产品家族之数据智能,加速AI智能创新
查看>>
最新Do Not Track标准问世:网站都应尊重用户选择
查看>>
逾半数全球商业领袖认同智能自动化,但首先要解决员工的抵触情绪
查看>>
被忽视的Web安全漏洞:如何识别和解决?
查看>>
“懒惰”Linux管理员的10个关键技巧
查看>>
SDN网络的构建及通信业务与光纤引入
查看>>
七个你无法忽视的 Git 使用技巧
查看>>
《系统分析与设计方法及实践》一1.5 小结
查看>>