首页 文章

使用私钥加密并使用公钥解密[关闭]

提问于
浏览
2

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

我四处搜索,找不到任何东西 .

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

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

我读过这个被认为是签名 . 那么如何使用我的私钥进行签名并仅使用公钥从签名文件中接收原始数据?

我在网上看过很多回复,但都很模糊 . 谁能给我明确的解决方案?

如果可以使用私钥进行加密并使用public解密,那么任何人都可以举例说明如何使用openssl工具进行解密吗?或者我必须编写自己的实现?

2 回答

  • 1

    签名和加密是两个完全不同的概念 . 使用您的私钥加密某些内容然后将其分发以使用您的公钥加密是没有多大意义的 . 您的公钥本身就是可用的,因为它是公开的,这会破坏加密的目的 .

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

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

  • 1

    使用私钥加密不被视为签名 . 使用RSA,实际上使用私钥进行加密,但这只是RSA的一个实现细节,它不是加密消息,而是加密消息的散列,所以不,验证签名不会带回原来的明文消息 .

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

    不,您不应该使用带有模数和指数的"textbook 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
    

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

相关问题