加密某些数据与签署某些数据(使用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

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

其他回答

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

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

在提问者意图将该解决方案用于软件许可的内容中回答这个问题,需求如下:

没有第三方可以从反编译应用程序产生许可密钥 软件密钥的内容不需要是安全的 软件密钥不是人类可读的

数字签名将解决这个问题,因为生成密钥的原始数据可以用私钥签名,这使得它不能被人类阅读,但如果进行逆向工程,可以被解码。但是私钥是安全的,这意味着没有人能够为您的软件制作许可证(这是重点)。

请记住,您不能阻止技术人员移除产品上的软件锁。所以如果他们必须破解每个发布的版本。但您确实不希望它们能够为您的产品生成可用于所有版本的新密钥。

Python PyNaCl文档中有一个“数字签名”的例子。http://pynacl.readthedocs.org/en/latest/signing/

和氯化钠工程的原因,以C的例子

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

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

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

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

在RSA加密中,当你生成一个密钥对时,选择哪一个作为公钥,哪一个作为私钥是完全随意的。如果你用一个加密,你可以用另一个解密——它是双向工作的。

因此,如何使用接收方的公钥加密消息,以便接收方可以使用他们的私钥解密消息是相当简单的。

签名是签名者拥有与某个公钥匹配的私钥的证明。要做到这一点,使用发送方的私钥加密消息就足够了,并将加密版本与明文版本一起包含。要验证发件人,请解密加密版本,并检查它是否与明文相同。

当然,这意味着你的信息不是秘密。任何人都可以解密它,因为公钥是众所周知的。但是当他们这样做的时候,他们已经证明了密文的创造者拥有相应的私钥。

然而,这意味着将传输的大小增加一倍——明文和密文一起传输(假设您希望那些对验证签名不感兴趣的人阅读消息)。因此,签名通常是通过创建明文的散列来创建的。重要的是不能创建假哈希,因此使用SHA-2等加密哈希算法。

So:

要生成签名,请从明文中生成哈希,用您的私钥加密它,并将其与明文一起包含。 要验证签名,请对明文进行哈希,用发送方的公钥解密签名,检查两个哈希是否相同。

在您的场景中,您不使用非对称加密的含义进行加密;我宁愿称之为“编码”。

你把数据编码成二进制表示,然后用你的私钥签名。如果不能通过公钥验证签名,就可以知道签名的数据不是用私钥生成的。(“验证”表示无符号数据没有意义)