GPG 使用初步

article/2025/10/31 19:43:20

GPG 使用初步

1. PGP 软件的安装

  PGP 的版本有很多,但由于其商业软件的特性,不能自由使用,自由软件基金会决定开发一个 PGP 的替代品,取名为 GnuPG ,这就是 PGP 的由来
  GPG 是基于命令行的程序,主要面向 Linux 等操作系统,由于我们在 Windows 系统下进行实验,这里选择 GPG 的 Windows 版本 Gpg4win

登录官网下载 Gpg4win:http://www.gpg4win.org/
校验安装包的完整性,可以参考官方的 check integrity 说明:https://www.gpg4win.org/package-integrity.html

check

图中左侧为官网给出的证书参考,右侧是下载到本地的安装包的证书
完成完整性校验后进行安装,按默认选项安装即可

install1

安装完成

install2

打开 cmd 输入命令 gpg --version 查看gpg的版本和支持的加密算法

version

提示当前 gpg 的版本为 2.3.4
输入命令 gpg --help 查看帮助
帮助中列出来了 gpg 的各种命令详解

gpg的基本语法为:gpg [options] [files]
可以进行 Sign, check, encrypt or decrypt ( 签名、校验、加解密 ) 操作

2. 奇怪的报错

在 cmd 中输入命令 gpg --full-generate-key 开始进行密钥生成,在流程结束后,准备等待输入 passphrase,却收到报错如下

error

具体提示为

gpg: can't connect to the gpg-agent: IPC connect call failed
gpg: agent_genkey failed: No agent running
Key generation failed: No agent running

复制错误信息,在网上搜索了一下相关的博客,寻找解决方案,中文互联网上对于这个报错的文章较少,最后在 StackExchange 上看到了相关的解释

solution

This can happen when you’re using Git Bash (which ships with gpg) and you’re installing GnuPG4Win additionally. The latter ships with a more recent version.
这种情况(指相关报错)会出现是因为你在使用 Git Bash(Git Bash 已经装载了 gpg)时额外安装了 Gpg4win,Gpg4win 搭载了更新版本的 gpg

本人电脑上确实安装了 Git Bash,但使用帖子中提到的相关命令,在 cmd 中只能查看到 Gpg4win 的版本信息,但问题应该就与 Git Bash 有关,先将刚才安装的 Gpg4win 卸载掉,再在 cmd 中输入命令 gpg ,提示

'gpg' 不是内部或外部命令,也不是可运行的程序或批处理文件。

打开 Git Bash 输入命令 gpg --version

gpgdv

可以看到 Git Bash 确实装载了 2.2.29 版本的 gpg,之前 Gpg4win 的 gpg 版本为 2.3.4,可以断定,之前出现的错误就是因为 Git Bash 已经装载了 gpg,系统中有 gpg-agent 在运行,额外安装 Gpg4win 就会发生上述错误

3. 创建密钥对

打开 Git Bash 输入命令 gpg --full-generate-key 来完整地创建一个新的密钥对

gpg (GnuPG) 2.2.29-unknown; Copyright © 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(14) Existing key from card
Your selection? 1

第一段是版权声明,然后让用户自己选择加密算法。默认选择第一个选项,表示加密和签名都使用 RSA 算法。

然后,系统会询问密钥的长度。

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 2048
Requested keysize is 2048 bits

RSA 密钥长度在 1024~4096 之间,密钥长度决定了安全性,默认是 3072 位,这里我选择 2048 位。

接着,设定密钥的有效期。

Please specify how long the key should be valid.   # 请确认密钥的有效期
    0 = key does not expire   # 密钥不会过期
  <n> = key expires in n days   # 密钥在 n 天后过期
  <n>w = key expires in n weeks   # 密钥在 n 周后过期
  <n>m = key expires in n months   # 密钥在 n 月后过期
  <n>y = key expires in n years   # 密钥在 n 年后过期
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y

因为这个密钥仅为个人使用,并且可以有效保管私钥,选择第一个选项,永不过期。之后系统会进行确认,输入 y 进行确认

接下来输入你的真实姓名、邮件地址和注释来生成你的用户 ID 信息 这里注释一栏我选择为空

