提及RSA,大家会想到公钥、私钥、加密、解密、数字签名、数字信封。。。
但也许大家和曾经的我一样,对其中的某些理解会存在误区,最近看了下关于RSA的RFC 2313文档,再加上自己的一些测试,终于理清了其中的一些关系,主要包括以下几点:
1、公钥和私钥间的关系;
2、数字签名和私钥加密间的关系;
3、数字签名的验证具体是怎样的过程;
公钥与私钥
一般,我们可以用RSA算法生成一对密钥,公钥发放给外部客户,私钥自己保管;有以下一些应用场景:
【公钥加密、私钥解密】或者【私钥加密、公钥验证】
对于第一种场景,似乎没有什么疑问;但是对于第二种场景,公钥验证时到底是如何验证法个人有个人的说法,我以前一直以为是和数字证书一样(当然这个理解有误,关于数字证书后续也会详述),只能验证不能被解密!但经过我的测试证明:私钥加密是可以用公钥解密的;所以说对于RSA算法,用任何一方密钥加密都可以用另外一个密钥解密;这也从另外一个角度说明,其实公钥和私钥是相对而言的,发放其中一个密钥出去,另外一个自然也就成为私钥了;对于该观点,很多同学都已经提到过,但我以前一直认为这是一个误解,汗自己一把;
另外,当我们使用证书的时候,比如pfx、cer、jks、rsa等,从中我们可以看出私钥比公钥暴露出了更多的信息,大家可以自行导出xml查看,当然其中很多参数是用来加速的,根本的信息还是密钥;
比如公钥导出格式为:
<RSAKeyValue>
<Modulus>...</Modulus>
<Exponent>...</Exponent>
</RSAKeyValue>
私钥导出格式为:
<RSAKeyValue>
<Modulus>...</Modulus>
<Exponent>...</Exponent>
<P>...</p>
<Q>...</q>
<DP>...</DP>
<DQ>...</DQ>
<InverseQ>...</InverseQ>
<D>...</D>
</RSAKeyValue>
数字签名与私钥加密
数字签名:就是只有信息的发送者才能产生的,别人无法伪造的一段数字串,它同时也是对发送者发送的信息的真实性的一个证明。
对一段信息进行签名时,一般会先用哈希函数计算出被签名信息惟一的哈希结果值(为实用目的,降低加密成本,RSA加密不适用于大数据量加密).最后使用私钥将哈希结果值转化为数字签名.得到的数字签名对于被签名的信息和用以创建数字签名的私钥而言都是独一无二的。
按照上面的说法,数字签名=私钥加密(hash(原始数据));但是我用相同的原始数据、相同的hash算法、相同的密钥分别进行计算得到的结果却是不一致的,所以我一直怀疑这个描述有问题?
对此,我search了很多,ch的,en的,但都没有找到一个让我信服的解释,大多都是如上的这种解释;最后还是求助于官方描述文档RFC 2313,下面就看看数字签名到底是怎么回事:
数字签名包括4个步骤:消息散列,DER数据编码,RSA私钥加密和字节串到位串的转换。
这样也就可以解释上面的公式为什么两边运算的结果不一致了,因为中间少了很多运算;之后我也下载了bouncycastle的jce实现源码来看,过程的确如此;
关于DER数据编码,这个会在后续文章中详述,他是一个遵循ASN.1规范的编码规范;
数字签名的验证过程
我们在验证数字签名的时候,一般会将签名数据、原始数据、公钥一起作为参数输入,返回验证true或false;这样便造成了一种假象,如上面所说的:公钥是不能解密的!但是实际验证过程却不是这样的;
同样的,他完全是数字签名的逆向过程,来看看RFC的官方描述,验证过程包括四个步骤:位串到字节串的转换,RSA公钥解密,DER数据解码,得到解密后的散列值,最后与原始数据散列值进行比较,若每一位都相同则返回true,否则返回false;
相关推荐
* RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥...
在实际应用中,像"RSA.APS"、"RSA.clw"这样的文件可能包含的是RSA算法的实现代码,而"CRSA.cpp"、"RSADlg.cpp"、"CDSA.cpp"、"CCommon.cpp"、"RSA.cpp"等文件可能是具体功能模块,如密钥生成、加密解密函数的实现。...
本文将对RSA数字签名的设计与实现进行详细的介绍,包括RSA算法的原理、RSA数字签名的安全性、MD5算法的基本原理、RSA数字签名的设计与实现等方面。 一、RSA算法的原理 RSA算法是一种非对称加密算法,由Ron Rivest...
9. **应用场景**:RSA加密解密工具常用于网络通信中的数据保护、软件激活、数字证书、电子邮件安全等领域,确保信息在传输过程中不被窃取或篡改。 总之,通过使用这个RSA加密解密工具并遵循操作指南,用户可以有效...
"EncryptMethod"这个文件可能包含了不同类型的加密方法实现,可能包括RSA的加密、解密、数字签名的生成和验证等功能。这些实例代码可以帮助开发者理解和应用这些概念,同时提供了一个实际操作的平台,通过实践加深...
RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,特别是在数据传输、网络安全以及数字签名等方面。本文将深入探讨RSA加密解密原理、在ARM架构上的实现以及相关程序示例。 首先,RSA的核心原理基于...
在Unity引擎中,RSA(Rivest-Shamir-Adleman)是一种广泛使用的非对称加密算法,常用于安全传输数据、数字签名等场景。本文将深入探讨RSA加密和解密的基础知识以及如何在Unity中实现这一功能。 首先,RSA加密的核心...
在RSA数字签名中,私钥用于对消息的哈希值进行签名,而公钥则用于验证这个签名。这一过程确保了数据在传输过程中未被篡改,并且能够确认信息确实来自预期的发送者。 C#中,可以使用System.Security.Cryptography...
可能包括了生成密钥对、加密解密数据以及签名验证的示例程序,帮助开发者理解和实践RSA算法。 6. **安全性考虑**:RSA的安全性基于大数因式分解的难度,但随着计算能力的增强,密钥长度也需要随之增加以保证足够的...
5. **RSA签名过程** - 发送方使用一个安全的哈希函数计算消息的摘要。 - 发送方用私钥对摘要进行加密,生成数字签名。 - 数字签名与原始消息一起发送给接收方。 6. **验证过程** - 接收方收到消息和数字签名后,...
本资源提供了RSA加密解密的源码,适用于学习和理解RSA算法的工作原理及其实现。 首先,RSA算法的核心原理基于大数的因式分解困难性。它由三位科学家Rivest、Shamir和Adleman于1977年提出,因此得名RSA。该算法包括...
后来又传了个新的,叫做“包括私钥加密的RSA密钥生成和加密解密”基于.net Framework 4编,能够生成公钥私钥,直观看到(e,n)和(d,n),能够进行文本及文件加密解密(相关函数输入输出均为byte[],非常好用),...
在Spring框架中,我们经常需要处理加密解密和签名验证的问题,以确保数据传输的安全性和完整性。RSA与SHA-256结合使用可以提供更高级别的安全保护。RSA用于非对称加密,而SHA-256用于生成消息摘要,进行数字签名。 ...
C#RSA加密解密签名和验证签名的小例子,代码都加了注释,可以很容易看懂.如果应用到消息收发,发送方用公钥加密,接收方用私钥解密.如果是应用到软件注册方面,则需要客户端保留公钥,程序开发者保留私钥.使用签名和验证...
在这个计算机课程设计中,我们将深入探讨如何使用MATLAB来实现RSA数字签名的生成与验证过程。MATLAB是一款强大的数学计算软件,也提供了丰富的编程环境,适合进行这样的算法实现。 首先,我们需要理解RSA算法的基本...
6. 压缩包中的`signature`文件可能包含的是一个示例程序,演示了如何在Java中使用RSA进行签名、验签、加密和解密。这个程序可能会包括以下关键部分: - 导入必要的安全库 - 创建并初始化`KeyPairGenerator` - ...
- MATLAB的加密库`cryptopp`或者`openssl`接口可以用来简化RSA密钥生成和加密解密的实现。 在实际应用中,基于RSA的图像加密通常结合其他密码学技术,如混淆、迭代等,以增强安全性。同时,由于RSA加密速度相对较...
接下来,我们讨论RSA签名和验证。签名是使用私钥对数据进行哈希运算后的结果进行加密,验证则是使用公钥检查这个加密的哈希是否与原始数据的哈希相匹配。在C#中,`RSACryptoServiceProvider`类提供这些功能: ```...
本案例聚焦于"C#与Java平台RSA加密解密签名验签互通"的问题,这涉及到两个主要的技术点:RSA加密算法和跨平台兼容性。下面将详细阐述这两个知识点。 首先,RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和...
本文将详细讲解Delphi环境下如何实现RSA加解密,并着重讨论其支持的公钥加密私钥解密以及私钥加密公钥解密的功能,同时涉及PKCS8和PKCS1两种秘钥格式。 RSA是一种基于大数因子分解困难性的加密算法,由Ron Rivest、...