奇妙的安全旅行之DSA算法

hi,大家好,我是开发者FTD。今天我们来介绍一下非对称加密算法中的DSA算法。

DSA 算法简介

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

DSA是一种更高级的验证方式,它是一种公开密钥算法,不能用来加密数据,一般用于数字签名和认证。DSA 不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。在DSA数字签名和认证中,发送者使用自己的私钥对文件或消息进行签名,接受者收到消息后使用发送者的公钥来验证签名的真实性,包括数据的完整性以及数据发送者的身份。如果数据和签名不匹配则认为验证失败!数字签名的作用就是校验数据在传输过程中不被修改。

DSA数字签名可以理解为是单向加密的升级,不仅校验数据完整性,还校验发送者身份,同时还由于使用了非对称的密钥来保证密钥的安全,所以相比消息摘要算法更安全。

DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多。

DSA 算法签名过程

在这里插入图片描述

  1. 使用消息摘要算法将要发送数据加密生成信息摘要。
  2. 发送方用自己的DSA私钥对信息摘要再加密,形成数字签名。
  3. 将原报文和加密后的数字签名一并通过互联网传给接收方。
  4. 接收方用发送方的公钥对数字签名进行解密,同时对收到的数据用消息摘要算法产生同一信息摘要。
  5. 将解密后的信息摘要和收到的数据在接收方重新加密产生的摘要进行比对校验,如果两者一致,则说明在传送过程中信息没有破坏和篡改;否则,则说明信息已经失去安全性和保密性。

DSA 算法原理

DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。

DSA 算法参数定义
  • p:一个素模数,其值满足:2^(L-1) < p < 2^L,其中L是64的倍数,且满足512≤ L ≤ 1024
  • q:(p-1)的素因子,其值满足2^159 < q < 2^160,即q长度为160位。
  • g:g = powm(h,(p-1)/q,p)。h为满足1 < h < p-1 的任意整数,从而有powm(h,(p-1)/q,p) > 1
  • x:私钥。x为一个随机或伪随机生成的整数,其值满足 0 < x < q。
  • y:公钥。y = powm(g,x,p)

注:

  1. 整数p,q,g可以公开,也可以仅由一组特定用户共享。
  2. 私钥x和公钥y称为一个密钥对(x,y),私钥只能由签名者本人独自持有,公钥则可以公开发布。密钥对可以在一段时间内持续使用。
DSA 签名过程:
  1. 产生一个随机数k,其值满足 0 < k < q
  2. 计算r = powm(g,k,p) mod q,其值满足 r > 0
  3. 计算 s = (k^(-1)(SHA(M) + x * r)) mod q,其值满足 s > 0

注:

  1. k^(-1) 表示整数k关于某个模数的逆元,并非指k的倒数。k在每次签名时都要重新生成,用于不要将同样的k用于进行其他的签名运算!

    • 逆元:满足(a * b) mod m = 1 的a 和 b 互为关于模数 m 的逆元,表示为 a = b^(-1) 或 b = a^(-1)。如(2 * 5) mod 3 = 1,则 2 和 5 互为模数 3 的逆元。
  2. SHA(M): M 的 hash 值,M为待签名的明文。SHA 是一个单向散列函数。DSS中选用SHA1算法,此时SHA(M) 为160 bits长的数字串,其满足不可逆和抗碰撞性。

  3. 最终的签名就是证书对(r, s),它们和 M 一起发送到验证方。

  4. 尽管 r 和 s 为 0 的概率相当小,但只要有任何一个为 0 ,必须重新生成 k,并重新计算 r 和 s 。

DSA 验证签名过程:

我们用(r’, s’, M’) 来表示验证方通过某种途径获得的签名结果,之所以这样表示是因为你不能保证你这个签名的结果一定是发送方生成的真签名相反有可能被人篡改过,甚至掉了包。为了描述简便,下面仍用(r, s, M) 代替(r’, s’, M’)。

