安卓版imToken钱包下载|数字签名算法

作者: 安卓版imToken钱包下载
2024-03-08 03:27:57

基础密码学入门:数字签名算法 - 知乎

基础密码学入门:数字签名算法 - 知乎切换模式写文章登录/注册基础密码学入门:数字签名算法NuoHui野生码农。往期回顾:基础密码学入门: 随机数、hash算法、对称加密算法基础密码学入门: MAC算法、公开密钥算法基础密码学入门: 密钥基础密码学入门: 密钥协商算法数字签名公开密钥算法的另外一种用途就是数字签名技术。提到签名,大家可能会联想到现实世界中的合同签名,按照这个思路理解就对了。数字签名技术有多种解决方案,RSA签名算法和DSA签名算法都可以实现数字签名。在最开始学习密码学时候,我们讲述了密码学在互联网应用的四个目标:机密性、完整性、身份验证、防抵赖。 现在就只有防抵赖这个点没有提及到。防抵赖在讲述防抵赖性之前,我们先铺垫下,消息是如何被篡改的。假设A、B、C三个人共享一个对称加密算法密钥,现在A和B互相通信,A和B一直认为是双方在发送消息。由于C也有同样的密钥,它可以拦截A发往B的消息,然后篡改消息并用同样的密钥加密后发送给B, B能够正确解密,但是该消息其实已经被篡改。接下来解释为什么不能防止抵赖,还是用同样的例子说明,A、B、C三个人共享一个对称加密算法密钥,A向B发送了一条消息,但是A可以抵赖说这条消息并不是他发送的,理由就是C也有同样的密钥,这条加密消息可能是C发送给B的,B无法向第三方证明是A给他发送了消息。在公开密钥算法中,如果算法用于加密解密,也同样不能防止抵赖,以RSA加密算法举例,由于RSA的公钥是完全公开的,RSA私钥拥有者虽然能够解密,但是并不能确认是哪个客户端发送的消息,同理任何人都可以抵赖。抵赖出现的根本原因就在于通信双方无法确认对方的身份,也就是不能进行身份验证,那么在密码学中有没有对应的解决方案呢?可以使用数字签名技术防抵赖。在现实世界中,有哪些行为或者约定可以防止人抵赖呢?最明显的就是合同,合同一般需要人签字或者按指纹,考虑签字可以模仿伪造,这里重点用指纹签署的合同来解释。合同一旦由指纹签署了,就可以被复印多份。有了合同,合同签署人就无法否认合同的合法性,原因就在于法律规定,指纹具备唯一性,每个人的指纹是不同的,或者说指纹就代表了一个人。回到密码学中,如果一个消息也含有特殊的指纹,那么它是否就不能抵赖呢?仔细回忆RSA密钥对,私钥只有密钥对的生成者持有,如果不考虑密钥泄露的问题,私钥拥有者使用密钥(注意不是加密操作)签署一条消息,然后发送给任意的接收方,接收方只要拥有私钥对应的公钥,就能成功反解签署消息,由于只有私钥持有者才能“签署”消息,不能抵赖说这条签署消息不是他发送的,这就是数字签名技术的全部。数字签名特点防篡改:数据不会被修改,MAC算法也有这个特点。防抵赖:消息签署者不能抵赖。防伪造:发送的消息不能够伪造,MAC算法也有这个特点。数字签名技术能够进行身份验证,而MAC算法,它只能保证传递的消息是经过验证的,但不能对消息发送者的身份进行验证,原因就在于消息发送方和接收方拥有同样的密钥,所以双方可以抵赖,否认消息是他发送的,因此在理解的时候一定要区分消息验证和身份验证。数字签名的流程不管是RSA数字签名算法还是DSA数字签名算法,数字签名处理流程是差不多的,主要分为签名生成和签名验证,接下来分别描述这两个过程。签名生成流程发送者对消息计算摘要值。发送者用私钥对摘要值进行签名得到签名值。发送者将原始消息和签名值一同发给接收者。数字签名技术的本质不是为了加密,所以和签名值一同传递的消息是不用加密的,当然也可以对消息加密后再计算签名值。签名验证流程接收者接收到消息后,拆分出消息和消息签名值A。接收者使用公钥对消息进行运算得到摘要值B。接收者对摘要值B和签名值A进行比较,如果相同表示签名验证成功,否则就是验证失败。签名生成和签名验证流程很简单,大家看了上述流程可能会思考一个问题,为什么不直接对消息进行签名,而是对消息的摘要值进行签名?签名值除了比较之外并没有其他用途,那么基于消息生成签名和基于消息摘要值生成签名并无区别,考虑到公开密钥算法运行是相对缓慢的,数字签名算法建议对消息摘要值进行签名,因为摘要值的长度是固定的,运算的时候速度会比较快。RSA数字签名算法RSA算法的用途非常广泛,可以进行数字签名。和RSA加密算法相似,不同的是,RSA加密算法是公钥加密,私钥解密;RSA签名算法是私钥签名,公钥验证签名。DSA数字签名算法对称加密算法有很多算法,标准算法是RSA机密算法,数字签名技术也有一个标准DSS(Digital Signature Standard),其标准算法就是DSA签名算法(DigitalSignature Algorithm),它是美国国家标准技术研究所(NIST)在1991年提出的签名算法,只能进行签名,不能进行加密解密。DSA数字签名算法生成签名、验证签名的机制和RSA数字签名算法是一样的。编辑于 2020-11-03 23:53数字签名前端开发前端工程师​赞同 31​​3 条评论​分享​喜欢​收藏​申请

数字签名算法介绍和区别 - 知乎

数字签名算法介绍和区别 - 知乎首发于TLS/SSL前沿切换模式写文章登录/注册数字签名算法介绍和区别上海哲信信息技术有限公司​已认证账号原文阅读:数字签名算法介绍和区别数字签名是一个带有密钥的消息摘要算法,这个密钥包括了公钥和私钥,用于验证数据完整性、认证数据来源和抗否认,遵循OSI参考模型、私钥签名和公钥验证。也是非对称加密算法和消息摘要算法的结合体,常见的数字签名算法主要有RSA、DSA、ECDSA三种,本文对数字签名算法进行详细介绍。Hash又译散列、摘要等名,本文统一称Hash。1. RSA数字签名算法RSA是目前计算机密码学中最经典算法,也是目前为止使用最广泛的数字签名算法,RSA数字签名算法的密钥实现与RSA的加密算法是一样的,算法的名称都叫RSA。密钥的产生和转换都是一样的,包括在售的所有SSL数字证书、代码签名证书、文档签名以及邮件签名大多都采用RSA算法进行加密。RSA数字签名算法主要包括MD和SHA两种算法,例如我们熟知的MD5和SHA-256即是这两种算法中的一类,具体如下表格分布1.1. MD2、MD4、MD5算法最常见的是我们熟知的MD5加密算法,MD5全称Message-Digest Algorithm 5(信息-摘要算法 5),目前比较普遍的Hash算法,是散列算法的基础原理,MD5的前身有MD2、MD3和MD4。MD5算法法是输入任意长度字符,输出固定长度128位的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128位Hash值,主要方式是通过求余、取余、调整长度、与链接变量进行循环运算进而得出结果。1.2. SHA-1算法SHA-1是由NIST NSA设计为同DSA一起使用的,SHA-1设计时基于和MD4相同原理,并且模仿了该算法,SHA-1抗穷举(brute-force)性更好,它产出160位的Hash值,对于非线性运算、移位和加法运算也与MD5类似。SHA-1也应用于包括TLS和SSL、PGP、SSH、S/MIME和IPsec等多种协议中,曾被视为是MD5的后继者。SHA-1的如今已经明确不具备安全性可言了。在2016年1月1日后基于SHA-1签发的SSL和代码签名的X.509证书已不具备安全性可言,多个操作系统、浏览器都建议将基于SHA-1而签发的证书、代码签名替换至SHA-2的产品,但目前在Windows XP(官方已停更)操作系统上仍然只兼容基于SHA-1算法的SSL和代码签名产品。就在2017年2月23日Google宣布实现了对SHA-1算法的碰撞破解,所以SHA-1算法已经正式被宣布为不安全的算法,主流厂商对自身产品及安全要求都提升至了SHA-2算法。1.3. SHA-2算法SHA-224、SHA-256、SHA-384和SHA-512并称为SHA-2,发布于2001年,目前比较广泛应用的SSL数字证书和代码签名证书签名算法均采用SHA-256算法,相较于SHA-1算法而言,至今SHA-2算法还未被破解,从某种意义上SHA-2延用了SHA-1算法,所以至少发文时间起是安全的。目前顶级CA和Google、苹果等公司都采用基于SHA-256算法作为SSL证书和代码签名证书的主流签名算法。1.4. SHA-3算法SHA-3算法正式发布于2015年,SHA-3并不是要取代SHA-2,因为SHA-2目前并没有出现明显的弱点。由于对MD5、SHA-0和SHA-1出现成功的破解,NIST感觉需要一个与之前算法不同的,可替换的加密Hash算法,也就是现在的 SHA-3。2. DSA数字签名算法DSA全称Digital Signature Algorithm,DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,所以它比RSA要快很多,其安全性与RSA相比差不多。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却做不到。DSA的整个签名算法流程如下:a. 发送方使用SHA-1和SHA-2编码将发送内容加密产生的数字摘要;b. 发送方用自己的专用密钥对摘要进行再次加密得到数字签名;c. 发送方将原文和加密后的摘要传给接收方;d. 接收方使用发送方提供的密钥对进行解密 ,同时对收到的内容用SHA-1/SHA-2编码加密产生同样的摘要;e. 接收方再将解密后的摘要和d步骤中加密产生的摘要进行比对,如果两者一至,则说明传输过程的信息没有被破坏和篡改,否则传输信息则不安全。3. ECDSA椭圆曲线数字签名算法ECDSA是用于数字签名,是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。而ECC(全称Elliptic Curves Cryptography)是一种椭圆曲线密码编码学。ECDH每次用一个固定的DH key,导致不能向前保密(forward secrecy),所以一般都是用ECDHE(ephemeral)或其他版本的ECDH算法。ECDH则是基于ECC的DH( Diffie-Hellman)密钥交换算法。ECC与RSA 相比,有以下的优点:a. 相同密钥长度下,安全性能更高,如160位ECC已经与1024位RSA、DSA有相同的安全强度。b. 计算量小,处理速度快,在私钥的处理速度上(解密和签名),ECC远 比RSA、DSA快得多。c. 存储空间占用小 ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多, 所以占用的存储空间小得多。d. 带宽要求低使得ECC具有广泛得应用前景。下表是ECC和RSA安全性比较攻破时间(MIPS年)RSA/DSA(密钥长度)ECC密钥长度RSA/ECC密钥长度比1045121065:11087681326:1101110241607:11020204821010:110782100060035:1下表是RSA和ECC速度比较功能Security Builder 1.2BSAFE 3.0163位ECC(ms)1,023位RSA(ms)密钥对生成3.84,708.3签名2.1(ECNRA)228.43.0(ECDSA)认证9.9(ECNRA)12.710.7(ECDSA)Diffie—Hellman密钥交换7.31,654.0在 ECDHE 密钥交换中,服务端使用证书私钥对相关信息进行签名,如果浏览器能用证书公钥验证签名,就说明服务端确实拥有对应私钥,从而完成了服务端认证。密钥交换和服务端认证是完全分开的。可用于 ECDHE 数字签名的算法主要有 RSA 和 ECDSA,也就是目前密钥交换 + 签名有三种主流选择:RSA 密钥交换(无需签名);ECDHE 密钥交换、RSA 签名;ECDHE 密钥交换、ECDSA 签名;4. 总结对于SSL数字证书和代码签名证书以及其它非对称加密产品来说,RSA目前普及度最高,以SHA-256签名算法最广,对于更高级基于ECC签名算法是需要对证书请求文件CSR和根证书都有相应的要求。SHA-2自2016年1月1日起大多CA已停止签发不安全的SHA-1签名算法,所有CA目前签发的证书都要求基于SHA-2签名算法。FULL SHA-2与SHA-2选项类似,FULL SHA-2选项将为您提供相同的SHA-2证书和中间证书,但根证书不再是基于SHA-1而是SHA-2。ECC-FULL和“FULL-SHA-2”选项类似,你将需要提供一个基于ECC算法的CSR,同时ECC-HYBRID ECC-HYBRID与ECC-FULL一样,ECC的几种算法都要求根证书是RSA。参考文献非https网站将不再提供链接形式,请自行复制前往https://segmentfault.com/a/1190000012158045https://imququ.com/post/ecc-certificate.htmlhttp://blog.sina.com.cn/s/blog_a9303fd90101cgw4.htmlhttp://blog.csdn.net/xueyepiaoling/article/details/62433378http://blog.syscallx.com/2016/11/15/rsa-and-dh.htmlhttps://zh.wikipedia.org/wiki/SHA-2https://zh.wikipedia.org/wiki/SHA-3http://blog.csdn.net/zuiyuezhou888/article/details/7557048http://blog.csdn.net/u013991521/article/details/48224919https://technet.microsoft.com/library/security/2880823发布于 2018-01-22 23:21SSLHTTPSRSA 加密​赞同 28​​2 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录TLS/SSL前沿介绍TLS/SSL数字证书的前沿技术、申

