加密某些数据与签署某些数据(使用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.
签名在这种情况下有用吗?
加密时,你用他们的公钥写消息,他们用他们的私钥读取消息。
在签名时,你使用你的私钥来写消息的签名,他们使用你的公钥来检查它是否真的是你的。
我想使用我的私钥来生成消息,这样只有我可能是发送者。
我希望我的公钥被用于阅读消息,我不关心谁阅读它们
这是签名,它是用你的私钥完成的。
我希望能够加密某些信息,并将其用作我的软件的产品密钥。
我只在乎我是唯一能产生这些的人。
如果你只需要自己知道它,你不需要弄乱钥匙来做到这一点。您可能只是生成随机数据并将其保存在数据库中。
但如果你想让人们知道密钥确实是你的,你需要生成随机数据,保存在数据库中,并用你的密钥签名。
我想在我的软件中包含我的公钥,以解密/读取密钥的签名。
您可能需要从Verisign或Thawte等商业提供商处购买公钥证书,以便人们可以检查是否有人伪造了您的软件,并将您的公钥替换为他们的。
加密某些数据与签署某些数据(使用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加密中,当你生成一个密钥对时,选择哪一个作为公钥,哪一个作为私钥是完全随意的。如果你用一个加密,你可以用另一个解密——它是双向工作的。
因此,如何使用接收方的公钥加密消息,以便接收方可以使用他们的私钥解密消息是相当简单的。
签名是签名者拥有与某个公钥匹配的私钥的证明。要做到这一点,使用发送方的私钥加密消息就足够了,并将加密版本与明文版本一起包含。要验证发件人,请解密加密版本,并检查它是否与明文相同。
当然,这意味着你的信息不是秘密。任何人都可以解密它,因为公钥是众所周知的。但是当他们这样做的时候,他们已经证明了密文的创造者拥有相应的私钥。
然而,这意味着将传输的大小增加一倍——明文和密文一起传输(假设您希望那些对验证签名不感兴趣的人阅读消息)。因此,签名通常是通过创建明文的散列来创建的。重要的是不能创建假哈希,因此使用SHA-2等加密哈希算法。
So:
要生成签名,请从明文中生成哈希,用您的私钥加密它,并将其与明文一起包含。
要验证签名,请对明文进行哈希,用发送方的公钥解密签名,检查两个哈希是否相同。