为了验证(r, s, M) 的签名是否确由发送方所签,验证方需要有(g, p, q, y),验证过程如下:

  1. 计算 w = s^(-1) mod q
  2. 计算 u1 = (SHA(M) * w) mod q
  3. 计算 u2 = (r * w) mod q
  4. 计算 v = (((g^u1) * (y^u2)) mod p ) mod q = ((g^u1 mod p) * (y^u2 mod p) mod p) mod q = (powm(g, u1, p) * powm(y, u2, p) mod p) mod q
  5. 若 v等于 r,则通过验证,否则验证失败

注:

  1. 验证通过说明:签名(r, s) 有效,即(r, s, M) 确为发送方的真实签名结果,真实性可以高度信任,M未被篡改,为有效信息。
  2. 验证失败说明:签名(r, s) 无效,即(r, s, M) 不可靠,或者M被篡改过,或者签名是伪造的,或者M的签名有误,M为无效信息。

DSA 算法实现

DSA密钥生成:

public static Map<String, Object> initKey(String seed) throws Exception {KeyPairGenerator keygen = KeyPairGenerator.getInstance(KEY_ALGORITHM);// 初始化随机产生器   SecureRandom secureRandom = new SecureRandom();secureRandom.setSeed(seed.getBytes());keygen.initialize(1024, secureRandom);KeyPair keys = keygen.genKeyPair();PublicKey publicKey = keys.getPublic();PrivateKey privateKey = keys.getPrivate();Map<String, Object> map = new HashMap<String, Object>(2);map.put(PUBLIC_KEY, publicKey);map.put(PRIVATE_KEY, privateKey);return map;
}

用私钥对信息生成数字签名:

public static String sign(byte[] data, String privateKey) throws Exception {// 解密由base64编码的私钥   byte[] keyBytes = Base64.decodeBase64(privateKey);// 构造PKCS8EncodedKeySpec对象   PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);// KEY_ALGORITHM 指定的加密算法   KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 取私钥匙对象   PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);// 用私钥对信息生成数字签名   Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initSign(priKey);signature.update(data);return Base64.encodeBase64String(signature.sign());
}

校验数字签名:

public static boolean verify(byte[] data, String publicKey, String sign)throws Exception {// 解密由base64编码的公钥   byte[] keyBytes = Base64.decodeBase64(publicKey);// 构造X509EncodedKeySpec对象   X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);// KEY_ALGORITHM 指定的加密算法   KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 取公钥匙对象   PublicKey pubKey = keyFactory.generatePublic(keySpec);Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initVerify(pubKey);signature.update(data);// 验证签名是否正常   return signature.verify(Base64.decodeBase64(sign));
}

查看完整代码请访问:

https://github.com/ForTheDevelopers/JavaSecurity

总结

DSA 算法应该属于数字签名届的翘楚了,非对称密钥大大增强了算法的安全性,目前已经被广泛应用到数字签名领域。

创作不易,如果大家喜欢本文,欢迎点赞,转发,你的关注是我们继续前进的动力_

com/ForTheDevelopers/JavaSecurity)

总结

DSA 算法应该属于数字签名届的翘楚了,非对称密钥大大增强了算法的安全性,目前已经被广泛应用到数字签名领域。

创作不易,如果大家喜欢本文,欢迎点赞,转发,你的关注是我们继续前进的动力_

关于作者
  • GitHub:https://github.com/ForTheDevelopers

  • 掘金:https://juejin.cn/user/1204720472953022/posts

  • CSDN:https://blog.csdn.net/ForTheDevelopers

  • segmentfault:https://segmentfault.com/u/for_the_developers

联系作者
  • 微信号:ForTheDeveloper

  • 公众号:ForTheDevelopers

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lisp语言画阿基米德线_【R语言】如何将照片快速转换为素描

【R语言】如何将照片快速转换为素描&#xff08;三行代码给老婆&#xff08;划掉&#xff09;画一张素描&#xff09;_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com最近发现了一个比较好玩的包&#xff0c;叫做sketcher这个包的作用就是将图片转化成素描的样式以下是…

2021年程序员1月薪资统计,你在哪一档?

