使用私钥加密,使用公钥解密

4
我想知道的很简单。我能否使用OpenSSL用私钥加密字符串“hello”,然后将其发送给所有能够使用公钥解密以检索原始字符串的人?
我已经搜索了很多地方,但没有找到相关信息。
从数学上讲,我可以使用私有指数和公共模数进行加密,然后使用公共指数和公共模数进行解密。
我能用OpenSSL实现这个功能吗?
我读到过这被认为是签名。那么我如何用我的私钥签名并通过公钥从签名文件中接收原始数据?
我阅读了很多网络上的回答,它们都含糊不清。有人能给我明确的解决方案吗?
如果可以使用私钥加密并使用公钥解密,有人能否给我一个使用openssl工具实现此操作的示例?或者我必须编写自己的实现?

当你说“我能用OpenSSL做这个吗”时,你是指命令行工具openssl还是密码算法库libcrypto?两者是有区别的。其中一个需要编写代码。对于两者的答案都是可以,但实现的方式显然是不同的。 - WhozCraig
如果您想通过libcrypto实现此操作,请查看RSA函数的示例,例如生成密钥对,以及加密解密 - Michael
我确实是指命令行工具openssl。但libcrypto也可以。但是@WhozCraig你说两者的答案都是肯定的。你能提供一些如何做到这一点的例子吗?我不介意编写自己的实现,我想知道是否目前有这样的手段可用。 - StackPointer
1
这个问题似乎不属于编程或开发范畴。请查看帮助中心的可以在此处提问哪些主题。也许Cryptography Stack ExchangeInformation Security Stack Exchange更适合提问。 - jww
是的,我已经标记了它,现在我需要它被删除。 - StackPointer
显示剩余5条评论
2个回答

1
使用私钥加密并不被视为签名。使用RSA时,实际上可以使用私钥进行加密,但这只是RSA的一个实现细节,它并没有加密消息,而是消息的哈希值,因此验证签名不会恢复原始明文消息。
是的,您可以在OpenSSL中签名和验证签名--参见https://www.openssl.org/docs/crypto/RSA_sign.html 不,您不应该使用模数和指数来自己编写“教科书式RSA”加密。例如,请参见此处:https://crypto.stackexchange.com/questions/1448/definition-of-textbook-rsa 不,您不应该通过使用私钥加密数据并使用公钥解密数据来交换私钥和公钥的用途。例如,请参见https://dev59.com/vHE95IYBdhLWcg3wd9xK#2350959
更新:

这个页面建议您可以使用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
@StackPointer 我更新了我的答案。我猜C接口可以做到(我实际上没有尝试过),但命令行工具不会让您交换密钥。 - Jim Flood
更新中的“此页面”链接现在已经失效。 - JWWalker
@JWWalker 啊,不管怎样,我已经复制了有用的信息。我怀疑那个页面上除了原型之外没有更多有趣的东西了。 - Jim Flood

0

签名和加密是两个完全不同的概念。用您的私钥加密某些内容,然后分发给他人使用公钥进行加密并没有多大意义。您的公钥是公开的,因此加密的目的就失去了意义。

传统上,加密是使用其他人的公钥进行的,以使得消息只能使用私钥解密。

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


4
是的,但这不是为什么我应该或不应该做的问题。我有想要去做的理由。 - StackPointer
这是一个不好的答案。有些情况下,使用私钥加密数据并使用公钥解密数据完全是有意义的。 - Arwed Mett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接