我想用私钥加密文件并用公钥解密。公钥将嵌入我的应用程序中。所以我想保证该文件是我创建的。我如何使用 gpg 或 openssl 来实现它。
答案1
使用 OpenSSL 来做到这一点。遵循一个简单的例子:
要加密文件:
openssl rsautl -encrypt -inkey public_key.pem -pubin -in <decrypted file> -out <encrypted file>
解密文件:
openssl rsautl -decrypt -inkey private_key.pem -in <encrypted file> -out <decrypted file>
答案2
您可以使用私钥加密并使用公钥解密:
- 加密
$ 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
- 解密
$ cat encrypted.txt | base64 -d | openssl rsautl -verify -pubin -inkey public.key -in - proof that private key can encrypt and public key can decrypt
如您所见,解密的文件与我们在加密步骤中写入的文本正确匹配。
答案3
使用私钥将标签附加到文件以保证该文件是由私钥持有者提供的称为签名,该标签称为签名。
有一种流行的密码系统(教科书 RSA),其中使用的简化(不安全)算法具有相同类型的公钥和私钥,并且解密与签名相同,加密与验证相同。一般情况并非如此:即使 RSA 也使用不同的解密和签名机制(分别是加密和验证)以及适当、安全的填充模式;许多其他算法的私钥和公钥甚至不是同一类型的数学对象。
所以你想签署该文件。事实上的标准工具是GnuPG。
要使用您的密钥签署文件:
gpg -s /path/to/file
如果您有多个密钥(例如您的应用程序密钥与您的个人密钥),请使用该--local-user
选项来选择密钥。
转移file.gpg
到您要使用该文件的地方。也传输公钥(大概在应用程序包内)。要提取原始文本并验证签名,请运行
gpg file.gpg
如果更方便的话,可以将file
其自身转移,并生成一个单独的签名文件,称为分离签名。要生成分离签名:
gpg -b /path/to/file
核实:
gpg file.gpg file
您还可以使用该选项加密文件-e
。当然,这意味着您需要一个单独的密钥对,其中接收者(使用选项指定-r
)拥有私钥,而生产者拥有公钥。
答案4
正如@rsmoorthy,您可以加密一个句子或一个小文件,它必须比密钥短。要加密较大的文件,您应该使用 rsa 和 aes。
# Assuming you're using linux
$ cat /proc/sys/kernel/random/uuid | sed 's/-//g' | tee key.plain
$ openssl enc -nosalt -aes-256-cbc -in test.zip -out test.zip.enc -k $(cat key.plain)
# Assuming you have a pair of rsa keys (crypt.priv and crypt.pub)
$ openssl rsautl -sign -inkey crypt.priv -in key.plain -out key.enc
现在使用“test.zip.enc”、“crypt.pub”和“key.enc”解密文件:
$ openssl rsautl -verify -pubin -inkey crypt.pub -in key.enc -out key.de
$ openssl enc -nosalt -aes-256-cbc -d -in test.zip.enc -out de.zip -k $(cat key.de)