hi&#xff0c;大家好&#xff0c;我是开发者FTD。2021年1月份马上就要结束了&#xff0c;再过一周多春节也即将来临&#xff0c;春节后估计又是一波跳槽高峰&#xff0c;那我们一起来看一下当前程序员的薪资状况&#xff0c;让大家对于年后是否要换工作也有个心理预期吧。 注&…

海康sip服务器地址_完整SIP/SDP媒体协商概论SDP基础使用要求

接完整SIP/SDP媒体协商概论-SDP基础-核心定义全解。上一个章节笔者介绍了关于SDP的一些核心概念(第一章节和第二章节)&#xff0c;今天&#xff0c;我们继续在此之间讨论SDP的其余基础内容(从第三章节开始)。在以下讨论中&#xff0c;笔者会介绍关于SDP的使用&#xff0c;SDP的…

一月:你今年还回家过年吗?

hi&#xff0c;大家好&#xff0c;我是开发者FTD。一月份对于我来说&#xff0c;是工作和生活渐渐明朗的一个月&#xff0c;之前迷茫的状态感觉在这一个月开始慢慢消失&#xff0c;并让整个人的精神状态开始转变。2021年才刚刚开始&#xff0c;大家也可以对自己新的一年进行一个…

6个座位办公室最佳位置_2021最佳动力艇大奖:6个类别29个入围名单揭晓

年度最佳动力艇大奖由英国杂志《Motor Boat & Yachting》(MBY)主办&#xff0c;经(MBY)深思熟虑&#xff0c;评委们缩小了2021年度最佳动力艇大奖的决赛入围名单。由于旅行限制&#xff0c;今年的形式会有所不同&#xff0c;不能像往年一样测试那么多的船。因此&#xff0c…

奇妙的安全旅行之ECC算法

hi&#xff0c;大家好&#xff0c;我是开发者FTD。今天我们来介绍一下非对称加密算法的ECC算法。 ECC 算法简介 ECC 是 Elliptic Curves Cryptography 的缩写&#xff0c;意为椭圆曲线密码编码学。和RSA算法一样&#xff0c;ECC算法也属于公开密钥算法。最初由 Koblitz 和 Mi…

奇妙的安全旅行之国密算法

hi&#xff0c;大家好&#xff0c;我是开发者FTD。今天我们来介绍一下我们国家密码局制定的加密算法 — 国密算法。 为什么要制定国密算法&#xff1f; 密码算法是保障信息安全的核心技术&#xff0c;尤其是我国最关键的银行业核心领域长期以来都是沿用MD5、3DES、SHA-256、R…

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(二)

远控木马 SET 同时集成了木马生成工具&#xff0c;可以生成木马并调用MSF框架对远程主机进行控制。直接使用MSF生成木马并控制主机的可参考之前另一篇博文&#xff1a;渗透测试-Kali入侵Win7主机。 控制主机 1、运行 SET&#xff0c;选择创建攻击载荷和监听器&#xff1a; 2…

wdnas群晖nas_西数WD NAS红盘 WD140EFFX 14TB HDD和 SA500 1TB SSD开箱拆解评测

前言每个NAS系统都应该配备足够容量的硬盘&#xff0c;以满足数据存储需求。WD Red 西数红盘存储空间高达14TB&#xff0c;可以为需要构建大容量和高性能NAS存储方案的用户提供解决方案。WD Red西数红盘14T运行安静且热量低&#xff0c;其采用的NASware 3.0技术提高了兼容性、集…

奇妙的安全旅行之加密算法(完整版)

hi&#xff0c;大家好&#xff0c;我是开发者FTD。之前我在公众号写了一个工作中常用加密算法系列的文章终于肝完了&#xff0c;为了方便小伙伴们查看和收藏&#xff0c;我将这个系列汇集整理成了一个PDF文档&#xff0c;有需要的小伙伴可以关注公众号&#xff0c;在公众号后台…

智能车s3010舵机工作电压_全国大学生智能车竞赛决战南京信息工程大学