GnuPG needs to construct a user ID to identify your key.
Real name: Hxxxxx
Email address: xxxxxxxx@qq.com
Comment:

提示生成了用户 ID

You selected this USER-ID:
  “Hxxxxx <xxxxxxxx@qq.com>”

之后还会进行一次确认

Change (N)ame, ©omment, (E)mail or (O)kay/(Q)uit? O

输入 N 修改名字,输入 C 修改注释,输入 E 修改邮件,输入 O 进行确认,输入 Q 则退出
我们输入 O 进行确认

之后会提示

We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize thedisks) during the prime generation; this gives the random number generator a better chance to gain enough entropy.
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。

接下来弹出一个窗口,用来输入用户口令 passphrase 来对你的私钥进行加密存储

passphrase

可以看到 此时输入的 passphrase 仅有 5 位,且均为字母,点击 OK 后,有如下提示

在这里插入图片描述

重新输入合规的 passphrase 后,系统提示密钥已经生成了

gpg: key F4AE9D0C2B8A marked as ultimately trusted
gpg 密钥 F4AE9D0C2B8A 被标记为绝对信任
公钥和私钥已经生成并经签名。

在这里插入图片描述

这样,新的属于你的密钥对就生成了

3. 导出密钥对

导出公钥列表,命令 gpg --list-keys 用来查看当前的公钥环

listkeys

第 4 行显示密钥环 pubring.kbx
pub:公钥特征 : RSA 算法、2048 位、创建时间
uid:用户 ID
sub:显示私钥特征

导出私钥列表,命令 gpg --list-secret-keys 用来查看当前的私钥环

listsecretkeys

sec:公钥特征 : RSA 算法、2048 位、创建时间
uid:用户 ID
ssb:显示私钥特征

4. 上传公钥

公钥服务器是网络上专门储存用户公钥的服务器。send-keys参数可以将公钥上传到服务器。

gpg --send-keys [用户ID] --keyserver hkp://subkeys.pgp.net

使用上面的命令,你的公钥就被传到了服务器 subkeys.pgp.net,然后通过交换机制,所有的公钥服务器最终都会包含你的公钥。

由于公钥服务器没有检查机制,任何人都可以用你的名义上传公钥,所以没有办法保证服务器上的公钥的可靠性。通常,你可以在网站上公布一个公钥指纹,让其他人核对下载到的公钥是否为真。fingerprint 参数生成公钥指纹。

gpg --fingerprint [用户 ID]

5. 文件签名和加密

下面进行签名同时加密的操作,准备一个文本文件,地址为 E:/test.txt 命名为 test.txt,内容如图

在这里插入图片描述

输入命令

gpg --sign --encrypt E:/test.txt # 签名并加密目录在 E:/ 的文件 test.txt

listsecretkeys

执行命令后,提示我们输入用户 ID ,想要结束则输入一个空行,输入我们的用户 ID ,即自己作为接收者,之后在弹出来的提示框中输入用户口令 passphrase

enpass

加密完成,打开文件目录可以看到,在源目录下生成了一个 .gpg 格式的文件。这就是我们的加密文件

enout

我们将这个 .gpg 文件的后缀改为 .txt 格式,查看其内容,

enenout

发现文件的内容都是乱码,这就是加密后的文档

6. 文件解密和签名校验

我们使用上个步骤中加密的 test.txt.gpg 作为待解密文件,在 Git Bash 中输入命令

gpg --decrypt E:/test.txt.gpg

之后在弹出的对话框中输入用户口令 passphrase

enpass

由于该文件的接收人仍是我,公钥和私钥都存储在本地,想要得到我的私钥,就需要输入用户口令 passphrase,解密和签名校验完成,结果如图

在这里插入图片描述

gpg 解密后的文件内容会直接显示在标准输出,图中红框内为解密后的文件内容,之后紧跟的是该文件签名创建的时间,最后一行显示了签名的属性:这是一个来自"我"的可信签名

7. 总结和参考文献

  PGP 作为成熟的加密体制,其安全性毋庸置疑,在 Gpg 中还有其他很多的操作,包括对文件仅加密、仅签名、签名保存为 ASCII 文件等,这些操作可以在官方的使用手册上查到具体的使用方法,读者应该注重的是 PGP 的设计思想和相关的加密技术,对于软件的使用有一定的命令行基础即可
  对于那些正在使用 Git 进行版本管理的读者来说,不需要再额外安装 Gpg 服务,Git 中内置了较老版本的 Gpg,额外安装将带来不必要的麻烦