浅谈常见的七种加密算法及实现 - 知乎

浅谈常见的七种加密算法及实现 - 知乎首发于360linker切换模式写文章登录/注册浅谈常见的七种加密算法及实现360linker前言数字签名、信息加密 是前后端开发都经常需要使用到的技术,应用场景包括了用户登入、交易、信息通讯、oauth 等等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的 签名加密算法 来达到业务目标。这里简单的给大家介绍几种常见的签名加密算法和一些典型场景下的应用。正文1. 数字签名数字签名,简单来说就是通过提供 可鉴别 的 数字信息 验证 自身身份 的一种方式。一套 数字签名 通常定义两种 互补 的运算,一个用于 签名,另一个用于 验证。分别由 发送者 持有能够 代表自己身份 的 私钥 (私钥不可泄露),由 接受者 持有与私钥对应的 公钥 ,能够在 接受 到来自发送者信息时用于 验证 其身份。注意:图中 加密过程 有别于 公钥加密,更多 介绍戳这里。签名 最根本的用途是要能够唯一 证明发送方的身份,防止 中间人攻击、CSRF 跨域身份伪造。基于这一点在诸如 设备认证、用户认证、第三方认证 等认证体系中都会使用到 签名算法 (彼此的实现方式可能会有差异)。2. 加密和解密2.1. 加密数据加密 的基本过程,就是对原来为 明文 的文件或数据按 某种算法 进行处理,使其成为 不可读 的一段代码,通常称为 “密文”。通过这样的途径,来达到 保护数据 不被 非法人窃取、阅读的目的。2.2. 解密加密 的 逆过程 为 解密,即将该 编码信息 转化为其 原来数据 的过程。3. 对称加密和非对称加密加密算法分 对称加密 和 非对称加密,其中对称加密算法的加密与解密 密钥相同,非对称加密算法的加密密钥与解密 密钥不同,此外,还有一类 不需要密钥 的 散列算法。常见的 对称加密 算法主要有 DES、3DES、AES 等,常见的 非对称算法 主要有 RSA、DSA 等,散列算法 主要有 SHA-1、MD5 等。3.1. 对称加密对称加密算法 是应用较早的加密算法,又称为 共享密钥加密算法。在 对称加密算法 中,使用的密钥只有一个,发送 和 接收 双方都使用这个密钥对数据进行 加密 和 解密。这就要求加密和解密方事先都必须知道加密的密钥。数据加密过程:在对称加密算法中,数据发送方 将 明文 (原始数据) 和 加密密钥 一起经过特殊 加密处理,生成复杂的 加密密文 进行发送。数据解密过程:数据接收方 收到密文后,若想读取原数据,则需要使用 加密使用的密钥 及相同算法的 逆算法 对加密的密文进行解密,才能使其恢复成 可读明文。3.2. 非对称加密非对称加密算法,又称为 公开密钥加密算法。它需要两个密钥,一个称为 公开密钥 (public key),即 公钥,另一个称为 私有密钥 (private key),即 私钥。因为 加密 和 解密 使用的是两个不同的密钥,所以这种算法称为 非对称加密算法。如果使用 公钥 对数据 进行加密,只有用对应的 私钥 才能 进行解密。如果使用 私钥 对数据 进行加密,只有用对应的 公钥 才能 进行解密。例子:甲方生成 一对密钥 并将其中的一把作为 公钥 向其它人公开,得到该公钥的 乙方 使用该密钥对机密信息 进行加密 后再发送给甲方,甲方再使用自己保存的另一把 专用密钥 (私钥),对 加密 后的信息 进行解密。4. 常见的签名加密算法4.1. MD5算法MD5 用的是 哈希函数,它的典型应用是对一段信息产生 信息摘要,以 防止被篡改。严格来说,MD5 不是一种 加密算法 而是 摘要算法。无论是多长的输入,MD5 都会输出长度为 128bits 的一个串 (通常用 16 进制 表示为 32 个字符)。public static final byte[] computeMD5(byte[] content) {

try {

MessageDigest md5 = MessageDigest.getInstance("MD5");

return md5.digest(content);

} catch (NoSuchAlgorithmException e) {

throw new RuntimeException(e);

}

}4.2. SHA1算法SHA1 是和 MD5 一样流行的 消息摘要算法,然而 SHA1 比 MD5 的 安全性更强。对于长度小于 2 ^ 64 位的消息,SHA1 会产生一个 160 位的 消息摘要。基于 MD5、SHA1 的信息摘要特性以及 不可逆 (一般而言),可以被应用在检查 文件完整性 以及 数字签名 等场景。public static byte[] computeSHA1(byte[] content) {

try {

MessageDigest sha1 = MessageDigest.getInstance("SHA1");

return sha1.digest(content);

} catch (NoSuchAlgorithmException e) {

throw new RuntimeException(e);

}

}4.3. HMAC算法HMAC 是密钥相关的 哈希运算消息认证码(Hash-based Message Authentication Code),HMAC 运算利用 哈希算法 (MD5、SHA1 等),以 一个密钥 和 一个消息 为输入,生成一个 消息摘要 作为 输出。HMAC 发送方 和 接收方 都有的 key 进行计算,而没有这把 key 的第三方,则是 无法计算 出正确的 散列值的,这样就可以 防止数据被篡改。package net.pocrd.util;

import net.pocrd.annotation.NotThreadSafe;

import net.pocrd.define.ConstField;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import javax.crypto.Mac;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

import java.util.Arrays;

@NotThreadSafe

public class HMacHelper {

private static final Logger logger = LoggerFactory.getLogger(HMacHelper.class);

private Mac mac;

/**

* MAC算法可选以下多种算法

* HmacMD5/HmacSHA1/HmacSHA256/HmacSHA384/HmacSHA512

*/

private static final String KEY_MAC = "HmacMD5";

public HMacHelper(String key) {

try {

SecretKey secretKey = new SecretKeySpec(key.getBytes(ConstField.UTF8), KEY_MAC);

mac = Mac.getInstance(secretKey.getAlgorithm());

mac.init(secretKey);

} catch (Exception e) {

logger.error("create hmac helper failed.", e);

}

}

public byte[] sign(byte[] content) {

return mac.doFinal(content);

}

public boolean verify(byte[] signature, byte[] content) {

try {

byte[] result = mac.doFinal(content);

return Arrays.equals(signature, result);

} catch (Exception e) {

logger.error("verify sig failed.", e);

}

return false;

}

}测试结论:HMAC 算法实例在 多线程环境 下是 不安全的。但是需要在 多线程访问 时,进行同步的辅助类,使用 ThreadLocal 为 每个线程缓存 一个实例可以避免进行锁操作。4.4. AES/DES/3DES算法AES、DES、3DES 都是 对称 的 块加密算法,加解密 的过程是 可逆的。常用的有 AES128、AES192、AES256 (默认安装的 JDK 尚不支持 AES256,需要安装对应的 jce 补丁进行升级 jce1.7,jce1.8)。4.4.1. DES算法DES 加密算法是一种 分组密码,以 64 位为 分组对数据 加密,它的 密钥长度 是 56 位,加密解密 用 同一算法。DES 加密算法是对 密钥 进行保密,而 公开算法,包括加密和解密算法。这样,只有掌握了和发送方 相同密钥 的人才能解读由 DES加密算法加密的密文数据。因此,破译 DES 加密算法实际上就是 搜索密钥的编码。对于 56 位长度的 密钥 来说,如果用 穷举法 来进行搜索的话,其运算次数为 2 ^ 56 次。4.4.2. 3DES算法是基于 DES 的 对称算法,对 一块数据 用 三个不同的密钥 进行 三次加密,强度更高。4.4.3. AES算法AES 加密算法是密码学中的 高级加密标准,该加密算法采用 对称分组密码体制,密钥长度的最少支持为 128 位、 192 位、256 位,分组长度 128 位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的 区块加密标准。AES 本身就是为了取代 DES 的,AES 具有更好的 安全性、效率 和 灵活性。import net.pocrd.annotation.NotThreadSafe;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

import java.security.SecureRandom;

@NotThreadSafe

public class AesHelper {

private SecretKeySpec keySpec;

private IvParameterSpec iv;

public AesHelper(byte[] aesKey, byte[] iv) {

if (aesKey == null || aesKey.length < 16 || (iv != null && iv.length < 16)) {

throw new RuntimeException("错误的初始密钥");

}

if (iv == null) {

iv = Md5Util.compute(aesKey);

}

keySpec = new SecretKeySpec(aesKey, "AES");

this.iv = new IvParameterSpec(iv);

}

public AesHelper(byte[] aesKey) {

if (aesKey == null || aesKey.length < 16) {

throw new RuntimeException("错误的初始密钥");

}

keySpec = new SecretKeySpec(aesKey, "AES");

this.iv = new IvParameterSpec(Md5Util.compute(aesKey));

}

public byte[] encrypt(byte[] data) {

byte[] result = null;

Cipher cipher = null;

try {

cipher = Cipher.getInstance("AES/CFB/NoPadding");

cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);

result = cipher.doFinal(data);

} catch (Exception e) {

throw new RuntimeException(e);

}

return result;

}

public byte[] decrypt(byte[] secret) {

byte[] result = null;

Cipher cipher = null;

try {

cipher = Cipher.getInstance("AES/CFB/NoPadding");

cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);

result = cipher.doFinal(secret);

} catch (Exception e) {

throw new RuntimeException(e);

}

return result;

}

public static byte[] randomKey(int size) {

byte[] result = null;

try {

KeyGenerator gen = KeyGenerator.getInstance("AES");

gen.init(size, new SecureRandom());

result = gen.generateKey().getEncoded();

} catch (Exception e) {

throw new RuntimeException(e);

}

return result;

}

}4.5. RSA算法RSA 加密算法是目前最有影响力的 公钥加密算法,并且被普遍认为是目前 最优秀的公钥方案 之一。RSA 是第一个能同时用于 加密 和 数字签名 的算法,它能够 抵抗 到目前为止已知的 所有密码攻击,已被 ISO 推荐为公钥数据加密标准。RSA 加密算法 基于一个十分简单的数论事实:将两个大 素数 相乘十分容易,但想要对其乘积进行 因式分解 却极其困难,因此可以将 乘积 公开作为 加密密钥。import net.pocrd.annotation.NotThreadSafe;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import javax.crypto.Cipher;

import java.io.ByteArrayOutputStream;

import java.security.KeyFactory;

import java.security.Security;

import java.security.Signature;

import java.security.interfaces.RSAPrivateCrtKey;

import java.security.interfaces.RSAPublicKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

@NotThreadSafe