未来网高校频道8月25日讯(记者 杨子健 通讯员 唐翠梅 方向 张峰 曾雅俊)8月24日上午&#xff0c;由中国自动化学会主办&#xff0c;南京信息工程大学承办的第十五届全国大学生智能汽车竞赛创意组总决赛、第十五届全国大学生智能汽车竞赛华东赛场预决赛开幕仪式在学校东苑体育馆…

直接拿来用!GitHub10个开源免费的后台管理面板

hi&#xff0c;大家好&#xff0c;我是开发者FTD。今天要给大家介绍几个GitHub上开源免费好用的后台管理面板&#xff0c;大家在平时工作中&#xff0c;一定不可避免的会开发一些业务管理控制后台&#xff0c;如果从零开始完整的做一套不是一件很容易的事情&#xff0c;还好Git…

人名和成绩一起排序_EXCEL基础知识——排序功能的使用

排序筛选可能是大家工作中最常用的数据处理方式了&#xff0c;它能很快地从大到小完成排序&#xff0c;并且筛选除你想要的数据。从简单的排序筛选到高级筛选你会哪几步呢&#xff1f;一起来看看。一、简单排序下面这组数据&#xff0c;我们想要将数学成绩从大到小的排序&#…

android骰子游戏代码_真神器!不用手写一行代码就能做网站~

点击上方“Python编程时光”&#xff0c;选择“加为星标”第一时间关注Python技术干货&#xff01;制作网站用什么&#xff0c;Dreamweaver 还是 Fireworks&#xff1f;现在&#xff0c;用 GPT-3 就可以。一位来自旧金山的程序员小哥做了款名为 debuild.co 的网页制作软件&…

一文带你读懂计算机进制

hi&#xff0c;大家好&#xff0c;我是开发者FTD。在我们的学习和工作中少不了与进制打交道&#xff0c;从出生开始上学&#xff0c;最早接触的就是十进制&#xff0c;当大家学习和使用计算机时候&#xff0c;我们又接触到了二进制、八进制以及十六进制。那么大家对进制的认识和…

切换分支 如何判断 是否完成_如何判断展览公司是否专业?

可以看出&#xff0c;展会装修目前市场上的展览设计公司数量非常庞大&#xff0c;许多公司目前正在从事这方面的业务。对于每个人来说&#xff0c;展览设计公司之后有很多好处&#xff0c;所以当你继续选择时&#xff0c;选择面会变得更加广泛。无论人们如何选择展览设计公司&a…

二月:冷清的春节

hi&#xff0c;大家好&#xff0c;我是开发者FTD。二月份就这么悄无声息的过完了&#xff0c;时间真的过得太快了&#xff0c;而且二月份还比其他月少了几天&#xff0c;再加上春节的时间&#xff0c;感觉就更快了。按照惯例&#xff0c;今天也对二月份做个总结&#xff0c;以迎…

python 除法取模_跟我一起学python | 探究05

算术运算、比较运算、赋值运算、位和位运算、运算优先级python里的算术运算我们最熟悉的计算就是算术运算&#xff0c;加减乘除等。在python的算术运算中&#xff0c;除了四则运算外&#xff0c;还有幂运算、取模、取整运算。什么是取模、取整运算呢&#xff1f;取模和取整运算…

中有atoi函数吗_C++ 多态的实现及原理,深挖vptr指针,手动调用虚函数

什么是多态&#xff1f;父类指针即根据指向的不同对象&#xff0c;响应同一消息(函数调用)&#xff0c;产生不同行为。多态三要素&#xff1f;1&#xff0c;继承2&#xff0c;虚函数重写3&#xff0c;父类指针(引用)指向子类对象多态的实现很简答&#xff0c;让我们来看一段代码…

一文带你读懂base64编码

hi&#xff0c;大家好&#xff0c;我是开发者FTD。相信很多同学在工作中&#xff0c;经常会用到Base64编码&#xff0c;那大家知道为什么会有Base64编码吗&#xff1f;我们为什么要使用它呢&#xff0c;它又是怎么实现的呢&#xff1f;下面就让我们来一起深入探究一下Base64编码…