【问题标题】:Encrypt with private key and decrypt with public key [closed]用私钥加密并用公钥解密[关闭]
【发布时间】:2026-02-08 17:50:01
【问题描述】:

我想知道的很简单。 我可以使用 OpenSSL 使用私钥加密字符串“hello”,然后将其发送给可以使用公钥解密的每个人以检索原始字符串。

我找遍了周围,并没有真正找到任何东西。

在数学上,我可以使用私有指数和公共模数来执行加密,然后使用公共指数和公共模数来执行解密。

我可以用 OpenSSL 做到这一点吗?

我听说这被认为是签名。 那么如何使用我的私钥签名并仅使用公钥从签名文件中接收原始数据?

我在网上阅读了很多回复,但都含糊其辞。 谁能给我明确的解决方案?

如果可以使用私钥加密并使用公钥解密,谁能给我一个关于如何使用 openssl 工具进行操作的示例?还是我必须自己编写实现?

【问题讨论】:

标签: c encryption openssl public-key-encryption


【解决方案1】:

使用私钥加密不被视为签名。使用RSA,其实是用私钥加密的,不过这只是RSA的一个实现细节,并不是对消息进行加密,而是对消息进行hash,所以不,验证签名并不能带回原来的明文消息。

是的,您可以在 OpenSSL 中签名和验证签名——参见。 https://www.openssl.org/docs/crypto/RSA_sign.html

不,您不应该使用带有模数和指数的“教科书 RSA”来滚动您自己的加密。参照。例如:https://crypto.stackexchange.com/questions/1448/definition-of-textbook-rsa

不,您不应该通过使用私钥加密数据并使用公众解密来交换私钥和公钥的使用。参照。例如https://*.com/a/2350959/233596

更新:

This page 建议您可以使用 OpenSSL C 接口,通过这些函数原型使用私钥加密和公钥解密:

 int RSA_public_encrypt(int flen, unsigned char *from,
    unsigned char *to, RSA *rsa, int padding);
 int RSA_private_decrypt(int flen, unsigned char *from,
    unsigned char *to, RSA *rsa, int padding);
 int RSA_private_encrypt(int flen, unsigned char *from,
    unsigned char *to, RSA *rsa,int padding);
 int RSA_public_decrypt(int flen, unsigned char *from, 
    unsigned char *to, RSA *rsa,int padding);

(我实际上并没有尝试使用这些功能。)

我尝试使用 openssl rsautl 命令行:

$ openssl rsautl -in HELLO -out HELLO.encrypt_by_private -inkey private.pem -encrypt

但是:

$ openssl rsautl -in  HELLO.encrypt_by_private -pubin -inkey public.pem -decrypt
A private key is needed for this operation

所以,我会说命令行工具不会这样做。

【讨论】:

  • 感谢您的回复。这不是“玩火”的问题,只是一个简单的是或否,我能做到吗。我希望能够使用我的私钥进行加密。我指的是 openssl 工具,而不是它使用的库。但是当前的实现不支持加密实际数据,而不是数据的哈希?
  • @StackPointer 我更新了我的答案。我猜 C 接口会做到这一点(我实际上并没有尝试过),但是命令行工具不会让你交换密钥。
  • 更新中的“本页”链接现已失效。
  • @JWWalker 啊。无论如何,我已经复制了感兴趣的信息。我怀疑该页面上的内容比原型更有趣。
【解决方案2】:

签名和加密是两个完全不同的概念。用你的私钥加密某些东西然后分发它以用你的公钥加密是没有多大意义的。您的公钥本质上是可用的,因为它是公开的,这违背了加密的目的。

传统上,加密是使用其他人的公钥完成的,其方式是只允许使用私钥解密消息。

另一方面,签名通常涉及使用您的私钥作为种子值对消息进行哈希处理。使用公钥再次散列消息并将散列与原始散列进行比较。如果它们对应(它们不会相同),那么您已验证唯一可能的发件人是私钥的持有者(可能是也可能不是您认为的人,如果已被泄露)

【讨论】:

  • 是的,但这不是我为什么应该或不应该这样做的问题。我有理由想要这样做。
  • 这是一个糟糕的答案。在某些情况下,使用私钥加密数据并使用公钥解密数据是完全有意义的。