如何使用私钥加密文件

NoT*_*ust 3 gpg openssl signature

我想用私钥加密文件并用公钥解密。公钥将嵌入我的应用程序中。所以我想保证该文件是由我创建的。如何使用 gpg 或 openssl 来实现它。

小智 8

使用 OpenSSL 来做到这一点。按照一个简单的例子:

要加密文件:

openssl rsautl -encrypt -inkey public_key.pem -pubin -in <decrypted file> -out <encrypted file>
Run Code Online (Sandbox Code Playgroud)

解密文件:

openssl rsautl -decrypt -inkey private_key.pem -in <encrypted file> -out <decrypted file>
Run Code Online (Sandbox Code Playgroud)

  • 他在问如何使用私钥加密。 (5认同)

小智 8

您可以使用私钥加密并使用公钥解密:

  • 加密
    $ TEXT="proof that private key can encrypt and public key can decrypt"
    $ echo "$TEXT" | openssl rsautl -sign -inkey private.key -in - -out - | base64 > encrypted.txt
    
    Run Code Online (Sandbox Code Playgroud)
  • 解密
    $ cat encrypted.txt | base64 -d | openssl rsautl -verify -pubin -inkey public.key -in -
    proof that private key can encrypt and public key can decrypt
    
    Run Code Online (Sandbox Code Playgroud)

如您所见,解密的文件与我们在加密步骤中写入的文本正确匹配。


Gil*_*il' 5

用私钥加密文件是没有意义的

使用私钥将标签附加到文件以保证该文件是由私钥持有者提供的称为签名,而该标签称为签名

有一种流行的密码系统(教科书 RSA),其中使用的简化(不安全)算法具有相同类型的公钥和私钥,并且解密与签名相同,加密与验证相同。一般情况并非如此:即使 RSA 也使用不同的解密和签名机制(分别是加密和验证)以及适当、安全的填充模式;许多其他算法的私钥和公钥甚至不是同一类型的数学对象。

所以你想签署该文件。事实上的标准工具是GnuPG

要使用您的密钥签署文件:

gpg -s /path/to/file
Run Code Online (Sandbox Code Playgroud)

如果您有多个密钥(例如您的应用程序密钥与您的个人密钥) ,请使用该--local-user选项来选择密钥。

转移file.gpg到您要使用该文件的地方。也传输公钥(大概在应用程序包内)。要提取原始文本并验证签名,请运行

gpg file.gpg
Run Code Online (Sandbox Code Playgroud)

如果更方便的话,可以将file其自身转移,并生成一个单独的签名文件,称为分离签名。要生成分离签名:

gpg -b /path/to/file
Run Code Online (Sandbox Code Playgroud)

核实:

gpg file.gpg file
Run Code Online (Sandbox Code Playgroud)

您还可以使用该选项加密文件-e。当然,这意味着您需要一个单独的密钥对,其中接收者(使用选项指定-r)拥有私钥,而生产者拥有公钥。

  • _这没有任何意义..._ 不同意。考虑将安全包从单一来源部署到多个端点。加密包既提供内容安全性,又提供本质上的签名。或者,使用对称密钥对包进行加密,该对称密钥受到非对称保护,然后捆绑在一起进行交付。完全非对称加密的包是更好的选择——即使现在不可能。 (4认同)
  • @bvj 否:您使用收件人的公钥加密对称密钥。即使您可以使用发送者的私钥进行加密,任何人都可以使用相应的公钥对其进行解密,因此这将使加密变得毫无意义。使用私钥加密或使用公钥签名在技术上可以使用 RSA(但通常不能使用其他公钥算法,例如,您可以执行数学运算,但它没有任何有趣的安全属性。 (2认同)