DSA算法是1991年美国国家标准技术协会公布的数字签名标准(DSS)的核心算法。本质上是ElGamal数字签名算法,仅能与SHA系列算法结合,没有相应的MD融合算法。

DSA算法和RSA算法的异同

DSA算法是DSS技术的核心算法,与RSA算法的异同如下:

  • 二者都是数字签名算法中的重要组成,缺一不可;
  • DSA算法仅仅包含数字签名算法,没有密钥信息;
  • DSA算法产生的数字证书无法进行加密通信,HTTPS不会使用这个算法;
  • RSA算法包含加解密的密钥信息,同时又数字签名算法的作用;

算法家族

包含:SHA1withDSA、SHA224withDSA、SHA256withDSA、SHA384withDSA、SHA512withDSA五种算法。

密钥长度都是512-1024位。

Java中的算法实现

JDK 6实现了DSA算法,仅仅实现了SHA1withDSA算法。

示例代码,代码和RSA数字签名算法的一样,只不过是算法名字变了下,可见Java的API设计还是很不错的。

public class SignatureTest {//唯一不一样的是这里public static final String SIGN_ALGORITHM = "SHA1withDSA";private static final String KEY_ALGORITHM = "RSA";private static final int KEY_SIZE = 1024;public static void main(String[] args) throws Exception {KeyPair keyPair = initKey();String input = "Sign Me";byte[] sign = sign(input.getBytes(), keyPair.getPrivate().getEncoded());boolean verify = verify(input.getBytes(), sign, keyPair.getPublic().getEncoded());String msg = String.format("原始数据: %s , Sign : %s , Verify : %s", input, toBase64(sign), verify);System.out.println(msg);// 从二进制位角度看,sign的长度和密钥长度一致System.out.println("Sign Size : " + (sign.length * 8) + " Key Size : " + KEY_SIZE);}public static KeyPair initKey() throws Exception {KeyPairGenerator keyPairGr = KeyPairGenerator.getInstance(KEY_ALGORITHM);keyPairGr.initialize(KEY_SIZE);KeyPair keyPair = keyPairGr.generateKeyPair();return keyPair;}public static byte[] sign(byte[] data, byte[] privateKey) throws Exception {// 将byte[]的key格式化回来PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKey);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);// 获取算法实例并初始化Signature signature = Signature.getInstance(SIGN_ALGORITHM);signature.initSign(priKey);signature.update(data);byte[] sign = signature.sign();return sign;}public static boolean verify(byte[] data, byte[] sign, byte[] publicKey) throws Exception {// 获取算法实例并初始化X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKey);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);Signature signature = Signature.getInstance(SIGN_ALGORITHM);signature.initVerify(pubKey);signature.update(data);// 验证数据和签名是否一致,放否认,放篡改boolean verify = signature.verify(sign);return verify;}public static String toBase64(byte[] data) {return new String(Base64.getEncoder().encode(data));}}

数字签名技术 -- DSA算法相关推荐

  1. 数字签名技术以及RSA算法的原理实现

    数字签名技术 1)对称加密与非对称加密 对称加密:对文件的加密和解密采用的都是同一个密钥,有IDEA和DES两种加密算法 非对称加密:有一对公钥和私钥 如果我们使用公钥加密,必须得用私钥解密:如果使用 ...

  2. 用DSA算法实现数字签名

    下面是一个在JAVA语言中,使用DSA签名算法来进行进行数字签名的一个示例. DSA(Digital Signature Algorithm)是Schnorr和ElGamal签名算法的变种,被美国NI ...

  3. RSA密码算法和数字签名技术

    目录 密钥生成过程 加密和解密 举例 数字签名技术 举例 中国剩余定理 密钥生成过程 1.选取两个不同的大素数p和q,为了安全程度最大,p和q长度一致,计算模n=pq: 2.计算模n的欧拉函数:φ(n ...

  4. python实现RSA数字签名(纯算法实现)

    python实现RSA数字签名(纯算法实现) 一:什么是数字签名 数字签名是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明.它是一种类 ...

  5. 基于java的数字签名技术在电子政务中的应用

    肖蕾    杨世平      摘要  本文介绍了数字签名技术在电子政务中的应用,传统的数字签名技术都是基于非对称的密码算法,原文以明文的方式传送,在这种方式下,原文的安全性受到了极大的威胁,因此,本文 ...

  6. 1、【java数据安全】数据安全之加密解密(base64、MD、SHA、DES、AES、IDEA、PBE、DH、RSA、EIGamal)、数字签名(DSA、ECDSA)和数字证书介绍、应用示例详细介绍

    java数据安全 系列文章 1.[java数据安全]数据安全之加密解密(base64.MD.SHA.DES.AES.IDEA.PBE.DH.RSA.EIGamal).数字签名(DSA.ECDSA)和数 ...

  7. [签名算法]DSA 算法

    DSA(Digital Signature Algorithm)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard). DSA ...

  8. 密码学专题 非对称加密算法指令概述 DSA算法指令

    DSA算法和DSA指令概述 DSA算法是美国国家标准的数字签名算法,只具备数字签名的功能不具备密钥交换的功能 生成DSA参数然后生成DSA密钥,DSA参数决定了DSA密钥的长度 三个指令 首先是dsa ...

  9. 奇妙的安全旅行之DSA算法

    hi,大家好,我是开发者FTD.今天我们来介绍一下非对称加密算法中的DSA算法. DSA 算法简介 DSA(Digital Signature Algorithm)是Schnorr和ElGamal签名 ...

最新文章

  1. tcp窗口滑动以及拥塞控制
  2. Unreal4 IOS上使用第三方库和C++11 特性问题解决
  3. 寄存器位域、位操作等示例
  4. Redis zset(ziplist,skiplist)内部实现
  5. jsp注释%-- -- % 和 !-- -- 的区别
  6. oracle归档文件管理
  7. 页面回收之shrink_zone的实现
  8. python根据题库答案自动答题器_python实现百万答题自动百度搜索答案
  9. Zipkin-1.19.0学习系列2:Nodejs范例(Client Send,Client Receive))
  10. Redis详细下载安装教程
  11. cd linux自带系统安装,大神示范win7系统将CDLinux装入硬盘的法子
  12. 百度收录提交 网站快速收录提交方法【附工具】
  13. java页面展示_JAVA页面展示问题
  14. 第一次学游泳技巧_包你第一次下水就能学会游泳的方法
  15. 基于单片机的RFID刷卡门禁电路设计(#0206)
  16. 产品设计指南:如何从零设计一款手机端产品(APP)?
  17. [转]关于iOS多线程,你看我就够了
  18. The Fool HDU 6555 思维/数论
  19. 单表有父子关系,已知一个id,得到子级、孙级、曾孙级。。。
  20. Flutter自定义 TabBar

热门文章

  1. 处理日期和时间的 chrono 库
  2. 关于莱布尼茨函数乘积的求导公式
  3. double小数点后最多几位_java,double精确到小数点第几位?
  4. 《高可用的HDFS》——元数据备份方案
  5. JavaScript在线文本编辑的实现
  6. neo4j构建农业知识图谱
  7. Java面试三件套:基础+多线程+___?
  8. 子域间互访文件服务器,搭建子域dns服务器
  9. 2006年培养学员8万人,每年增长25%,请问按此增长速度,到哪一年培训学员人数将达到20万人?
  10. jQuery房贷计算器插件代码下载