我想知道的很简单。 我可以使用OpenSSL加密字符串"你好"使用私钥然后将其发送给可以使用公钥解密它的每个人以检索原始字符串。
我四处搜索,无法找到任何结果。
在数学上我可以使用私有指数和公共模数来执行加密,然后使用公共指数和公共模数来执行解密。
我可以使用OpenSSL吗?
我已经读到这被认为是签名。 那么如何使用我的私钥进行签名并仅使用公钥从签名文件中接收原始数据?
我已经在网上阅读了很多回复,而且他们都很模糊。 谁能给我明确的解决方案?
如果可以使用私钥加密并使用public解密,任何人都可以举例说明如何使用openssl工具进行解密?或者我是否必须编写自己的实现?
答案 0 :(得分:1)
签名和加密是两个完全不同的概念。使用您的私钥加密某些内容然后将其分发以使用您的公钥加密是没有多大意义的。您的公钥本身就是可用的,因为它是公开的,这会破坏加密的目的。
传统上,加密是通过其他人的公钥完成的,其方式允许仅使用私钥解密消息。
另一方面,签名通常涉及使用您的私钥作为种子值来散列消息。使用公钥再次对消息进行散列,并将散列与原始散列进行比较。如果它们对应(它们将不相同),那么您已经验证了唯一可能的发件人是私钥的持有者(如果已被泄露,可能是或不是您认为的那个人)
答案 1 :(得分: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://stackoverflow.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
所以,我会说命令行工具不会这样做。