文件加密 (GnuPG)

2019-09-17
2分钟阅读时长

对称加密

# 加密 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 指定对方公钥进行加密。

上一页 Python 协程
下一页 Django技巧