public class RsaHelper {

private static final Logger logger = LoggerFactory.getLogger(RsaHelper.class);

private RSAPublicKey publicKey;

private RSAPrivateCrtKey privateKey;

static {

Security.addProvider(new BouncyCastleProvider()); //使用bouncycastle作为加密算法实现

}

public RsaHelper(String publicKey, String privateKey) {

this(Base64Util.decode(publicKey), Base64Util.decode(privateKey));

}

public RsaHelper(byte[] publicKey, byte[] privateKey) {

try {

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

if (publicKey != null && publicKey.length > 0) {

this.publicKey = (RSAPublicKey)keyFactory.generatePublic(new X509EncodedKeySpec(publicKey));

}

if (privateKey != null && privateKey.length > 0) {

this.privateKey = (RSAPrivateCrtKey)keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKey));

}

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public RsaHelper(String publicKey) {

this(Base64Util.decode(publicKey));

}

public RsaHelper(byte[] publicKey) {

try {

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

if (publicKey != null && publicKey.length > 0) {

this.publicKey = (RSAPublicKey)keyFactory.generatePublic(new X509EncodedKeySpec(publicKey));

}

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public byte[] encrypt(byte[] content) {

if (publicKey == null) {

throw new RuntimeException("public key is null.");

}

if (content == null) {

return null;

}

try {

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

int size = publicKey.getModulus().bitLength() / 8 - 11;

ByteArrayOutputStream baos = new ByteArrayOutputStream((content.length + size - 1) / size * (size + 11));

int left = 0;

for (int i = 0; i < content.length; ) {

left = content.length - i;

if (left > size) {

cipher.update(content, i, size);

i += size;

} else {

cipher.update(content, i, left);

i += left;

}

baos.write(cipher.doFinal());

}

return baos.toByteArray();

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public byte[] decrypt(byte[] secret) {

if (privateKey == null) {

throw new RuntimeException("private key is null.");

}

if (secret == null) {

return null;

}

try {

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

cipher.init(Cipher.DECRYPT_MODE, privateKey);

int size = privateKey.getModulus().bitLength() / 8;

ByteArrayOutputStream baos = new ByteArrayOutputStream((secret.length + size - 12) / (size - 11) * size);

int left = 0;

for (int i = 0; i < secret.length; ) {

left = secret.length - i;

if (left > size) {

cipher.update(secret, i, size);

i += size;

} else {

cipher.update(secret, i, left);

i += left;

}

baos.write(cipher.doFinal());

}

return baos.toByteArray();

} catch (Exception e) {

logger.error("rsa decrypt failed.", e);

}

return null;

}

public byte[] sign(byte[] content) {

if (privateKey == null) {

throw new RuntimeException("private key is null.");

}

if (content == null) {

return null;

}

try {

Signature signature = Signature.getInstance("SHA1WithRSA");

signature.initSign(privateKey);

signature.update(content);

return signature.sign();

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public boolean verify(byte[] sign, byte[] content) {

if (publicKey == null) {

throw new RuntimeException("public key is null.");

}

if (sign == null || content == null) {

return false;

}

try {

Signature signature = Signature.getInstance("SHA1WithRSA");

signature.initVerify(publicKey);

signature.update(content);

return signature.verify(sign);

} catch (Exception e) {

logger.error("rsa verify failed.", e);

}

return false;

}

}4.6. ECC算法ECC 也是一种 非对称加密算法,主要优势是在某些情况下,它比其他的方法使用 更小的密钥,比如 RSA 加密算法,提供 相当的或更高等级 的安全级别。不过一个缺点是 加密和解密操作 的实现比其他机制 时间长 (相比 RSA 算法,该算法对 CPU 消耗严重)。import net.pocrd.annotation.NotThreadSafe;

import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;

import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import javax.crypto.Cipher;

import java.io.ByteArrayOutputStream;

import java.security.KeyFactory;

import java.security.Security;

import java.security.Signature;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

@NotThreadSafe

public class EccHelper {

private static final Logger logger = LoggerFactory.getLogger(EccHelper.class);

private static final int SIZE = 4096;

private BCECPublicKey publicKey;

private BCECPrivateKey privateKey;

static {

Security.addProvider(new BouncyCastleProvider());

}

public EccHelper(String publicKey, String privateKey) {

this(Base64Util.decode(publicKey), Base64Util.decode(privateKey));

}

public EccHelper(byte[] publicKey, byte[] privateKey) {

try {

KeyFactory keyFactory = KeyFactory.getInstance("EC", "BC");

if (publicKey != null && publicKey.length > 0) {

this.publicKey = (BCECPublicKey)keyFactory.generatePublic(new X509EncodedKeySpec(publicKey));

}

if (privateKey != null && privateKey.length > 0) {

this.privateKey = (BCECPrivateKey)keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKey));

}

} catch (ClassCastException e) {

throw new RuntimeException("", e);

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public EccHelper(String publicKey) {

this(Base64Util.decode(publicKey));

}

public EccHelper(byte[] publicKey) {

try {

KeyFactory keyFactory = KeyFactory.getInstance("EC", "BC");

if (publicKey != null && publicKey.length > 0) {

this.publicKey = (BCECPublicKey)keyFactory.generatePublic(new X509EncodedKeySpec(publicKey));

}

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public byte[] encrypt(byte[] content) {

if (publicKey == null) {

throw new RuntimeException("public key is null.");

}

try {

Cipher cipher = Cipher.getInstance("ECIES", "BC");

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

int size = SIZE;

ByteArrayOutputStream baos = new ByteArrayOutputStream((content.length + size - 1) / size * (size + 45));

int left = 0;

for (int i = 0; i < content.length; ) {

left = content.length - i;

if (left > size) {

cipher.update(content, i, size);

i += size;

} else {

cipher.update(content, i, left);

i += left;

}

baos.write(cipher.doFinal());

}

return baos.toByteArray();

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public byte[] decrypt(byte[] secret) {

if (privateKey == null) {

throw new RuntimeException("private key is null.");

}

try {

Cipher cipher = Cipher.getInstance("ECIES", "BC");

cipher.init(Cipher.DECRYPT_MODE, privateKey);

int size = SIZE + 45;

ByteArrayOutputStream baos = new ByteArrayOutputStream((secret.length + size + 44) / (size + 45) * size);

int left = 0;

for (int i = 0; i < secret.length; ) {

left = secret.length - i;

if (left > size) {

cipher.update(secret, i, size);

i += size;

} else {

cipher.update(secret, i, left);

i += left;

}

baos.write(cipher.doFinal());

}

return baos.toByteArray();

} catch (Exception e) {

logger.error("ecc decrypt failed.", e);

}

return null;

}

public byte[] sign(byte[] content) {

if (privateKey == null) {

throw new RuntimeException("private key is null.");

}

try {

Signature signature = Signature.getInstance("SHA1withECDSA", "BC");

signature.initSign(privateKey);

signature.update(content);

return signature.sign();

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public boolean verify(byte[] sign, byte[] content) {

if (publicKey == null) {

throw new RuntimeException("public key is null.");

}

try {

Signature signature = Signature.getInstance("SHA1withECDSA", "BC");

signature.initVerify(publicKey);

signature.update(content);

return signature.verify(sign);

} catch (Exception e) {

logger.error("ecc verify failed.", e);

}

return false;

}

}5. 各种加密算法对比5.1. 散列算法比较5.2. 对称加密算法比较5.3. 非对称加密算法比较5.4. 对称算法与非对称加密算法5.4.1. 对称算法密钥管理:比较难,不适合互联网,一般用于内部系统安全性:中加密速度:快好 几个数量级 (软件加解密速度至少快 100 倍,每秒可以加解密数 M 比特 数据),适合大数据量的加解密处理5.4.2. 非对称算法密钥管理:密钥容易管理安全性:高加密速度:比较慢,适合 小数据量 加解密或数据签名小结本文介绍了 数字签名,加密和解密,对称加密和非对称加密,然后详细介绍了 MD5,SHA-1,HMAC,DES/AES,RSA 和 ECC 这几种加密算法和代码示例。发布于 2021-01-26 13:39加密算法非对称式加密数据加密​赞同 199​​5 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录360linker IT热点技术讲解,编程技巧,职场

几种常见的数字签名算法比较_数字签名算法有哪些-CSDN博客

>

几种常见的数字签名算法比较_数字签名算法有哪些-CSDN博客

几种常见的数字签名算法比较

最新推荐文章于 2023-08-17 14:41:22 发布

SmarTongs

最新推荐文章于 2023-08-17 14:41:22 发布

阅读量8.5k

收藏

7

点赞数

分类专栏:

大数据安全

文章标签:

信息安全

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_44080131/article/details/112097641

版权

大数据安全

专栏收录该内容

3 篇文章

1 订阅

订阅专栏

原文链接:数字签名算法介绍和区别

summary:

数字签名是一个带有密钥的消息摘要算法,这个密钥包括了公钥和私钥,用于验证数据完整性、认证数据来源和抗否认,遵循OSI参考模型、私钥签名和公钥验证。也是非对称加密算法和消息摘要算法的结合体,常见的数字签名算法主要有RSA、DSA、ECDSA三种,本文对数字签名算法进行详细介绍。

1. RSA

RSA是目前计算机密码学中最经典算法,也是目前为止使用最广泛的数字签名算法,RSA数字签名算法的密钥实现与RSA的加密算法是一样的,算法的名称都叫RSA。密钥的产生和转换都是一样的,包括在售的所有SSL数字证书、代码签名证书、文档签名以及邮件签名大多都采用RSA算法进行加密。

RSA数字签名算法主要包括MD和SHA两种算法,例如我们熟知的MD5和SHA-256即是这两种算法中的一类。

2. DSA

DSA全称Digital Signature Algorithm,DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,所以它比RSA要快很多,其安全性与RSA相比差不多。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却做不到。

DSA的整个签名算法流程如下:

发送方使用SHA-1和SHA-2编码将发送内容加密产生的数字摘要;发送方用自己的专用密钥对摘要进行再次加密得到数字签名;发送方将原文和加密后的摘要传给接收方;接收方使用发送方提供的密钥对进行解密 ,同时对收到的内容用SHA-1/SHA-2编码加密产生同样的摘要;接收方再将解密后的摘要和d步骤中加密产生的摘要进行比对,如果两者一至,则说明传输过程的信息没有被破坏和篡改,否则传输信息则不安全。

3. ECDSA椭圆曲线数字签名算法

ECDSA是用于数字签名,是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。而ECC(全称Elliptic Curves Cryptography)是一种椭圆曲线密码编码学。

ECC与RSA 相比,有以下的优点:

相同密钥长度下,安全性能更高,如160位ECC已经与1024位RSA、DSA有相同的安全强度。计算量小,处理速度快,在私钥的处理速度上(解密和签名),ECC远 比RSA、DSA快得多。存储空间占用小 ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多, 所以占用的存储空间小得多。带宽要求低使得ECC具有广泛得应用前景。

优惠劵

SmarTongs

关注

关注

0

点赞

7

收藏

觉得还不错?

一键收藏

知道了

0

评论

几种常见的数字签名算法比较

https://www.infinisign.com/faq/digital-signature-diff

复制链接

扫一扫

专栏目录

ASP.NET中MD5与SHA1加密的几种方法

01-02

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由Mit Laboratory for Computer Science和Rsa data security inc的Ronald l. rivest开发出来,经md2、md3和md4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。 加密哈希函数将任意长度的二进制字符串映射为固定长度的小型二进制字符串。加密哈希函数

RSA、DSA和ECDSA三者的签名

热门推荐

Guo_guo

05-10

5万+

数字签名就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。一般是非对称密钥加密技术与数字摘要技术的结合应用,目前主流的三种非对称算法有:

1. RSA,这个巨NB算法的实现方式,使其既可以用于签名也可以用于加密(密钥交换)。除了将公钥与密钥的地位交换一下之外,其它步骤几乎是完全一样的。发送方用自己的私钥对消息的摘要值进行“加密”

参与评论

您还未登录,请先

登录

后发表或查看评论

Android数据加密之SHA安全散列算法

01-04

前言:

对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好奇心,所以趁着晚上没啥事,来学习一下。

其他几种加密方式:

 •Android数据加密之Rsa加密

 •Android数据加密之Aes加密

 •Android数据加密之Des加密

 •Android数据加密之MD5加密

 •Android数据加密之Base64编码算法

SHA加密算法 

    SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的

数字签名算法类别及用途

weixin_43211186的博客

06-23

2529

数字签名(digital signature)是一种电子签名,也可以表示为一种数学算法,通常用于验证消息(例如,电子邮件、信用卡交易或数字文档)的真实性和完整性。在“数字签名论述及生成与优点分析”终将输了数字签名算法的生成及数字签名算法的优点,这节讲一下数字签名算法的分类及用途。存在三种不同类别的数字签名证书 (DSC):使用数字签名的行业包括:大多数政府实体在使用数字签名时必须遵守严格的法律、法规和标准。许多政府和公司也使用智能卡来识别其公民和雇员。这些是带有数字签名的实体卡,可用于让持卡人访问机构的系统

签名算法 - BLS签名算法介绍

跨链技术践行者

03-15

1万+

BLS签名算法是斯坦福大学计算机系三人提出:Dan Boneh,Ben Lynn以及Hovav Shacham。BLS签名算法论文的下载地址:https://www.iacr.org/archive/asiacrypt2001/22480516.pdf。

最近在Medium上看到一篇介绍BLS签名算法比较清楚的文章,部分翻译整理一下。Medium上的原文链接:https://medium.com...

常见数字签名简析(SHA1 算法、CRC32 算法)

09-16

首先介绍了数字签名的基本概念,以及数字签名在网络中日益重要的地位。然后简述几种数字签名,并根据实际的机器环境进行相应指标的测试,给出相应的比对结果。最后分析实验数据给出相应的结论,供大家在实际应用中参考。

数字签名算法介绍和区别

weixin_34346099的博客

05-03

2260

原文阅读:https://www.infinisign.com/fa...

数字签名是一个带有密钥的消息摘要算法,这个密钥包括了公钥和私钥,用于验证数据完整性、认证数据来源和抗否认,遵循OSI参考模型、私钥签名和公钥验证。也是非对称加密算法和消息摘要算法的结合体,常见的数字签名算法主要有RSA、DSA、ECDSA三种,本文对数字签名算法进...

数字签名算法

m0_56010012的博客

08-17

402

当然在数字证书认证的过程中,数字证书认证中心(CA)作为权威的、公正的、 可信赖的第三方,其作用是至关重要的。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样,信息就可以安全无误地到达目的地了,即使被第三方截获,由于没有相应的私钥,也无法进行解密。MD5存在的安全问题:(1)容易受到碰撞:由于MD5的压缩函数具有可逆性,攻击者key通过特殊的构造方法生成两个不同的消息,使得他们的哈希值相同,这种情况称为哈希碰撞,攻击者可以伪造数据、篡改数据从而导致导致安全问题。

【密码学】 一篇文章讲透数字签名

物联网布道师

02-25

2449

数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是在使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名是非对称密钥加密技术与数字摘要技术的应用。数字签名可以识别消息是否被篡改, 并验证消息的可靠性, 也可以防止否认。

签名算法

zhangge3663的博客

08-17

1126

我们使用非对称加密算法的时候,对于一个公钥-私钥对,通常是用公钥加密,私钥解密。

如果使用私钥加密,公钥解密是否可行呢?实际上是完全可行的。

不过我们再仔细想一想,私钥是保密的,而公钥是公开的,用私钥加密,那相当于所有人都可以用公钥解密。这个加密有什么意义?

这个加密的意义在于,如果小明用自己的私钥加密了一条消息,比如小明喜欢小红,然后他公开了加密消息,由于任何人都可以用小明的公钥解密,从而使得任何人都可以确认小明喜欢小红这条消息肯定是小明发出的,其他人不能伪造这个消息,小明也不能抵赖这条消息不是自己

ASP基于RSA的数字签名的设计与实现(源代码+thesis).zip

08-31

项目是基于ASP.NET的Web应用程序开发,旨在构建一个高性能、可扩展和可靠的在线平台。我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。

ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC框架是因为它具有良好的可扩展性和灵活性,可以轻松地添加新功能和模块。

在技术方案上,我们将采用以下几个关键技术:

数据库集成:我们将使用Entity Framework作为ORM(对象关系映射)工具,与数据库进行集成。Entity Framework提供了一种简单且强大的方式来访问和操作数据库,可以大大简化数据访问层的开发工作。

安全性保护:我们将使用ASP.NET提供的身份验证和授权功能,确保只有经过授权的用户可以访问敏感数据和功能。我们还将使用加密技术来保护用户的敏感信息,如密码和支付信息。

缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。

异步编程:我们将使用ASP.NET提供的异步编程模型来处理并发请求和长时间运行的任务。这将提高应用程序的并发能力和响应性能,确保用户在高负载情况下仍然能够流畅地使用应用程序。

性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。

通过采用这些技术方案,我们的项目将能够提供一个高性能、可扩展和可靠的Web应用程序。我们将遵循最佳的软件开发实践,进行系统测试和性能测试,以确保应用程序的质量和稳定性。

SM2 SM3 X.509 Cert 国密 数字签名 算法 国密证书 生成 签发 证书请求 keystore 纯java.zip

01-14

Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势包括以下几个方面:

跨平台性(Write Once, Run Anywhere): Java的代码可以在不同的平台上运行,只需编写一次代码,就可以在任何支持Java的设备上执行。这得益于Java虚拟机(JVM),它充当了代码和底层硬件之间的中介。

面向对象: Java是一种纯粹的面向对象编程语言,支持封装、继承和多态等面向对象的概念。这使得Java编写的代码更加模块化、可维护和可扩展。

多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。

自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

基于数字水印的经典图像认证算法分析* (2006年)

05-22

图像认证是近几年发展起来的新技术,目前主要有2种用于图像认证的技术:基于数字签名的图像认证和基于数字水印的图像认证技术。主要针对基于数字水印的图像认证算法分类详细介绍了几种经典算法,对这几种算法各自的优缺点作出比较分析,最后对未来算法的研究工作做出了展望。

蓝桥杯练习系统-基础题全解C++

最新发布

03-06

蓝桥杯练习系统-基础题全解C++

springboot145基于SpringBoot基于java的在线问卷调查系统的设计-毕业源码案例设计

03-06

如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为了解决现有问题而产生的。针对于问卷调查信息管理方面的不规范,容错率低,管理人员处理数据费工费时,采用新开发的在线问卷调查系统可以从根源上规范整个数据处理流程的正规性和合法性。

在线问卷调查系统能够实现问卷管理,用户管理,题目管理,问卷调查管理,新闻资讯管理等功能。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。

在线问卷调查系统可以提高问卷调查信息管理问题的解决效率,优化问卷调查信息处理流程,并且能够保证存储数据的安全,它是一个非常可靠,非常安全的应用程序。

关键词:在线问卷调查系统;Mysql数据库;Java语言

Java毕设-基于springboot+vue的智慧图书管理系统设计与实现(附源码,数据库,教程).zip

03-06

Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。

包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。

该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

项目都经过严格调试,确保可以运行!

1. 技术组成

前端:html、javascript、Vue

后台框架:SpringBoot

开发环境:idea

数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑)

数据库工具:navicat

部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven

2. 部署

如果部署有疑问的话,可以找我咨询

后台路径地址:localhost:8080/项目名称/admin/dist/index.html

前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

Java毕设-基于springboot+Vue的人事管理系统(附源码,数据库,教程).zip

03-06

Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。

包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。

该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

项目都经过严格调试,确保可以运行!

1. 技术组成

前端:html、javascript、Vue

后台框架:SpringBoot

开发环境:idea

数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑)

数据库工具:navicat

部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven

2. 部署

如果部署有疑问的话,可以找我咨询

后台路径地址:localhost:8080/项目名称/admin/dist/index.html

前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

基于Java的家政服务平台的设计与实现(毕业论文)

03-06

Java基于springboot的家政服务平台的设计与实现

此家政服务平台利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。

家政服务平台有管理员,雇主,雇员三个角色。管理员功能有个人中心,雇主管理,雇员管理,资料认证管理,项目类型管理,服务项目管理,需求信息管理,服务预约管理,申请预约管理,签订合同管理,雇主评价管理,留言板管理,系统管理。雇主可以发布需求,雇员可以申请预约,雇主支付报酬,雇主和雇员可以签订合同,雇主可以对雇员进行评价。

Java房屋租赁管理系统的设计与实现使用SpringBoot+MyBatis框架.zip

03-06

在实际中使用房屋租赁管理系统,其意义如下:

第一点:房屋租赁管理系统的实际运用,可以帮助管理人员在短时间内完成信息处理工作;

第二点:通过系统页面的合理排版布局,可以更加直观的展示系统的内容,并且使用者可以随时阅读页面信息,随时操作系统提供的功能;

第三点:可以实现信息管理计算机化;

第四点:可以降低信息管理成本;

对房屋租赁管理系统设计制作,不仅需要技术支撑,也需要大量的理论研究。本文在对房屋租赁管理系统进行介绍时,将按照如下内容进行。

第一部分:介绍房屋租赁管理系统研究的背景意义,便于用户了解系统;

第二部分:介绍开发房屋租赁管理系统需要搭建的环境,包括技术和工具;

第三部分:介绍用户对房屋租赁管理系统的功能要求,以及对房屋租赁管理系统的性能要求等;

第四部分:介绍数据库的设计方案,以及根据功能要求设计的功能结构;

第五部分:介绍通过编码最终实现的系统功能运行效果;

第六部分:介绍系统的功能测试,对系统进行综合检测,并及时解决系统出现的问题,直至系统运行正常。

用C++,不使用OpenSSL库函数,简单地实现DSA签名算法代码,哈希函数用消息本身替代,要求其中要有实现数字签名算法中的公共参数,实现数字签名算法中的公、私钥,实现数字签名算法中的签名算法,实现数字签名算法中的验证算法

05-31

好的,我会根据您的要求来回答您的问题。

首先,我们需要了解DSA数字签名算法的原理。

DSA数字签名算法是一种基于离散对数问题的公钥密码算法,其安全性基于大整数分解和离散对数问题的困难性。DSA数字签名算法由以下几部分组成:

1. 公共参数:包括p、q、g三个参数,其中p是一个大质数,q是p-1的一个大质因子,g是模p的一个原根。

2. 公钥和私钥:公钥包括y和p两个参数,私钥包括x和p两个参数。其中,y=g^x mod p,x是私钥,y是公钥。

3. 签名算法:包括哈希函数、随机数生成函数、签名生成函数。

4. 验证算法:包括哈希函数、签名验证函数。

下面是用C++实现DSA签名算法的代码:

```c++

#include

#include

#include

#include

using namespace std;

//欧几里得算法求最大公约数

int gcd(int a,int b)

{

if(b==0) return a;

return gcd(b,a%b);

}

//判断是否为素数

bool isprime(int n)

{

if(n==2) return true;

if(n<2||n%2==0) return false;

for(int i=3;i<=sqrt(n);i+=2)

if(n%i==0) return false;

return true;

}

//求模反元素

int inv(int a,int p)

{

int d,x,y;

d=gcd(a,p);

if(d==1)

{

x=1;

y=0;

while(a*x%p!=1)

x++;

return x;

}

else return 0;

}

//生成公钥和私钥

void genkey(int &p,int &q,int &g,int &x,int &y)

{

srand(time(0));

do{

q=rand()%1000+1000;

}while(!isprime(q));

do{

p=rand()%(2*q-1)+q;

}while(!isprime(p));

for(g=2;g

{

if(pow(g,q)%p==1) continue;

else if(pow(g,(p-1)/q)%p==1) continue;

else break;

}

x=rand()%q;

y=pow(g,x)%p;

}

//哈希函数

int hash(string msg,int p)

{

int h=0;

for(int i=0;i

h=(h+msg[i])%p;

return h;

}

//签名生成函数

void sign(int h,int q,int g,int x,int &r,int &s)

{

int k;

do{

k=rand()%q;

}while(k==0);

r=pow(g,k)%q;

s=(inv(k,q)*(h+x*r))%q;

}

//签名验证函数

bool verify(int h,int q,int g,int y,int r,int s)

{

int w,u1,u2,v;

w=inv(s,q);

u1=(h*w)%q;

u2=(r*w)%q;

v=((pow(g,u1)*pow(y,u2))%q)%p;

if(v==r) return true;

else return false;

}

int main()

{

int p,q,g,x,y,r,s,h;

string msg="Hello world!";

genkey(p,q,g,x,y);

cout<<"p="<

cout<<"q="<

cout<<"g="<

cout<<"x="<

cout<<"y="<

h=hash(msg,p);

sign(h,q,g,x,r,s);

cout<<"r="<

cout<<"s="<

if(verify(h,q,g,y,r,s)) cout<<"Verify success!"<

else cout<<"Verify failed!"<

return 0;

}

```

以上代码实现了DSA数字签名算法,包括生成公共参数、公钥和私钥、哈希函数、签名生成函数和签名验证函数。您可以在本地编译运行代码,进行测试和调试。

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

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

SmarTongs

CSDN认证博客专家

CSDN认证企业博客

码龄5年

暂无认证

68

原创

30万+

周排名

201万+

总排名

6万+

访问

等级

846

积分

33

粉丝

36

获赞

19

评论

155

收藏

私信

关注

热门文章

python pandas读取csv文件报错:encoding=‘gb2312‘

9306

Call From Master/192.168.47.100 to localhost:9000 failed on connection exception: java.net. 报错解决方法

8662

几种常见的数字签名算法比较

8581

2021-10-26 数据存储的基本原理

3826

java正则表达式匹配规则总结

3101

分类专栏

数据存储

8篇

机器学习

4篇

本科学习

2篇

可视化

2篇

hadoop

5篇

信息检索与数据挖掘

5篇

c++基础知识

5篇

leetcode

3篇

大数据安全

3篇

python与数据处理

3篇

论文书写

1篇

程序设计思维与实践

27篇

算法与数据结构

最新评论

Call From Master/192.168.47.100 to localhost:9000 failed on connection exception: java.net. 报错解决方法

SmarTongs:

直接在代码里边改

Call From Master/192.168.47.100 to localhost:9000 failed on connection exception: java.net. 报错解决方法

Awibf:

在哪里改Java文件啊?

Call From Master/192.168.47.100 to localhost:9000 failed on connection exception: java.net. 报错解决方法

weixin_53630309:

牛!!!谢谢大哥,终于解决了!!!

Call From Master/192.168.47.100 to localhost:9000 failed on connection exception: java.net. 报错解决方法

笨比翅翅:

谢谢您。给您点大赞。

Call From Master/192.168.47.100 to localhost:9000 failed on connection exception: java.net. 报错解决方法

JAMESALLIN:

解决了困扰很久的问题

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

Ubuntu截图命令

java正则表达式匹配规则总结

NoSQL 数据库比较

2023年1篇

2022年1篇

2021年31篇

2020年35篇

目录

目录

分类专栏

数据存储

8篇

机器学习

4篇

本科学习

2篇

可视化

2篇

hadoop

5篇

信息检索与数据挖掘

5篇

c++基础知识

5篇

leetcode

3篇

大数据安全

3篇

python与数据处理

3篇

论文书写

1篇

程序设计思维与实践

27篇

算法与数据结构

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

签名算法 - 廖雪峰的官方网站

签名算法 - 廖雪峰的官方网站

Index

廖雪峰的官方网站

Blog

Java教程

手写Spring

手写Tomcat

Makefile教程

Python教程

JavaScript教程

区块链教程

SQL教程

Git教程

文章

问答

More

Java教程

手写Spring

手写Tomcat

Makefile教程

Python教程

JavaScript教程

区块链教程

SQL教程

Git教程

文章

问答

Java教程

手写Spring

手写Tomcat

Makefile教程

Python教程

JavaScript教程

区块链教程

SQL教程

Git教程

文章

问答

 

Profile

Passkey

Sign Out

Sign In

English

简体中文

Index

Java教程

Java快速入门

Java简介

安装JDK

第一个Java程序

Java代码助手

使用IDE

使用IDE练习插件

Java程序基础

Java程序基本结构

变量和数据类型

整数运算

浮点数运算

布尔运算

字符和字符串

数组类型

流程控制

输入和输出

if判断

switch多重选择

while循环

do while循环

for循环

break和continue

数组操作

遍历数组

数组排序

多维数组

命令行参数

面向对象编程

面向对象基础

方法

构造方法

方法重载

继承

多态

抽象类

接口

静态字段和静态方法

作用域

内部类

classpath和jar

class版本

模块

Java核心类

字符串和编码

StringBuilder

StringJoiner

包装类型

JavaBean

枚举类

记录类

BigInteger

BigDecimal

常用工具类

异常处理

Java的异常

捕获异常

抛出异常

自定义异常

NullPointerException

使用断言

使用JDK Logging

使用Commons Logging

使用Log4j

使用SLF4J和Logback

反射

Class类

访问字段

调用方法

调用构造方法

获取继承关系

动态代理

注解

使用注解

定义注解

处理注解

泛型

什么是泛型

使用泛型

编写泛型

擦拭法

extends通配符

super通配符

泛型和反射

集合

Java集合简介

使用List

编写equals方法

使用Map

编写equals和hashCode

使用EnumMap

使用TreeMap

使用Properties

使用Set

使用Queue

使用PriorityQueue

使用Deque

使用Stack

使用Iterator

使用Collections

IO

File对象

InputStream

OutputStream

Filter模式

操作Zip

读取classpath资源

序列化

Reader

Writer

PrintStream和PrintWriter

使用Files

日期与时间

基本概念

Date和Calendar

LocalDateTime

ZonedDateTime

DateTimeFormatter

Instant

最佳实践

单元测试

编写JUnit测试

使用Fixture

异常测试

条件测试

参数化测试

正则表达式

正则表达式简介

匹配规则

复杂匹配规则

分组匹配

非贪婪匹配

搜索和替换

加密与安全

编码算法

哈希算法

BouncyCastle

Hmac算法

对称加密算法

口令加密算法

密钥交换算法

非对称加密算法

签名算法

数字证书

多线程

多线程基础

创建新线程

线程的状态

中断线程

守护线程

线程同步

同步方法

死锁

使用wait和notify

使用ReentrantLock

使用Condition

使用ReadWriteLock

使用StampedLock

使用Semaphore

使用Concurrent集合

使用Atomic

使用线程池

使用Future

使用CompletableFuture

使用ForkJoin

使用ThreadLocal

使用虚拟线程

Maven基础

Maven介绍

依赖管理

构建流程

使用插件

模块管理

使用mvnw

发布Artifact

网络编程

网络编程基础

TCP编程

UDP编程

发送Email

接收Email

HTTP编程

RMI远程调用

XML与JSON

XML简介

使用DOM

使用SAX

使用Jackson

使用JSON

JDBC编程

JDBC简介

JDBC查询

JDBC更新

JDBC事务

JDBC Batch

JDBC连接池

函数式编程

Lambda基础

方法引用

使用Stream

创建Stream

使用map

使用filter

使用reduce

输出集合

其他操作

设计模式

创建型模式

工厂方法

抽象工厂

生成器

原型

单例

结构型模式

适配器

桥接

组合

装饰器

外观

享元

代理

行为型模式

责任链

命令

解释器

迭代器

中介

备忘录

观察者

状态

策略

模板方法

访问者

Web开发

Web基础

Servlet入门

Servlet开发

Servlet进阶

重定向与转发

使用Session和Cookie

JSP开发

MVC开发

MVC高级开发

使用Filter

修改请求

修改响应

使用Listener

部署

Spring开发

IoC容器

IoC原理

装配Bean

使用Annotation配置

定制Bean

使用Resource

注入配置

使用条件装配

使用AOP

装配AOP

使用注解装配AOP

AOP避坑指南

访问数据库

使用JDBC

使用声明式事务

使用DAO

集成Hibernate

集成JPA

集成MyBatis

设计ORM

开发Web应用

使用Spring MVC

使用REST

集成Filter

使用Interceptor

处理CORS

国际化

异步处理

使用WebSocket

集成第三方组件

集成JavaMail

集成JMS

使用Scheduler

集成JMX

Spring Boot开发

第一个Spring Boot应用

使用开发者工具

打包Spring Boot应用

瘦身Spring Boot应用

使用Actuator

使用Profiles

使用Conditional

加载配置文件

禁用自动配置

添加Filter

集成第三方组件

集成Open API

访问Redis

集成Artemis

集成RabbitMQ

集成Kafka

Spring Cloud开发

项目架构设计

搭建项目框架

设计交易引擎

设计资产系统

设计订单系统

设计撮合引擎

设计清算系统

完成交易引擎

设计定序系统

设计API系统

设计行情系统

设计推送系统

编写UI

项目总结

关注公众号不定期领红包:

加入知识星球社群:

关注微博获取实时动态:

签名算法

Last updated: ...

/

Reads: 838549

Edit

我们使用非对称加密算法的时候,对于一个公钥-私钥对,通常是用公钥加密,私钥解密。

如果使用私钥加密,公钥解密是否可行呢?实际上是完全可行的。

不过我们再仔细想一想,私钥是保密的,而公钥是公开的,用私钥加密,那相当于所有人都可以用公钥解密。这个加密有什么意义?

这个加密的意义在于,如果小明用自己的私钥加密了一条消息,比如小明喜欢小红,然后他公开了加密消息,由于任何人都可以用小明的公钥解密,从而使得任何人都可以确认小明喜欢小红这条消息肯定是小明发出的,其他人不能伪造这个消息,小明也不能抵赖这条消息不是自己写的。

因此,私钥加密得到的密文实际上就是数字签名,要验证这个签名是否正确,只能用私钥持有者的公钥进行解密验证。使用数字签名的目的是为了确认某个信息确实是由某个发送方发送的,任何人都不可能伪造消息,并且,发送方也不能抵赖。

在实际应用的时候,签名实际上并不是针对原始消息,而是针对原始消息的哈希进行签名,即:

signature = encrypt(privateKey, sha256(message))

对签名进行验证实际上就是用公钥解密:

hash = decrypt(publicKey, signature)

然后把解密后的哈希与原始消息的哈希进行对比。

因为用户总是使用自己的私钥进行签名,所以,私钥就相当于用户身份。而公钥用来给外部验证用户身份。

常用数字签名算法有:

MD5withRSA

SHA1withRSA

SHA256withRSA

它们实际上就是指定某种哈希算法进行RSA签名的方式。

import java.math.BigInteger;

import java.nio.charset.StandardCharsets;

import java.security.*;

----

public class Main {

public static void main(String[] args) throws GeneralSecurityException {

// 生成RSA公钥/私钥:

KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");

kpGen.initialize(1024);

KeyPair kp = kpGen.generateKeyPair();

PrivateKey sk = kp.getPrivate();

PublicKey pk = kp.getPublic();

// 待签名的消息:

byte[] message = "Hello, I am Bob!".getBytes(StandardCharsets.UTF_8);

// 用私钥签名:

Signature s = Signature.getInstance("SHA1withRSA");

s.initSign(sk);

s.update(message);

byte[] signed = s.sign();

System.out.println(String.format("signature: %x", new BigInteger(1, signed)));

// 用公钥验证:

Signature v = Signature.getInstance("SHA1withRSA");

v.initVerify(pk);

v.update(message);

boolean valid = v.verify(signed);

System.out.println("valid? " + valid);

}

}

使用其他公钥,或者验证签名的时候修改原始信息,都无法验证成功。

DSA签名

除了RSA可以签名外,还可以使用DSA算法进行签名。DSA是Digital Signature Algorithm的缩写,它使用ElGamal数字签名算法。

DSA只能配合SHA使用,常用的算法有:

SHA1withDSA

SHA256withDSA

SHA512withDSA

和RSA数字签名相比,DSA的优点是更快。

ECDSA签名

椭圆曲线签名算法ECDSA:Elliptic Curve Digital Signature Algorithm也是一种常用的签名算法,它的特点是可以从私钥推出公钥。比特币的签名算法就采用了ECDSA算法,使用标准椭圆曲线secp256k1。BouncyCastle提供了ECDSA的完整实现。

练习

签名算法练习

小结

数字签名就是用发送方的私钥对原始数据进行签名,只有用发送方公钥才能通过签名验证。

数字签名用于:

防止伪造;

防止抵赖;

检测篡改。

常用的数字签名算法包括:MD5withRSA/SHA1withRSA/SHA256withRSA/SHA1withDSA/SHA256withDSA/SHA512withDSA/ECDSA等。

Comments

Make a comment

Sign in to

make a comment

Index

Java教程

Java快速入门

Java简介

安装JDK

第一个Java程序

Java代码助手

使用IDE

使用IDE练习插件

Java程序基础

Java程序基本结构

变量和数据类型

整数运算

浮点数运算

布尔运算

字符和字符串

数组类型

流程控制

输入和输出

if判断

switch多重选择

while循环

do while循环

for循环

break和continue

数组操作

遍历数组

数组排序

多维数组

命令行参数

面向对象编程

面向对象基础

方法

构造方法

方法重载

继承

多态

抽象类

接口

静态字段和静态方法

作用域

内部类

classpath和jar

class版本

模块

Java核心类

字符串和编码

StringBuilder

StringJoiner

包装类型

JavaBean

枚举类

记录类

BigInteger

BigDecimal

常用工具类

异常处理

Java的异常

捕获异常

抛出异常

自定义异常

NullPointerException

使用断言

使用JDK Logging

使用Commons Logging

使用Log4j

使用SLF4J和Logback

反射

Class类

访问字段

调用方法

调用构造方法

获取继承关系

动态代理

注解

使用注解

定义注解

处理注解

泛型

什么是泛型

使用泛型

编写泛型

擦拭法

extends通配符

super通配符

泛型和反射

集合

Java集合简介

使用List

编写equals方法

使用Map

编写equals和hashCode

使用EnumMap

使用TreeMap

使用Properties

使用Set

使用Queue

使用PriorityQueue

使用Deque

使用Stack

使用Iterator

使用Collections

IO

File对象

InputStream

OutputStream

Filter模式

操作Zip

读取classpath资源

序列化

Reader

Writer

PrintStream和PrintWriter

使用Files

日期与时间

基本概念

Date和Calendar

LocalDateTime

ZonedDateTime

DateTimeFormatter

Instant

最佳实践

单元测试

编写JUnit测试

使用Fixture

异常测试

条件测试

参数化测试

正则表达式

正则表达式简介

匹配规则

复杂匹配规则

分组匹配

非贪婪匹配

搜索和替换

加密与安全

编码算法

哈希算法

BouncyCastle

Hmac算法

对称加密算法

口令加密算法

密钥交换算法

非对称加密算法

签名算法

数字证书

多线程

多线程基础

创建新线程

线程的状态

中断线程

守护线程

线程同步

同步方法

死锁

使用wait和notify

使用ReentrantLock

使用Condition

使用ReadWriteLock

使用StampedLock

使用Semaphore

使用Concurrent集合

使用Atomic

使用线程池

使用Future

使用CompletableFuture

使用ForkJoin

使用ThreadLocal

使用虚拟线程

Maven基础

Maven介绍

依赖管理

构建流程

使用插件

模块管理

使用mvnw

发布Artifact

网络编程

网络编程基础

TCP编程

UDP编程

发送Email

接收Email

HTTP编程

RMI远程调用

XML与JSON

XML简介

使用DOM

使用SAX

使用Jackson

使用JSON

JDBC编程

JDBC简介

JDBC查询

JDBC更新

JDBC事务

JDBC Batch

JDBC连接池

函数式编程

Lambda基础

方法引用

使用Stream

创建Stream

使用map

使用filter

使用reduce

输出集合

其他操作

设计模式

创建型模式

工厂方法

抽象工厂

生成器

原型

单例

结构型模式

适配器

桥接

组合

装饰器

外观

享元

代理

行为型模式

责任链

命令

解释器

迭代器

中介

备忘录

观察者

状态

策略

模板方法

访问者

Web开发

Web基础

Servlet入门

Servlet开发

Servlet进阶

重定向与转发

使用Session和Cookie

JSP开发

MVC开发

MVC高级开发

使用Filter

修改请求

修改响应

使用Listener

部署

Spring开发

IoC容器

IoC原理

装配Bean

使用Annotation配置

定制Bean

使用Resource

注入配置

使用条件装配

使用AOP

装配AOP

使用注解装配AOP

AOP避坑指南

访问数据库

使用JDBC

使用声明式事务

使用DAO

集成Hibernate

集成JPA

集成MyBatis

设计ORM

开发Web应用

使用Spring MVC

使用REST

集成Filter

使用Interceptor

处理CORS

国际化

异步处理

使用WebSocket

集成第三方组件

集成JavaMail

集成JMS

使用Scheduler

集成JMX

Spring Boot开发

第一个Spring Boot应用

使用开发者工具

打包Spring Boot应用

瘦身Spring Boot应用

使用Actuator

使用Profiles

使用Conditional

加载配置文件

禁用自动配置

添加Filter

集成第三方组件

集成Open API

访问Redis

集成Artemis

集成RabbitMQ

集成Kafka

Spring Cloud开发

项目架构设计

搭建项目框架

设计交易引擎

设计资产系统

设计订单系统

设计撮合引擎

设计清算系统

完成交易引擎

设计定序系统

设计API系统

设计行情系统

设计推送系统

编写UI

项目总结

廖雪峰的官方网站

©Copyright 2019-2021

Powered by iTranswarp

Feedback

License

签名算法_百度百科

_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心收藏查看我的收藏0有用+10签名算法播报讨论上传视频数字签名的算法本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。签名算法是指数字签名的算法。数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。数字签名是通过一个单向函数,对要传送的信息进行处理得到的用以认证信息来源,并核实信息在传送过程中是否发生变化的一个字母数字串。应用最为广泛的三种签名算法是:Rabin签名、DSS签名、RSA签名。中文名签名算法外文名signature algorithm学    科计算机科学类    别数字签名特    征加密传输主要方法Rabin签名、DSS签名、RSA签名。目录1基本概念2实现方法3相关步骤4算法比较▪安全性▪参数选择▪参数共享性▪签名速度▪验证速度▪印记长度▪印记的重复性基本概念播报编辑签名算法是指数字签名的算法。数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名是通过一个单向函数,对要传送的信息进行处理得到的用以认证信息来源,并核实信息在传送过程中是否发生变化的一个字母数字串。数字签名提供了对信息来源的确定并能检测信息是否被篡改。数字签名要实现的功能是我们平常的手写签名要实现功能的扩展。平常在书面文件上签名的主要作用有两点,一是因为对自己的签名本人难以否认,从而确定了文件已被自己签署这一事实;二是因为自己的签名不易被别人模仿,从而确定了文件是真的这一事实。采用数字签名,也能完成这些功能 [1]:(1)确认信息是由签名者发送的;(2)确认信息自签名后到收到为止,未被修改过。数字签名算法有映象式和印记式两类。由于印记式的签名速度和验证速度比映象式快得多,因此印记式数字签名算法更为实用。实现方法播报编辑实现数字签名有很多方法 [2],数字签名采用较多的是公钥加密技术,同时应用最为广泛的三种是:Hash签名、DSA签名、RSA签名。对称密钥密码算法进行数字签名对称密钥密码算法所用的加密密钥和解密密钥通常是相同的,即使不同也可以很容易地由其中的任意一个推导出另一个。在此算法中,加、解密双方所用的密钥都要保守秘密。Lamport发明了称为Lamport.Difle的对称算法:利用一组长度是报文的比特数(n)两倍的密钥A,来产生对签名的验证信息,即随机选择2n个数B,由签名密钥对这2n个数B进行一次加密交换,得到另一组2n个数C。发送和接收的方式如下:(1)发送发送方从报文分组M的第一位开始,检查M的第i位:M的第i位为0时,取密钥A的第i位;M的第i位为1时,取密钥A的第i+1位。直至报文全部检查完毕,所选取的n个密钥位形成了最后的签名。(2)接收接受方对签名进行验证,从第一位开始依次检查报文M:M的第i位为0时,签名中的第i组信息是密钥A的第i位;M的第i位为1时,签名中的第i组信息为密钥A的第i+1位。直至报文全部验证完毕后,就得到了n个密钥,由于接受方发送验证信息c,所以可以利用得到的n个密钥检验验证信息,从而确认报文是否是由发送方所发送。Hash签名单向函数的概念是计算起来相对容易,但求逆却非常困难。也就是说,已知X,我们很容易计算f(X)。但已知f(X),却难于计算出X。单向Hash函数有很多名字:压缩函数、缩短函数、消息摘要、指纹等。单向Hash函数H(M)对一则任意长度的消息进行处理,返回一个具有固定长度m的散列值h:h=H(M),其中h的长度为m=H(M)具有以下属性:(1)给定M,很容易计算出h,这表现了函数的快速性;(2)给定h,很难计算出满足H(M)=h的M,这表现了函数的单向性;(3)给定M1,很难找到一则消息M2,使得H(M1)=H(M2);(4)h=H(M),h的每一比特都与M 的每一比特有关,并有高度敏感性。即每改变M的一比特,都将对h产生明显影响;(5)Hash函数除了信息M 自身之外,应该基于发信方的秘密信息对信息M进行确认;(6)输入数据M没有长度限制;(7)对输入任何长度的M数据能够生成该输入报文固定长度的输出。相关步骤播报编辑RSA数字签名算法产生签名与验证参数:Step1,签名人A选择两个大素数p、q,计算n=pq及中Φ(n) = (P-1)(q-1);Step2,寻找e 、d 使满足(eΦ(n)) 1及ed l(mod Φ(n));Step3,公开验证参数{n,e},A 保存{ p, q,d , Φ(n)}作为秘密的签名参数;Step4,选用一通用的散列函数h(.)。签名算法:Step1,A将需签名的文件m(含接收人、内容、签名人、日期等)编码后映射成h(m) ;Step2,计算Step3,将{m, }发送至文件接收人B或仲裁人T(A、B、T的含义下同)。验证算法:B(或T)检验是否成立,若成立则接收此文件及签名,否则拒绝接收或宣布无效。Rabin数字签名算法产生签名与验证参数:Step1,签名人A选择两个大素数p、q,计算n=pq;Step2,公开验证参数n,A 保存{ p, q}作为秘密的签名参数;Step3,选用一通用的散列函数h(.)。签名算法:Step1,A 将需签名的文件m编码后映射成h(m);Step2,计算 mod p, mod q及印记Step3,将{m, , }发送至文件接收人B或T。验证算法:B或T检验是否成立,若成立则接收此文件及签名,否则拒绝接收或宣布无效。DSS数字签名算法产生签名与验证参数:Step1,A 选择一个大素数p,p-1应具有大素数因子q,选择一个g使g的次数为q,再选择一个计算 mod p;Step2,公开验证参数{p,q,g,y},A 保存{ p, q}作为秘密的签名参数;Step3,选用一通用的散列函数h(.)。签名算法:Step1,A 将需签名的文件m编码后映射成h(m),计算 使Step2,计算及s (h(m)+xr) mod q;Step3,将{m,r,s}发送至文件接收人B或T。验证算法:Step1,B(或T)先计算u h(m) mod q及v r mod q;Step2,检验是否成立,若成立则接收此文件及签名, 否则拒绝接收或宣布无效。算法比较播报编辑下面是对三种签名算法RSA、Rabin、DSS算法的比较。安全性由于求解mod n(n=np)的平方根问题以高概率等价于n的整数分解问题(Rabin定理),所以Rabin算法的安全性与RSA大体相当。DSS的安全性是建立在求离散对数问题上,至今虽未证明破解DS与求解q阶乘法群的离散对数等价,但也未找到其他可绕开求离散对数的解法。整数分解与求离散对数的计算复杂度是近似的,因而上述三种签名算法的安全性大体相当。参数选择DSS算法参数的选择比前两种算法要容易。RSA算法出于安全性考虑,对参数p、q的选择有一些较严格的要求,如 (k为较小自然数)应足够大、gcd(p-1,q-1)应比较小、p 1和q 1都应至少含有一个充分大的素数因子等;Rabin算法对参数p、q的要求与RSA算法大体相同,但为了达到与RSA相当的安全性,其参数p、q应比RSA算法中稍大;DSS算法安全性的关键参数是q,可比前两种算法中的n值略小,但应远大于单独的p和q。参数共享性RSA 算法和Rabin算法都无法共享参数;因为DSS算法可以对k有不同选择,所以可以共享参数p、q、g,参数共享时至今尚未发现用户之间可以互相伤害的途径。签名速度DSS算法签名速度较慢。RSA算法和Rabin算法签名时耗费时间的主要部分都是mod p、mod q的指数运算,这两种算法签名速度大体相同;DSS 算法签名时mod p(p>q)的指数运算所耗费的时间要比前两种算法长。验证速度DSS算法验证速度较慢。Rabin算法验证时需进行一次mod n的平方运算,而RSA算法验证时需进行一次mod n的e次指数运算,因此RSA算法比Rabin算法要稍慢;DSS算法验证时需要进行2次mod p的指数运算,因此DSS算法验证速度较前两种算法慢,,而Rabin算法验证速度最快。印记长度DSS算法签名印记较长。RSA算法和Rabin算法的签名印记都是一个mod n 数 ,只是Rabin算法多了1个很小的数 ;DSS算法的签名印记是两个mod q数r 、s,比起前两种算法的印记 要长一些。印记的重复性DSS算法签名印记具有不重复特性。文件m和h(m)完全相同,用DSS算法签名时因每次可以选择不同的k产生签名印记,故DSS算法的签名印记每次可以不同;RSA算法和Rabin算法无此特性,但可以对算法作适当改进,以增加1个随机数加长传送的数据为代价,使算法具有签名印记不重复的特性 [3]。新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

数字签名_百度百科

_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心数字签名播报讨论上传视频科技名词收藏查看我的收藏0有用+10本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是在使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名是非对称密钥加密技术与数字摘要技术的应用。 [1]中文名数字签名外文名 digital signature;digitally signed别    名公钥数字签名用    途鉴别数字信息包含运算两种互补的运算,一个用于签名,另一个用于验证技    术非对称密钥加密技术与数字摘要技术目录1原理2特点▪鉴权▪完整性▪不可抵赖3主要功能4签名过程5使用方法6邮件证书7实现方法8签名步骤▪Java签名步骤▪office签名步骤9应用例子10区分攻击▪异常结果▪正常结果11网络安全原理播报编辑数字签名的文件的完整性是很容易验证的(不需要骑缝章,骑缝签名,也不需要笔迹专家),而且数字签名具有不可抵赖性(不可否认性)。 [1]简单地说,所谓数字签名就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。它是对电子形式的消息进行签名的一种方法,一个签名消息能在一个通信网络中传输。基于公钥密码体制和私钥密码体制都可以获得数字签名,主要是基于公钥密码体制的数字签名。包括普通数字签名和特殊数字签名。普通数字签名算法有RSA、ElGamal、Fiat-Shamir、Guillou- Quisquarter、Schnorr、Ong-Schnorr-Shamir数字签名算法、Des/DSA,椭圆曲线数字签名算法和有限自动机数字签名算法等。特殊数字签名有盲签名、代理签名、群签名、不可否认签名、公平盲签名、门限签名、具有消息恢复功能的签名等,它与具体应用环境密切相关。显然,数字签名的应用涉及到法律问题,美国联邦政府基于有限域上的离散对数问题制定了自己的数字签名标准(DSS)。 [1]特点播报编辑每个人都有一对“钥匙”(数字身份),其中一个只有她/他本人知道(私钥),另一个公开的(公钥)。签名的时候用私钥,验证签名的时候用公钥。又因为任何人都可以落款声称她/他就是你,因此公钥必须向接受者信任的人(身份认证机构)来注册。注册后身份认证机构给你发一数字证书。对文件签名后,你把此数字证书连同文件及签名一起发给接受者,接受者向身份认证机构求证是否真地是用你的密钥签发的文件。 [2]在通讯中使用数字签名一般具有以下特点: [2]鉴权公钥加密系统允许任何人在发送信息时使用公钥进行加密,接收信息时使用私钥解密。当然,接收者不可能百分之百确信发送者的真实身份,而只能在密码系统未被破译的情况下才有理由确信。 [2]鉴权的重要性在财务数据上表现得尤为突出。举个例子,假设一家银行将指令由它的分行传输到它的中央管理系统,指令的格式是(a,b),其中a是账户的账号,而b是账户的现有金额。这时一位远程客户可以先存入100元,观察传输的结果,然后接二连三的发送格式为(a,b)的指令。这种方法被称作重放攻击。 [2]完整性传输数据的双方都总希望确认消息未在传输的过程中被修改。加密使得第三方想要读取数据十分困难,然而第三方仍然能采取可行的方法在传输的过程中修改数据。一个通俗的例子就是同形攻击:回想一下,还是上面的那家银行从它的分行向它的中央管理系统发送格式为(a,b)的指令,其中a是账号,而b是账户中的金额。一个远程客户可以先存100元,然后拦截传输结果,再传输(a,b),这样他就立刻变成百万富翁了。 [2]不可抵赖在密文背景下,抵赖这个词指的是不承认与消息有关的举动(即声称消息来自第三方)。消息的接收方可以通过数字签名来防止所有后续的抵赖行为,因为接收方可以出示签名给别人看来证明信息的来源。 [2]主要功能播报编辑网络的安全,主要是网络信息安全,需要取相应的安全技术措施,提供适合的安全服务。数字签名机制作为保障网络信息安全的手段之一,可以解决伪造、抵赖、冒充和篡改问题。数字签名的目的之一就是在网络环境中代替传统的手工签字与印章,有着重要作用: [3](1)防冒充(伪造)。私有密钥只有签名者自己知道,所以其他人不可能构造出正确的。 [3](2)可鉴别身份。由于传统的手工签名一般是双方直接见面的,身份自可一清二楚。在网络环境中,接收方必须能够鉴别发送方所宣称的身份。 [3](3)防篡改(防破坏信息的完整性)。对于传统的手工签字,假如要签署一份200页的合同,是仅仅在合同末尾签名呢?还是对每一页都签名?如果仅在合同末尾签名,对方会不会偷换其中的几页? 而对于数字签名,签名与原有文件已经形成了一个混合的整体数据,不可能被篡改,从而保证了数据的完整性。 [3](4)防重放。如在日常生活中,A向B借了钱,同时写了一张借条给B,当A还钱的候,肯定要向B索回他写的借条撕毁,不然,恐怕他会再次用借条要求A还钱。在数字签名中,如果采用了对签名报文添加流水号、时间戳等技术,可以防止重放攻击。 [3](5)防抵赖。如前所述,数字签名可以鉴别身份,不可能冒充伪造,那么,只要保好签名的报文,就好似保存好了手工签署的合同文本,也就是保留了证据,签名者就无法抵赖。那如果接收者确已收到对方的签名报文,却抵赖没有收到呢? 要预防接收者的抵赖。在数字签名体制中,要求接收者返回一个自己的签名表示收到的报文,给对方或者第三方或者引入第三方机制。如此操作,双方均不可抵赖。 [3](6)机密性(保密性)。手工签字的文件(如同文本)是不具备保密性的,文件一旦丢失,其中的信息就极可能泄露。数字签名可以加密要签名消息的杂凑值,不具备对消息本身进行加密,当然,如果签名的报名不要求机密性,也可以不用加密。 [3]保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。 [4]数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者用发送者的公钥解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息 [8],与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。 [4]数字签名是个加密的过程,数字签名验证是个解密的过程。 [4]签名过程播报编辑发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用发送方的私钥对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方,接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再公钥来对报文附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认该报文是发送方的。 [5]数字签名有两种功效:一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。二是数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征,文件如果发生改变,数字摘要的值也将发生变化。不同的文件将得到不同的数字摘要。 一次数字签名涉及到一个哈希函数、接收者的公钥、发送方的私钥。 [5]使用方法播报编辑你可以对你发出的每一封电子邮件进行数字签名。这不是指落款,普遍把落款讹误成签名。在我国大陆,数字签名是具法律效力的,正在被普遍使用。2000年,中华人民共和国的新《合同法》首次确认了电子合同、电子签名的法律效力。2005年4月1日起,中华人民共和国首部《电子签名法》正式实施。邮件证书播报编辑具有数字签名功能的个人安全邮件证书是用户证书的一种,是指单位用户收发电子邮件时采用证书机制保证安全所必须具备的证书。个人安全电子邮件证书是符合x.509标准的数字安全证书,结合数字证书和S/MIME技术对普通电子邮件做加密和数字签名处理,确保电子邮件内容的安全性、机密性、发件人身份确认性和不可抵赖性。 具有数字签名功能的 个人安全邮件证书中包含证书持有人的电子邮件地址、证书持有人的公钥、颁发者(CA)以及颁发者对该证书的签名。个人安全邮件证书功能的实现决定于用户使用的邮件系统是否支持相应功能。 MS Outlook 、Outlook Express、Foxmail及CA安全电子邮件系统均支持相应功能。使用个人安全邮件证书可以收发加密和数字签名邮件,保证电子邮件传输中的机密性、完整性和不可否认性,确保电子邮件通信各方身份的真实性。 [6]实现方法播报编辑数字签名算法依靠公钥加密技术来实现的。在公钥加密技术里,每一个使用者有一对密钥:一把公钥和一把私钥。公钥可以自由发布,但私钥则秘密保存;还有一个要求就是要让通过公钥推算出私钥的做法不可能实现。 [7]普通的数字签名算法包括三种算法: [7]1.密码生成算法;2.标记算法;3.验证算法。数字签名技术大多基于哈希摘要和非对称密钥加密体制来实现。如果签名者想要对某个文件进行数字签名,他必须首先从可信的第三方机构(数字证书认证中心CA)取得私钥和公钥,这需要用到PKI技术。 [7]1.有哈希算法的数字签名与验证图1 数字签名及其验证哈希函数是一种“压缩函数”,利用哈希函数可以把任意长度的输入经由散列函数算法变换成固定长度的输出,该输出的哈希值就是消息摘要,也称数字摘要。在正式的数字签名中,发送方首先对发送文件采用哈希算法,得到一个固定长度的消息摘要( Message Digest);再用自己的私钥( Secret key,SK)对消息摘要进行签名,形成发送方的数字签名。数字签名将作为队件和原文一起发送给接收方;接收方首先用发送方的公钥对数字签名进行解密得到发送方的数字摘要,然后用相同的哈希函数对原文进行哈希计算,得到一个新的消息摘要,最后将消息摘要与收到的消息摘要做比较。具体过程如图1所示。 [7]2.基于非对称密钥加密体制的数字签名与验证图2 基于非对称密钥的数字签名与验证发送方首先将原文用自己的私钥加密得到数字签名,然后将原文和数字签名一起发送给接收方。接收方用发送方的公钥对数字签名进行解密,最后与原文进行比较,如图2所示数字签名是电子商务、电子政务中应用普遍、技术成熟、可操作性强的一种电子签名方法。它采用了规范化的程序和科学化的方法,用于鉴定签名人的身份以及对一项电子数据内容的认可。使用数字签名技术能够验证文件的原文在传输过程中有无变动,确保传输电子文件的完整性、真实性和不可抵赖性。 [7]签名步骤播报编辑Java签名步骤1、将applet的class文件打包成*.jar(可以在命令行中输入jar查看帮助) [7]2、首先我们要生成一个keystore 否则在签名的时候报如下错误 [7]jarsigner 错误: java.lang.RuntimeException: 密钥库装入: C:\Documents and Settings\ij2ee\.keystore (系统找不到指定的文件。). (这边的ij2ee 是当前系统用户名) [7]生成keystore的语句:keytool -genkey -alias 别名你可以自己写 -keyalg RSA -keystore .keystore [7]下面是会出现的数字签名的一些步骤操作: [7]输入keystore密码:再次输入新密码:您的名字与姓氏是什么?[Unknown]: ij2ee您的组织单位名称是什么?[Unknown]: mtk您的组织名称是什么?[Unknown]: mtk您所在的城市或区域名称是什么?[Unknown]: suzhou您所在的州或省份名称是什么?[Unknown]: jiangsu该单位的两字母国家代码是什么[Unknown]: cnCN=ij2ee, OU=mtk, O=mtk, L=suzhou, ST=jiangsu, C=cn 正确吗?[否]: y输入的主密码(如果和 keystore密码相同,按回车):这时候会在jdk的bin目录下生成 .keystore 。把这个.keystore文件移动到 C:\Documents and Settings\当前系统用户的目录下面。3、创建一个数字证书 [7]在命令行中输入如下指令,peakCA和peakCALib自己起名字好了,3650是有效天数,就是10年左右,在创建证书的的时候,需要填写证书的一些信息和证书对应的私钥密码。 [7]keytool -genkey -alias peakCA -keyalg RSA -keysize 1024 -keystore peakCALib -validity 36504、将证书导出到证书文件中 [7]在命令行中输入如下指令,peakCA和peakCALib任意起名字,******是输入的密码。 [7]keytool -export -alias peakCA -file peakCA.cer -keystore peakCALib -storepass ****** -rfc5、授权jar文件,在命令行中输入如下指令 [7]jarsigner -keystore peakCALib myapplet.jar peakCAoffice签名步骤1、要保护文档内容的真实性,可以添加不可见的数字签名。 已签名文档的底部有“签名”按钮。 [7]2、单击“文件”选项卡。 [7]3、单击“信息”。 [7]4、在“权限”下,单击“保护文档”、“保护工作簿”或“保护演示文稿”。 [7]5、单击“添加数字签名”。 [7]6、阅读 Word、Excel 或 PowerPoint中显示的消息,然后单击“确定”。 [7]7、在“签名”对话框中的“签署此文档的目的”框中,键入目的。 [7]8、单击“签名”。 [7]9、在对文件进行数字签名后,将出现“签名”按钮,并且文件会变为只读以防止修改。 [7]应用例子播报编辑假如 Alice 向 Bob 传送数字信息,为了保证信息传送的保密性、真实性、完整性和不可否认性,需要对传送的信息进行数字加密和签名,其传送过程为: [3]1.Alice 准备好要传送的数字信息(明文); [3]2.Alice 对数字信息进行哈希运算,得到一个信息摘要; [3]3.Alice 用自己的私钥对信息摘要进行加密得到 Alice 的数字签名,并将其附在数字信息上; [3]4.Alice 随机产生一个加密密钥,并用此密码对要发送的信息进行加密,形成密文; [3]5.Alice 用 Bob 的公钥对刚才随机产生的加密密钥进行加密,将加密后的 DES密钥连同密文一起传送给Bob; [3]6.Bob 收到 Alice 传送来的密文和加密过的 DES 密钥,先用自己的私钥对加密的 DES 密钥进行解密,得到 Alice随机产生的加密密钥; [3]7.Bob 然后用随机密钥对收到的密文进行解密,得到明文的数字信息,然后将随机密钥抛弃; [3]8.Bob 用 Alice 的公钥对 Alice 的数字签名进行解密,得到信息摘要; [3]9.Bob 用相同的哈希算法对收到的明文再进行一次哈希运算,得到一个新的信息摘要; [3]10.Bob 将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。 [3]区分攻击播报编辑如何区分数字签名攻击呢?有两个方法: [7]1. 查看数字签名的详细信息,我们应该查看该数字签名的详细信息,点击“详细信息”按钮即可。 [7]我们会发现正常EXE和感染(或捆绑木马)后的EXE数字签名的区别。正常EXE的数字签名详细信息。被篡改后的EXE数字签名信息无效。 [7]2.使用数字签名验证程序sigcheck.exe (可以百度一下找这个工具,著名系统工具包Sysinternals Suite的组件之一。) [7]异常结果数字签名异常的结果为: [7]C:\Documents and Settings\litiejun\??\modify.exe:Verified: UnsignedFile date: 15:46 2008-5-23Publisher: n/aDescription: n/aProduct: n/aVersion: n/aFile version: n/a正常结果数字签名正常的结果为: [7]C:\Documents and Settings\litiejun\??\che.exe:Verified: SignedSigning date: 16:28 2008-4-29Publisher: n/aDescription: n/aProduct: n/aVersion: n/aFile version: n/a网络安全播报编辑2023年11月27日报道,国家安全部表示网络空间看似无形隐匿,实则谍影重重,充满硝烟暗战,数字签名等网络资产及服务,都有可能被境外间谍情报机关利用实施网络攻击窃密活动。 [9]2024年1月2日,印度“News9Live”新闻网报道称,相机制造巨头尼康、索尼和佳能计划推出新技术,对抗深度伪造。 [10]新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

10.什么是数字签名? - 知乎

10.什么是数字签名? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册签名数字签名《电子签名法》10.什么是数字签名?关注者9被浏览11,682关注问题​写回答​邀请回答​好问题​添加评论​分享​7 个回答默认排序放心签电子合同您放心的电子合同专家​ 关注数字签名是什么?数字签名是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。这种电子式的签名还可进行技术验证,其验证的准确度是一般手工签名和图章的验证无法比拟的。数字签名是目前应用最普遍、技术最成熟、可操作性最强的一种电子签名技术。目前电子签名法中提到的签名,一般指的就是数字签名。数字签名的原理数字签名技术是利用算法(一般是非对称算法)通过hash函数对原文进行hash值私钥(仅个人所有)加密,生成数字签名,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的信息,然后对内容执行hash运算得到hash值,与解密得到的数字签名hash值比对。如果比对结果一致,则说明收到的信息是完整的,在传输过程中没有被篡修改的,否则信息一定被修改过。因此数字签名能够验证数据来源以及信息的保密性、完整性、真实性和不可否认性。数字签名的作用数字签名机制作为保障网络信息安全的手段之一,可以解决伪造、抵赖、冒充和篡改问题。数字签名的目的之一就是在网络环境中代替传统的手工签字与印章,有着重要作用。1、防冒充(伪造)。私有密钥只有签名者自己知道,其他人不能伪造签名。2、可鉴别身份。在数字签名中,客户的公钥是其身份的标志,当使用私钥签名时,如果接收方或验证方用其公钥进行验证并获通过,那么可以肯定,签名人就是拥有私钥的那个人,因为私钥只有签名人知道。3、防重放。数字签名过程中,对签名报文添加时间戳、流水号等技术,可以防止重放攻击。4、防篡改 (防破坏信息的完整性)。数字签名与原始文件和摘要形成一个混合的整体数据一起发送给接收者,一旦信息被篡改,接收者可通过计算摘要和验证签名来判断该文件无效,从而保证了文件的完整性。5、防抵赖。如前所述,数字签名可以鉴别身份,不可能冒充伪造。数字签名即可以作为身份认证的依据,也可以作为签名者签名操作的证据。在数字签名体制中,要求接收者返回一个自己签名的表示收到的报文,给对方或者第三方或者引入第三方机制。如此操作,双方均不可抵赖。6、机密性。手写签字的纸质文件是不具备保密性的,文件一旦丢失,内容信息极可能泄露。但数字签名可以加密要签名的消息,在网络传输中,可以将报文用接收方的公钥加密,以保证信息机密性。发布于 2019-11-09 10:18​赞同 1​​添加评论​分享​收藏​喜欢收起​微签-审批电子签章和电子合同管理​已认证账号​ 关注什么是数字签名呢?楼上对于数字签名的概念已经进行了科普,那么今天我们就来实际操作一下数字签名是如何实现的 。so easy !!!而且我们无需下载软件,通过微信小程序就能够体验数字签名啦首先第一步:打开微信 我们都有微信的对吧,首先拿出手机微信小程序搜索“微签”,点进“微签云”第二步:登录“微签”进入小程序后,使用手机验证码登录就可以立即体验。如果是第一次使用的小伙伴,要点击注册账号哦~第三步:上传文件或一张白纸完成登录后,就来到我们的工作台啦,此时会看到工作台会有很多功能,我们呢只需要点击“我要签章”然后导入文件,小程序端的导入接口可以通过文件、直接拍照和相册导入的形式,我们借助文件传输助手,选中需要签字的文件点击“确定”。文件或白纸导入后,再点击下方绿色框“签字/签章”第四步:电子签点击之后页面下方就会出现一系列操作样式,我们呢只需要需点击“签名”就可以啦点击之后呢,我们手机页面就会出现电子版签名面板,灵活的移动端面板任您随意挥洒~签好后点击“保存”,这样电子版签名就会自动跳转到文件上了,此时我们可以随意拖拽文本框调整签名的位置和大小,调整好之后点击“完成”电子版电子签名就完成啦!发布于 2021-08-12 10:28​赞同​​添加评论​分享​收藏​喜欢

数字签名算法_百度百科

算法_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心收藏查看我的收藏0有用+10数字签名算法播报讨论上传视频数字签名标准的一个子集表示了只用作数字签名的一个特定的公钥算法本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。数字签名算法是数字签名标准的一个子集,表示了只用作数字签名的一个特定的公钥算法。密钥运行在由SHA-1产生的消息哈希:为了验证一个签名,要重新计算消息的哈希,使用公钥解密签名然后比较结果。缩写为DSA。中文名数字签名算法缩    写DSA定    义用作数字签名的特定的公钥算法包含于数字签名标准数字签名算法是数字签名标准的一个子集,表示了只用作数字签名的一个特定的公钥算法。密钥运行在由SHA-1产生的消息哈希:为了验证一个签名,要重新计算消息的哈希,使用公钥解密签名然后比较结果。缩写为DSA。数字签名是电子签名的特殊形式。到目前为止,至少已经有 20 多个国家通过法律 认可电子签名,其中包括欧盟和美国,我国的电子签名法于 2004 年 8 月 28 日第十届全 国人民代表大会常务委员会第十一次会议通过。数字签名在 ISO 7498-2 标准中定义为: “附加在数据单元上的一些数据,或是对数据单元所作的密码变换,这种数据和变换允许数据单元的接收者用以确认数据单元来源和数据单元的完整性,并保护数据,防止被人(例如接收者)进行伪造”。数字签名机制提供了一种鉴别方法,以解决伪造、抵赖、冒充和篡改等问题,利用数据加密技术、数据变换技术,使收发数据双方能够满足两个条件:接收方能够鉴别发送方所宣称的身份;发送方以后不能否认其发送过该数据这一 事实。数字签名是密码学理论中的一个重要分支。它的提出是为了对电子文档进行签名,以 替代传统纸质文档上的手写签名,因此它必须具备 5 个特性。(1)签名是可信的。(2)签名是不可伪造的。(3)签名是不可重用的。(4)签名的文件是不可改变的。(5)签名是不可抵赖的。数字签名的实现,一般是由信息的发送者通过一个单向函数对要传送的消息进行处理产生其他人无法伪造的一段数字串,用以认证消息的来源并检测消息是否被修改。消息接收者用发送者的公钥对所收到的用发送者私钥加密的消息进行解密后,就可以确定消息的 来源以及完整性,并且发送者不能对签名进行抵赖。 把哈希函数和公钥加密算法结合起来,能提供一个方法保证数据的完整性和真实性。完整性检查保证数据没有被改变,真实性检查保证数据真是由产生这个哈希值的人发出的。把这两个机制结合起来,就是“数字签名”。数字签名的第一步是产生一个需签名的数据的哈希值;第二步是把这个哈希值用我们的私钥加密。这个被加密的哈希结果被添加到数据 后,保护哈希结果的完整性。数字签名具有许多重要的应用,例如在电子政务活动中的电子公文、网上报税、网上投票,在电子商务活动中的电子订单、电子账单、电子收据、电子合同、电子现金等电子文档都需要通过数字签名来保证文档的真实性和有效性;甚至于人们日常使用频繁的电子邮件,当涉及重要内容时,也需要通过数字签名技术来对邮件的发送者进行确认和保证邮件内容未被篡改,并且邮件的发送者也不能对发出的邮件进行否认。由此可见,数字签名技术早已深入应用到国家的政治、军事、经济和人们生活中的各个方面,并将在国家数字 化进程中发挥越来越重要的作用。新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

数字签名的算法有哪些?-腾讯云开发者社区

的算法有哪些?-腾讯云开发者社区腾讯云开发者社区文档建议反馈控制台首页学习活动专区工具TVP最新优惠活动技术百科搜索技术百科搜索技术百科搜索关闭发布登录/注册首页学习活动专区工具TVP最新优惠活动返回腾讯云官网技术百科首页 >数字签名 >数字签名的算法有哪些?数字签名的算法有哪些?修改于 2023-07-26 02:44:06256词条归属:数字签名数字签名的算法主要包括以下几种: RSARSA是一种基于因数分解的公钥加密算法,也可以用于数字签名。RSA数字签名是一种常用的数字签名算法,它通过私钥对消息进行签名,通过公钥对签名进行验证。 DSADSA是一种基于离散对数问题的数字签名算法,它是美国国家标准局(NIST)推荐的数字签名算法之一。DSA数字签名是一种轻量级的数字签名算法,适用于一些资源受限的环境。 ECDSAECDSA是一种基于椭圆曲线加密的数字签名算法,它与DSA类似,但使用的是椭圆曲线加密算法。ECDSA数字签名算法具有高效性和安全性的特点,适用于移动设备等资源受限的环境。 EdDSAEdDSA是一种基于椭圆曲线加密的数字签名算法,它是ECDSA的改进版,具有更好的性能和安全性。EdDSA数字签名算法适用于移动设备等资源受限的环境。 GOSTGOST是一种由俄罗斯开发的数字签名算法,它是一种基于哈希函数的数字签名算法,具有高效性和安全性的特点。相关文章Hash 算法有哪些?https编程算法数据结构网络安全Hash算法的有哪几种,优缺点,使用场景

Hash ,一般叫做散列算法,就是把任意长度的输入通过散列算法,变换成固定长度的输入,相当于一种压缩映射,将任意长度的消息压缩到某一固定长度的消息摘要的函数。

函数利用了乘法的不相关性(乘法的这种性质,最有名的莫过于平方取头尾的随机数生成算法,虽然这种算法效果并不好);

static int bernstein(String key)

{

int hash

不过,因为除法太慢,这种方式几乎找不到真正的应用

• 查表Hash;查表Hash最有名的例子莫过于CRC系列算法。虽然CRC系列算法本身并不是查表,但是,查表是它的一种最快的实现方式。

查表Hash中有名的例子有:Universal Hashing和Zobrist Hashing。他们的表格都是随机生成的。

• 混合Hash;混合Hash算法利用了以上各种方式。

各种常见的Hash算法,比如MD5、Tiger都属于这个范围。王小明_HIT2020-08-103.8K0进程的调度算法有哪些操作系统队列服务进程算法进程的调度算法是操作系统用来决定哪个进程可以执行的一种策略,常见的进程调度算法包括:

先来先服务调度(FCFS):按照进程到达的先后顺序进行调度,先到达的进程先执行。

这种调度算法简单直观,但可能导致长作业等待时间过长的问题。

最短作业优先调度(SJF):选择估计运行时间最短的进程优先执行,以减少平均等待时间。

多级反馈队列调度:将就绪队列分成多个优先级,每个队列采用不同的调度算法,高优先级队列的进程优先执行。如果一个进程在一个队列中执行的时间超过了一个时间片,它就会被移到下一个更低优先级的队列中。

最高响应比优先调度(HRRN):根据等待时间和估计运行时间的比值来选择下一个执行的进程,以最大化响应比。这种算法可以减少平均等待时间,但需要预先知道每个进程的运行时间。

这些调度算法各有优缺点,适用于不同的场景和需求。操作系统根据具体的情况选择合适的调度算法,以实现高效的进程调度。程序员朱永胜2023-12-051380接口限流算法有哪些??编程算法云数据库 Redis并且在实际应用中,可能还会基于不同的维度进行限流,如用户 id,请求 IP 等,实际应用需要考虑的东西更多。

计数器

计数器法是限流算法里最简单也是最容易实现的一种算法。

假设一个接口限制一分钟内的访问次数不能超过100个,维护一个计数器,每次有新的请求过来,计数器加一,这时候判断,如果计数器的值小于限流值,并且与上一次请求的时间间隔还在一分钟内,允许请求通过,否则拒绝请求

漏桶算法

漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,先触发出水,给漏斗腾出空间,漏桶会以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率

随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入Token(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了。

0x04: 漏桶和令牌桶的比较

这两种算法的主要区别在于漏桶算法能够强行限制数据的传输速率,而令牌桶算法在能够限制数据的平均传输速率外,还允许某种程度的突发传输。BUG弄潮儿2020-12-179790哪些属于网页抓取算法_网页排序算法有哪些编程算法存储simhash是google用来处理海量文本去重的算法。

1.

2. simhash和传统的hash算法有什么不同?

simhash和传统的hash都可以将文档转换为一个签名值,它们有什么不同呢?

而传统的hash算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法。

key,先找到哪些simhash的key等于目标simhash的key,然后在这些simhash集合中查找那些海明距离在3以内的数值。

因为根据抽屉原理,如果分成5个区域,则至少有两个区域是完全相同的,所以需要将这两块区域的值作为key,查找时先找到哪些simhash的key等于目标simhash的key,然后在这些simhash集合中查找那些海明距离在全栈程序员站长2022-11-104930周围的餐馆有哪些?GeoHash算法编程算法hashmapgeohash-feature

当今年代,每个人都有智能手机,出门在外,自然离不开使用手机地图了,查找附近的餐馆,附近的地铁站,非常方便,可是在这项技术背后又隐藏着什么算法呢?

这篇博客将会讲述这个技术背后的GeoHash算法以及基本的实现。

首先既然算法名字叫做GeoHash了那么对单词比较敏感的人可能已经猜出来了,差不多就是对当前的位置生成一个Hash值,然后再比较相似吧,是的,大概就是这个样子。

ProximityChat

接下来将会讨论这个算法的具体细节:

计算纬度

比如我们需要计算 坐标 121.443469, 31.22246 的GeoHash值

首先将纬度范围(-90, 90)平分成两个区间

测试

为了看一下这个算法的可行性,我写了一个爬虫来访问高德地图来不断检索地址并且算出Geohash(文章最后会给出整个爬虫和算法的代码)

?芋道源码2019-01-099550点击加载更多词条知识树 6个知识点更多数字签名的作用是什么?数字签名的原理是什么?数字签名的流程是什么?数字签名的安全性如何保证?数字签名的算法有哪些?数字签名的应用场景有哪些?社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于社区规范免责声明联系我们友情链接腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569腾讯云计算(北京)有限责任公司 京ICP证150476号 |  京ICP备11018762号 | 京公网安备号11010802020287问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归