参考文档如下:

  1. 阮一峰 GPG入门教程-阮一峰
  2. Paul Heinlein, GPG Quick Start
  3. Ubuntu help,GnuPrivacyGuardHowto
  4. KNL, GnuPG Tutorial
  5. Alan Eliasen. GPG Tutorial
  6. GnuPG 袖珍 HOWTO (中文版)
  7. The GNU Privacy Handbook

http://chatgpt.dhexx.cn/article/l834Zrm5.shtml

相关文章

gpg加解密软件学习

为什么要学习gpg呢&#xff1f;因为要在Linux下把一个邮箱的密码加密&#xff0c;不让其他人看到该邮箱真正的密码。 为了不让其他人看到真正的邮箱密码&#xff0c;我们需要对其进行加密。 加密的方式是先把密码先写到一个文件A中&#xff0c;然后使用相关的加密软件对该文件…

java动态代理

java动态代理实现与原理详细分析 原文地址 关于Java中的动态代理&#xff0c;我们首先需要了解的是一种常用的设计模式--代理模式&#xff0c;而对于代理&#xff0c;根据创建代理类的时间点&#xff0c;又可以分为静态代理和动态代理。 一、代理模式 代理模式是常用的java…

动态规划 --- 算法思想介绍

一.动态规划的基本概念 动态规划在五种算法设计方法中难度最大&#xff0c;它建立在最优原则的基础上.采用动态规划方法&#xff0c;可以高效地解决许多用贪婪算法或分治法无法解决的问题.动态规划(dynamic programming)属运筹学中的规划论分支&#xff0c;是求解决策过程最优…

动态规划算法详解

动态规划算法通常用于求解具有最优性质的问题 基本概念 动态规划过程是&#xff1a;每次决策依赖于当前状态&#xff0c;又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的&#xff0c;所以&#xff0c;这种多阶段最优化决策解决问题的过程就称为动态规划(DP)。…

动态规划原理

1. 基本概念 动态规划通过拆分问题&#xff0c;将问题拆分成许多的子问题&#xff0c;定义问题状态和状态之间的关系&#xff08;即状态转移方程或递推公式&#xff09;&#xff0c;使得问题能够以递推&#xff08;或者说分治&#xff09;的方式去解决。按顺序求解子问题&…

动态代理详解

想要更加透彻的理解动态代理&#xff0c;首先要熟悉下静态代理 一、静态代理 总结来说&#xff1a;目标类和代理类实现了相同的接口&#xff0c;在代理类中依赖了目标类&#xff0c;代理类的方法中调用了目标类的方法&#xff0c;并做了一些增强性的工作。 1、实现静态代理&…

CAD动态块制作

CAD动态块制作 拉伸动态块柜体A拉伸动态块制作第一步&#xff1a;制作柜体A第二步&#xff1a;进入块编辑器编辑第三步&#xff1a;关闭块编辑器 柜体B拉伸动态块制作第一步&#xff1a;制作柜体B第二步&#xff1a;进入块编辑器第三步&#xff1a;关闭块编辑器 可见性动态块第…

数据有效性 动态选择

EXCEL有两列数据栏&#xff0c;A列和B列&#xff0c;都是通过下来框来选择&#xff0c;要求A列选择完成后&#xff0c;B列动态调整可选择的内容。例如&#xff1a;第一例选择“AA”&#xff0c;第二列可供选择的范围是“a-d”&#xff1b;第一例选择“BB”&#xff0c;第二列可…

OTP 动态口令验证

OTP 动态口令验证。 简介 动态口令&#xff08;OTP&#xff0c;One-Time Password&#xff09;又称一次性密码&#xff0c;是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术&#xff0c;是一种强认证技术&#xff0c;是增强目前静态口令认证的一种非常方…

loj#122.「强制在线」动态图连通性

