加密某些数据与签署某些数据(使用RSA)之间的区别是什么?

它只是颠倒了公共-私有密钥的角色吗?

For example, I want to use my private key to generate messages so only I can possibly be the sender. I want my public key to be used to read the messages and I do not care who reads them. I want to be able to encrypt certain information and use it as a product-key for my software. I only care that I am the only one who can generate these. I would like to include my public key in my software to decrypt/read the signature of the key. I do not care who can read the data in the key, I only care that I am the only verifiable one who can generate them.

签名在这种情况下有用吗?


当前回答

是的,你可以把签名看作是给你自己的数据盖上别人没有的蜡章。这样做是为了实现完整性和不可抵赖性。加密是为了让其他人看不到数据。这样做是为了实现保密性。参见维基百科http://en.wikipedia.org/wiki/Information_security#Key_concepts

签名是使用您的私钥签名的消息的散列。

其他回答

加密某些数据与签署某些数据(使用RSA)之间的区别是什么?

RSA仅仅是唯一一个同时支持公钥加密和数字签名的公钥密码系统。

这通常会让初学者感到困惑,因为各种来源/讲师说

RSA解密即RSA签名。 不,它不是!

这种困惑来自教科书RSA

RSA加密教科书; 消息m并计算c = m^e mod n用于加密,m = c^d mod n用于解密。 教科书RSA签名; 消息m,计算sg = m^d mod n进行签名验证,计算m == sg^e mod n进行签名验证。

两者都不安全,在现实生活中也不会使用!

它只是颠倒了公共-私有密钥的角色吗?

不,它不是!

加密

对于RSA加密,必须使用rsasa - pkcs1 -v1_5填充或最佳非对称加密填充(OAEP)。这些填充对消息有开销。例如,PKCS1-v1_5定义为

它的电磁结构是这样的

EM = 0x00 || 0x02 || PS || 0x00 || M.

它们是什么;

PS至少是8个ff块 M是信息 第一个0x00保证EM小于模量。 其余细节,如FF块的大小等可以在rfc 8017节7.2.1中找到

因此,它有一个特殊的信息结构是安全的,最近(2018年)被证明是安全的。填充至少有11个字节的开销。

签名

正确的签名术语是签名和验证。为了实现安全签名,RSA需要RSA- pss(概率签名方案)。结构有点复杂,一张图就能说明大部分情况

一旦您散列消息并正确填充,然后您可以使用您的私钥为填充消息签名!

对于验证,使用签名消息上的公钥并使用填充规则进行验证。

更倾向于OAEP,因为RSASSA-PKCS1-v1_5很难正确实现,尽管它被证明是安全的,但这些不正确的实现在过去一年中引起了许多攻击。


最后来看看康奈尔大学的页面;

RSA签名不是RSA解密

加密某些数据与签署某些数据(使用RSA)之间的区别是什么?

加密保留了消息(“一些数据”)的机密性,而签名提供了不可抵免性:即只有签署它的实体才能签署它。还有功能上的差异;继续读下去。

它只是颠倒了公共-私有密钥的角色吗?

绝对不是。使用相同的私钥进行签名和解密(或者同样地,使用相同的公钥进行验证和加密)是不允许的,因为您不应该混合使用这些目的。这不是一个数学问题(RSA应该仍然是安全的),而是一个密钥管理的问题,例如,签名密钥应该有更短的存活时间,并在使用前包含更多的保护。

对于相同的消息,应该使用发送方的私钥进行签名,使用接收方的可信公钥进行加密。通常使用签名后加密,否则对手可以用自己的签名替换签名。同样,您应该使用接收方的私钥进行解密,使用发送方的可信公钥进行验证。

此外,您应该理解签名生成不使用“私钥加密”。虽然所有的RSA操作都是基于模取幂,填充方案是完全不同的签名生成。此外,在RSA的所有实际应用中,公钥与RSA私钥具有完全不同的属性。

例如,我想使用我的私钥来生成消息,这样只有我可能是发送者。

这就是不可抵赖性,可以通过签名来实现。

我希望我的公钥被用于阅读消息,我不关心谁阅读它们。

公钥应该被认为是所有人都知道的。如果您希望每个人都能阅读消息,那么您只需不加密它们。

签名通常不会影响消息的内容。消息被认为是独立于签名的。这种签名在官方上被称为“带附录的签名”,其中附录就是信息。这是一个有点奇怪的名字,因为信息被认为比上面的签名更重要,但是是的。只有少数签名提供(部分)消息恢复;它们不再经常使用,通常被认为已弃用。

请注意,诸如CMS之类的签名协议可以部署包含消息和签名的容器格式。在这种情况下,您首先需要从容器中获取尚未加密的消息,就像从普通的.zip归档文件中解压缩文件一样。因此,消息可能从视图中隐藏,在这种情况下不能直接使用。

我希望能够加密某些信息,并将其用作我的软件的产品密钥。我只在乎我是唯一能产生这些的人。

加密用于实现机密性。在过去,RSA签名生成通常被认为是“用私钥加密”。然而,如上所述,操作是完全不同的,后来的标准拼命地尝试将加密和签名生成分开。

我想在我的软件中包含我的公钥,以解密/读取密钥的签名。我不关心谁可以读取密钥中的数据,我只关心我是唯一可以生成它们的可验证的人。

是的,这被称为在公钥中建立信任。但是,保护程序代码与保护消息是完全不同的。您可以执行代码签名,但随后需要一些东西来检查代码之外的签名。有一些操作系统提供这种功能。

比如微软的Authenticode。像iStore和Android应用程序商店这样的应用程序商店可能使用也可能不使用代码签名,但它们提供了一些保证,确保您的应用程序不是克隆的,或者至少不是在商店内克隆的。密码学并非总能解决问题。

让你的代码不被克隆/修改要困难得多,如果你这样做,你就会陷入数字版权管理的领域。

签名在这种情况下有用吗?

是的,当然。如果对公钥有信任,它当然可以帮助确保消息仅由您签名。它是否有助于验证应用程序代码/集成公钥,这完全取决于您希望在其中运行代码的环境。

是的,你可以把签名看作是给你自己的数据盖上别人没有的蜡章。这样做是为了实现完整性和不可抵赖性。加密是为了让其他人看不到数据。这样做是为了实现保密性。参见维基百科http://en.wikipedia.org/wiki/Information_security#Key_concepts

签名是使用您的私钥签名的消息的散列。

从功能上讲,您可以使用公钥/私钥加密来确保只有接收者可以阅读您的消息。使用接收者的公钥对消息进行加密,使用接收者的私钥对消息进行解密。

您可以使用签名让接收者知道您创建了消息,并且在传输过程中没有更改。消息签名是使用您自己的私钥完成的。接收方可以使用您的公钥来检查邮件是否被篡改。

至于使用的算法:这涉及到一个单向函数,例如维基百科。第一个这样的算法使用大素数,但此后又发明了更多的单向函数。

搜索“Bob”,“Alice”和“Mallory”在互联网上找到介绍文章。

您正在描述如何以及为什么在公钥密码学中使用签名。请注意,对他人提供的任意消息进行签名(或加密)是非常危险的——这会使算法受到攻击,从而危及您的密钥。