对称加密
# 加密 orig_file 文件,密码为 password,默认会生成 orig_file.gpg 的加密文件
gpg [--output ${encrypt_file}] --symmetric --batch --yes --passphrase ${password} ${orig_file} 2> /dev/null
# 解密 orig_file.gpg
gpg [--output ${orig_file}] --decrypt --batch --yes --passphrase ${password} ${encrypt_file} 2> /dev/null
使用系统生成的密钥
gpg --gen-key
根据提示生成密钥,完成后会有类似如下内容的提示
gpg: /home/hakutyou/.gnupg/trustdb.gpg: trustdb created gpg: key 4472B2D8 marked as ultimately trusted public and secret key created and signed. ....
其中 4472B2D8 为该密钥的 Hash
列出密钥
gpg --list-keys
gpg -k # 查看公钥
gpg -K # 查看私钥
撤销密钥
gpg --gen-revoke ${user_id}
user_id 可以填入密钥Hash、或用户名用户邮箱的组合,运行后会生成一个撤销密钥
上传下载公钥
从证书服务器获得公钥不保证正确,可以通过指纹进行比较
# 上传公钥
gpg --keyserver keyserver.ubuntu.com --send-keys ${user_id}
# 下载公钥
gpg --keyserver keyserver.ubuntu.com --recv-keys ${user_id}
# 输出指纹
gpg --fingerprint ${user_id}
通过比较指纹确保下载的公钥是上传的那一个
直接发送公钥
公钥文件通常以二进制的格式保存,可以通过以下指令将公钥转化成 base64 编码后发送给其他用户
# 在当前路径下生成 public-key.txt 为公钥
gpg --armor --output public-key.txt --export ${user_id}
# 其他用户通过一下指令导入该公钥
gpg --import public-key.txt
直接发送密钥
# 导出密钥文件
gpg --armor --output private-key.txt --export-secret-keys
# 导入密钥文件
gpg --import private-key.txt
通过密钥加密
假设存在文本 demo.c
#include <stdio.h>
int main(void) {
printf("Hello World!");
return 0;
}
加密文件
加密文件使用公钥,需要指定使用的公钥。
任何需要避免进入交互输入密码的操作都可以使用形如 --passphrase ${password}
参数的方式
在命令行中指定。
任何输出文件的操作都可以使用形如 --output ${file}
的方式指定文件名,该参数需要尽量放在
前面。
gpg --recipient ${user_id} --output ${encrypt_file} --encrypt ${orig_file}
解密文件
解密文件使用密钥
gpg --output ${orig_file} --decrypt ${encrypt_file}
文件签名
# 生成二进制的签名文件
gpg --output ${sig_file} --detach-sign ${orig_file}
# 生成 base64 编码的签名文件
gpg --output ${asc_file} --armor --detach-sign demo.txt
# 验证签名
gpg --verify ${sig_asc_file} ${orig_file}
文件加密并签名
# --sign 开启签名,--armor 表示签名使用 base64 编码
gpg --output ${sig_and_encrypt_file} --local-user ${local_user_id} \
--recipient ${remote_user_id} --armor --sign --encrypt ${orig_file}
其中 local_user_id 指定本地私钥进行签名,remote_user_id 指定对方公钥进行加密。