loj#122. 「强制在线」动态图连通性 UPD:(7个月以后)这代码被叉了,我不想改了( negii真dl 然后发现这格式一更新…啊我的公式和链接怎么假掉了( csdn[] 算了不管了…反正这样子的话之后也不会用了( 题意 N 个点,M 次操作,支持加边/删边/询问两点间连通性。 强制在线。…

ORL、Yale等人脸数据库百度云链接

近段时间做人脸识别的实验&#xff0c;收集了几个人脸库&#xff0c;如图 这里放出百度云的链接&#xff0c;需要的自取 链接&#xff1a;https://pan.baidu.com/s/11_7bFdo_hhc83WQXmWtxvw 提取码&#xff1a;5ohd 强推这个文章&#xff0c;里面有16个人脸库的百度云链接 ht…

ORTP

1.为什么要使用RTP 一提到流媒体传输、一谈到什么视频监控、视频会议、语音电话&#xff08;VOIP&#xff09;&#xff0c;都离不开RTP协议的应用&#xff0c;但当大家都根据经验或者别人的应用而选择RTP协议的时候&#xff0c;你可曾想过&#xff0c;为什么我们要使用RTP来进行…

oracle中or的使用,Oracle Or

oracle函数 的 Oracle Or 在本教程中,我们来学习如何使用Oracle OR运算符来组合两个或更多的布尔表达式。 Oracle OR运算符介绍 OR运算符是一个逻辑运算符,它组合了布尔表达式,如果其中一个表达式为真(true),则返回true。 以下说明OR运算符的语法: expression_1 AND expre…

基于PCA方法的ORL人脸识别及Python代码实现

基于PCA方法的ORL人脸识别及Python代码实现 PCA算法方案设计代码实现结果分析参考文献 PCA的理论知识已经有很多博客做了清晰的解释&#xff0c;主要概括为找到投影的面使得类间误差最大&#xff0c;转化为找到构建的协方差的特征值与特征向量&#xff0c;在新的投影方向&#…

ORL Character Recgnition

文章目录 ORL Character Recgnition0 Abstract1 Introduction2 Related Work2.1 Character recognition2.2 Text detection 3 Connection Text Proposal Network3.1 Anchor3.2 Bi-Directional LSTM3.3 RPN layer3.4 Text line constructor3.5 Loss function3.6 Total system3.7…

ORL Faces Database介绍

ORL人脸数据集共包含40个不同人的400张图像&#xff0c;是在1992年4月至1994年4月期间由英国剑桥的Olivetti研究实验室创建。 此数据集下包含40个目录&#xff0c;每个目录下有10张图像&#xff0c;每个目录表示一个不同的人。所有的图像是以PGM格式存储&#xff0c;灰度图&…

基于ORL人脸数据库和PCA特征降维算法的人脸识别matlab仿真

目录 1.算法仿真效果 2.MATLAB核心程序 3.算法涉及理论知识概要 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下&#xff1a; 2.MATLAB核心程序 ...................................................................... for i1:40sub_dir strcat(s, num2str(i))…

【图像处理matlab】PCA+KNN人脸识别 ORL人脸数据集

文章目录 0.写在前面1. 数据集导入与划分2. train-PCA构建脸空间2.1 原始数据导入2.2 去中心化2.3 求解协方差矩阵、特征值、特征向量2.4 特征脸选取--脸空间 3. test-物以类聚 KNN分类3.1 KNN简介3.2 KNN实现步骤3.2.1 距离度量---欧式距离、豪斯多夫距离.......3.2.2 k值选择…

Orcal 数据库

目录 一、数据库 1. 数据库概念 2. SQL 语言 3. Oracle结构 4. 表&#xff08;Table&#xff09; 5. 三范式 6. SELECT 语句 二、Orcal 基本操作 1. 查询列&#xff08;字段&#xff09; 2. 查询行&#xff08;记录&#xff09; 2.1 比较条件 2.2 且或非 2.3 null…

【人脸识别】基于PCA实现ORL人脸识别附matlab代码和报告

1 简介 人脸识别技术先进,应用广泛。借助PCA算法,利用MATLAB GUI可以简单操作,通过对待识别图像的预处理即可提高识别率。本文首先对相关概念进行了阐述,对工作原理进行了介绍,具体对基于PCA算法人脸识别的MATLAB实现进行了解析。 2 部分代码 function [neednum,average_face…