用gpg gpg加密邮件是出现错误,可能是什么原因引起的

1680人阅读
linux(15)
  非对称加密需要公钥和私钥:
公钥的作用:别人用来给你发加密的信息&别人验证你的签名
私钥的作用:你用来创建签名&解密别人发给你的信息的
  具体而言,A要想发送加密信息到B,则:
  A有A的签名私钥和B的加密公匙
  B有A的签名公匙和B的加密私钥
  使用GPG可以很好的演示这一点:
gpg (GnuPG) 2.1.11
libgcrypt 1.6.5
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &http://gnu.org/licenses/gpl.html&
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
  首先,我们在安装好GPG之后(安装步骤),可以使用gpg --gen-key生成属于我们自己的一对公钥和私钥。之后我们可以使用gpg --export [UID]来输出UID所对应的公钥,比如对于我来说:
lgl@pArch ~ $ gpg --export -a 刘海博
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2
mQENBFbnwUkBCADtMQ73lZ1XEbcNbGyaF5IHQ1aoYBrIhj+BpXbV9Qz95OxqOoFP
6s0n1/cBhpjhhqm2hlJFhwrKIDMkTKBY0rif3ZHdHVKK7k7xW0qYWa0HZDtRApao
N3lZ3Ay2EyTSPj6SoFxleLm8LoftlDscp90kK/zGiXf95pslTmk4ziSolOtPTvP7
FpSaYizOO3JfUKUDrTdXRcEx2p7KmXi8v1O33bY0YG6yRmff90DzMxYqQ2LUQBfl
hVSu3mYKpP5IQ0tNgTCbUiyVqOX+TdxQoqMiTWiWvD5OJZf+7RqnbpQ9l6epmUEk
HAJcvhcEfLeDslt2o+x2s7BXW1o71/Xa3Q/fABEBAAG0HuWImOa1t+WNmiA8c2hp
bmluZ2xoYkAxNjMuY29tPokBNwQTAQgAIQUCVufBSQIbAwULCQgHAgYVCAkKCwIE
FgIDAQIeAQIXgAAKCRBbDqAL2u3LWxkXB/96dBtELKkA6hc2BLBxLBxchakEeaMK
lXDEiom6kwiqeI/H3KJchOtlTbBLGUmSdRAm3rX5UkVtaDvxW6iWuNzcbDZN6oCe
YCFqOvmzLZ+YWh48tRBJOTEzrkZrT/OpTGRtRI0cAIAJ68rMc5Vpxl1Vqknp/BzI
z84qPGBWgThy/UlgcFnbkZVLh37FLmIhtTMIbA1whum570/a/bnKP6xWnB4P5ryn
6lXLBMDMA2a0jtgzmywXm60nI6M77lzfd6UXGX0NQOU/AP+v0hNzkl4+KapEOONC
x7MjoL09b946Tqysly5u6gJpK/YmD0UUnVrH2OW6YQy/UmXQk7mKjG/7uQENBFbn
wUkBCACx3kvVDVjuo/LQrODb0wZig7NrsLasQ+dAOo/9UXY53wjrnLPiZLRbtYm1
tPFMykAv/23+vLXmLFW7gd0PjGOPZE4Q0/vR/Re+vJjonH3Z6E+DidE7T9vQmuB4
aLIvDpEcAWKSRN75/zLKzAysqHwEBXeSVD89bSMdH4rPpC70hABZZuVYC3rEkrdZ
6EcW7jca71eKVTKQRznuTZKzpHG8XwcgTt5qtmbZmWxIT4SMdxyI
qN9i/ZY668g8URQLxCUTdFy04p1Vft1yCByZF9Pie5paVO28kgegZf1O6+k1rR42
WHbtLFq7xYgW3vOG9I9yQdA8oOUHABEBAAGJAR8EGAEIAAkFAlbnwUkCGwwACgkQ
Ww6gC9rty1vt+ggAza5faR5AeHgIOnUyI3j28GxFey3E7CbVRO0ubO7Iq5qy+P1z
EQPmnpeQ/FpDabvP4P7qds77U2wFbvsa/Ar4ZuznmNuL9r8fGJn6BrmPLAMxfwOo
c+w6qN0iYp+kl6pRTYYolICyZfq/CLrDKxUaAHlSpZoEI5CUIs/tntcLJRSei/1S
GUjXS7sqlVafNM2Vqxy3XBqVffXGsUNXr1zRGz/Dia9Kt3sztDYDjo3csHlEPVTw
v1gRxVTnsrmoQlJ7+S2tT6hocuD5k6Ye11vyCMYny6BxCYz5CW6HtvAWs9kXT6E3
hTFS5THpkuu+uZLPM2CGJuFLdwNrBzMXHrqRaQ==
-----END PGP PUBLIC KEY BLOCK-----
  以上就是我的公钥,其中-a是为了让字符以ASCII形式输出,而不是二进制。隐含地,结果将输出到标准输出(stdout)去,可以用-o选项可以把它放到一个文件里去。
  之后,我们需要得到别人的公钥,才能用他的公钥加密我们想要发给他的数据。gpg --import [filename]即可导入别人的公钥,这个存放公钥的文件可以使用-o选项导出。
  我们可以通过gpg --list-keys查看当前所有的公钥,比如:
lgl@pArch ~/tmp/GPGtest $ gpg --list-keys
rsa2048/DAEDCB5B
[ 绝对 ] 刘海博 &&
[ 未知 ] Justin R. Miller &&
[ 未知 ] Justin R. Miller &&
elg1024/59FAB546
  说明我现在有两个公钥,一个是我自己的,另一个是Justin的。钥匙号分别为DAEDCB5B和C9C40C31,说到钥匙号,我们也可以使用别人的公钥钥匙号导入公钥gpg --recv-keys 0xC9C40C31。
  如果此时Justin用自己的私钥给文件签名(假设签名后的文件为sample.txt.asc,关于签名的内容我们会在最后再说)然后发给我,那么我就可以用公钥去验证文件签名的真伪:
lgl@pArch ~/tmp/GPGtest $ gpg --verify sample.txt.asc
gpg: 于 Fri 17 Aug 2001 06:56:01 AM CST 创建的签名,使用 DSA,钥匙号 C9C40C31
gpg: 完好的签名,来自于“Justin R. Miller &justin@solidlinux.com&” [未知]
亦即“Justin R. Miller &justin@voxel.net&” [未知]
gpg: 警告:这把密钥未经受信任的签名认证!
没有证据表明这个签名属于它所声称的持有者。
主钥指纹: 2231 DFF0 869E E3A5 885A
E7D4 F787 7A2B C9C4 0C31
  以上信息可以看出,我们使用Justin的公钥可以认证这个文件,且文件的内容未曾被更改。但是有警告信息,这些信息是在告诉我们:如果这把公钥真的是Justin的,那么这个文件就是Justin的,但是这把公钥的真伪并没有的到验证,可能存在我们当初得到的公钥是被别人替换过的公钥的情况。为此,我们应当跟Justin本人确认此公钥的正确性,如果确认无误,我们可以对这个公钥进行信任程度设置(稍后再讲信任度的设置)。
  接下来看使用GPG加密与解密的过程:
  首先,我们写一些话,想要发给Justin(Hello.txt):
Hello, I am Liu Haibo.
This is my sample text sending to Justin.
  既然我们想发给Justin,那么我们自然需要用Justin的公钥对其进行加密(然后Justin再用自己的私钥对我发过去的加密内容进行解密),加密使用到的命令是gpg -e 要加密的文件名或者是gpg --encrypt 要加密的文件名,我们可以再加-r参数直接指定要发送的人的UID(即选用需要的公钥),如果此处不使用-r,在执行加密的过程中也会要求填写接收人的UID:
lgl@pArch ~/tmp/GPGtest $ gpg -r justin -e Hello.txt
gpg: 59FAB546:没有证据表明这把密钥真的属于它所声称的持有者
elg1024/59FAB546 2001-05-25 Justin R. Miller &justin@voxel.net&
主钥指纹: 2231 DFF0 869E E3A5 885A
E7D4 F787 7A2B C9C4 0C31
子钥指纹: 5B6A 9C4D 7C54 5936 B9F5
4D8B EDD4 CD22 59FA B546
这把密钥并不一定属于用户标识声称的那个人。如果您真的知道自
己在做什么,您可以在下一个问题回答 yes。
无论如何还是使用这把密钥吗?(y/N)y
  以上可以看出,虽然我们对内容进行了加密,但是由于我们还没有对公钥进行信任度设置,gpg仍在提醒我们公钥本身有可能就是假的。
  接下来看看加密后的内容(Hello.txt.gpg):
lgl@pArch ~/tmp/GPGtest $ cat Hello.txt.gpg
????"Y??F?????re?5m?j ???
???S?0??y???? ?Z??Q?υ??a?$r?????p?su????????hd 5(7??,??S7_?WtN]??DGV??P?w??nKc???????&楖?,?Q8???L?4-v?7?6?????-?0??.????0K?Y??{?????&o???`?^=??e~?C?(?Y???W?%????Hy?I?dn??kv2HпA??8??????7????t?????.(??t?I??%
  乱码,因为这是二进制文件。
  试试在加密过程中加入--armor参数(以ASCII而不是二进制输出):
lgl@pArch ~/tmp/GPGtest $ gpg -r justin -e --armor Hello.txt
gpg: 59FAB546:没有证据表明这把密钥真的属于它所声称的持有者
elg1024/59FAB546 2001-05-25 Justin R. Miller &justin@voxel.net&
主钥指纹: 2231 DFF0 869E E3A5 885A
E7D4 F787 7A2B C9C4 0C31
子钥指纹: 5B6A 9C4D 7C54 5936 B9F5
4D8B EDD4 CD22 59FA B546
这把密钥并不一定属于用户标识声称的那个人。如果您真的知道自
己在做什么,您可以在下一个问题回答 yes。
无论如何还是使用这把密钥吗?(y/N)y
  接下来再查看加密后的文件(Hello.txt.asc):
lgl@pArch ~/tmp/GPGtest $ cat Hello.txt.asc
-----BEGIN PGP MESSAGE-----
Version: GnuPG v2
hQEOA+3UzSJZ+rVGEAP/YTDy4HcGP9PyvfKxH30fZtVJ/jqg/+NKJjTecuSdchSc
RxDBwu0zEmpV0pdnllBteayfabPr1JDJdZ5UX6yCpsc/vON6nRVULGHSkACIXsmc
m2vCTIMlbbnclu4bRSoXU5tI2tgWie6xFrZUMH7q4pRVUrL9wMYRyTUsP6wcJDYD
FuhdMALDENqVX2+tGhi9/u3qJq5NgSn1v+uUwJFqehYbO514LAxSczWSQGE7APUN
vOPhLJURN7iHdN1cHnJvi2zvDHcvMssPwwPjUKtnnR3Z0oEBW8LuO7pICGZ5PDss
4ItACKwNQYPcNGukYvO+LuRbE7uxMegROeqpLPOjVNsNOiCQVHl4pI9KSV+WLFXl
xgurX4Up1uUi1rW1mPZEaXbnMT+rcenY508Dj6ayYAN07XP5/wg5HDQF0S2+OIhW
VQEkj6DiqZfbIEUSz2SDm5zIZiU=
-----END PGP MESSAGE-----
  虽然是字符,但显然内容已经被加密了,无法看懂。
  我们把加密后的信息发给Justin之后,他直接用自己的私钥解密就可以阅读我们想给他传达的信息了(但是我无法演示解密过程,因为我没有Justin的私钥啊,现在这个世界上只有他可以解密这封密信了)。
  为了演示解密过程,我们再举一个例子:
  还是刚刚那个文件,命名为Hi.txt,这次我们用自己的公钥加密(这样我就可以用自己的私钥解密了):
lgl@pArch ~/tmp/GPGtest $ gpg -r 刘海博 -e Hi.txt
lgl@pArch ~/tmp/GPGtest $ cat Hi.txt.gpg
?]?}dS??3??+?8??&,v??NZ_??[??iC??8?n$??&V?{??9??B?~g??g?uU????|'euQ~Pk??$Qp?D????G?Mr?r&8??u?MJ'?Gv???Μ?H?j6?9YM?H?P
?N??????N??J???|]??r(??c???I????@????b???RTFOWx?9??EC????6M?js3?O?s??:??f.=5??[i?????1
???Y&??a?????NT*?(??V?????"?M ??P?{?g????$?v??R8
???????????-?b??Z?.X~?4???g[X?[g
m?`????5??#MU\????4%
显然这个生成的Hi.txt.gpg是二进制的,我们再生成一个ASCII的,名称默认为Hi.txt.asc:
lgl@pArch ~/tmp/GPGtest $ gpg -r 刘海博 -e --armor Hi.txt
lgl@pArch ~/tmp/GPGtest $ cat Hi.txt.asc
-----BEGIN PGP MESSAGE-----
Version: GnuPG v2
hQEMA9RdjQJ9ZFOvAQgAhZ0OTp/AVjE+8eLxFUt5W4UM1ZbsiJ0KMB8gAPm+5Lqx
ewOGtRXN2jWkRIuYXi0UKQmv/uTOUXQFDGpmeBtm2dkX+TV54GCdrarxq32soZzk
Kxbvj0ucpiSP/EUsWtNacuThhzgiibxGZq6LlD71t6UZhVC8MtQ7AOi1yeh9cZV9
KCJLH8a81yU6hL+uk8OnOn6RJW6jMaITNpN36k4kbwLbrYAzSkD/m9zEatVE/Jpm
ozYyV9NznAETLZ3i+RcmTAMzP4Ka1R9luwSvNKdHbdEq/jboJZaS2Ye+JLfW38ID
4P00Z91U0JoM64lqVlskzH2zIfZJpj+uLJiskQDw+NKCAbanCIfDqAn/2LYlDoMI
oHRI6Qq58OSYj4iw2OVmzUYQQVLg0s4RsrMKHtLRWc8KR5wcw8pWxD0gdQrTqUEi
tvv9y2c3afhn7AQzDvtIxrQIt/7MS37e4A6Y6f9Ax43rWLmL0198tRuojrwpk6UR
uTF5oyUpJx2VFYUDtVh2JKCzjQ==
-----END PGP MESSAGE-----
  对于这两个加密的文件(一个Hi.txt.gpg,一个Hi.txt.asc),分别对其进行解密,使用gpg -d 密文文件名或者gpg --decrypt 密文文件名:
lgl@pArch ~/tmp/GPGtest $ gpg -d Hi.txt.asc
gpg: 由 2048 位的 RSA 密钥加密,钥匙号为 7D6453AF、生成于 2016-03-15
“刘海博 &shininglhb@163.com&”
Hello, I am Liu Haibo.
This is my sample text sending to Justin.
lgl@pArch ~/tmp/GPGtest $ gpg -d Hi.txt.gpg
gpg: 由 2048 位的 RSA 密钥加密,钥匙号为 7D6453AF、生成于 2016-03-15
“刘海博 &shininglhb@163.com&”
Hello, I am Liu Haibo.
This is my sample text sending to Justin.
  均成功解密,显示了加密之前的信息。
  此时,如果我们去解密刚刚用Justin的公钥加密过的文件Hello.txt.asc:
lgl@pArch ~/tmp/GPGtest $ gpg -d Hello.txt.asc
gpg: 由 1024 位的 ELG 密钥加密,钥匙号为 59FAB546、生成于 2001-05-25
“Justin R. Miller &justin@solidlinux.com&”
gpg: 解密失败:没有秘匙
  显然失败了,因为我们只有属于自己的私钥,不可能解开别的公钥加密过的文件。
  现在我们再来考虑一下信任度的设置。之前由于我们未对Justin的公钥进行信任度设置,每次用到Justin的公钥的时候,gpg都会友善的提醒我们,在我们获取此公钥的时候,有可能公钥已经被篡改了,因此此公钥有可能不是Justin本人的。但是如果我们确信这就是Justin的公钥,我们可以对其设置信任度,使用gpg --edit-key:
lgl@pArch ~/tmp/GPGtest $ gpg --edit-key justin@solidlinux.com
gpg (GnuPG) 2.1.11
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
创建于:2001-05-25
有效至:永不过期
可用于:SCA
信任度:未知
有效性:未知
elg1024/59FAB546
创建于:2001-05-25
有效至:永不过期
[ 未知 ] (1). Justin R. Miller &justin@solidlinux.com&
[ 未知 ] (2)
Justin R. Miller &justin@voxel.net&
Really sign all text user IDs? (y/N) y
创建于:2001-05-25
有效至:永不过期
可用于:SCA
信任度:未知
有效性:未知
主钥指纹: 2231 DFF0 869E E3A5 885A
E7D4 F787 7A2B C9C4 0C31
Justin R. Miller &justin@solidlinux.com&
Justin R. Miller &justin@voxel.net&
您真的确定要签名这把密钥,使用您的密钥
“刘海博 &shininglhb@163.com&”(DAEDCB5B)
真的要签名吗?(y/N)y
gpg& trust
创建于:2001-05-25
有效至:永不过期
可用于:SCA
信任度:未知
有效性:未知
elg1024/59FAB546
创建于:2001-05-25
有效至:永不过期
[ 未知 ] (1). Justin R. Miller &justin@solidlinux.com&
[ 未知 ] (2)
Justin R. Miller &justin@voxel.net&
您是否相信这位用户有能力验证其他用户密钥的有效性(查对身份证、通过不同的渠道检查
1 = 我不知道或我不作答
2 = 我不相信
3 = 我勉强相信
4 = 我完全相信
5 = 我绝对相信
m = 回到主菜单
您的决定是什么?5
您真的要把这把密钥设成绝对信任?(y/N)n
您的决定是什么?4
创建于:2001-05-25
有效至:永不过期
可用于:SCA
信任度:完全
有效性:未知
elg1024/59FAB546
创建于:2001-05-25
有效至:永不过期
[ 未知 ] (1). Justin R. Miller &justin@solidlinux.com&
[ 未知 ] (2)
Justin R. Miller &justin@voxel.net&
请注意,在您重启程序之前,显示的密钥有效性未必正确,
gpg& 要保存变动吗?(y/N)y
  之后再查看公钥列表:
lgl@pArch ~/tmp/GPGtest $ gpg --list-keys
gpg: 正在检查信任度数据库
gpg: marginals needed: 3
completes needed: 1
trust model: PGP
gpg: 深度:0 有效性:
1 已签名:
1 信任度:0-,0q,0n,0m,0f,1u
gpg: 深度:1 有效性:
1 已签名:
0 信任度:0-,0q,0n,0m,1f,0u
/home/lgl/.gnupg/pubring.kbx
----------------------------
rsa2048/DAEDCB5B 2016-03-15 [SC]
[ 绝对 ] 刘海博 &shininglhb@163.com&
rsa2048/7D6453AF 2016-03-15 [E]
dsaC31 2001-05-25 [SCA]
[ 完全 ] Justin R. Miller &justin@solidlinux.com&
[ 完全 ] Justin R. Miller &justin@voxel.net&
elg1024/59FAB546 2001-05-25 [E]
  原来Justin的公钥之前显示的[未知]已经变成我们设置的[完全]了。我们可以发现我们自己的公钥被默认设置为绝对信任,这显然是必须的,也是肯定正确的。我们还可以发现修改完信任度之后再查询公钥时,gpg会先查询信任度数据库,这说明这些信任信息不是存在储存钥匙的文件里,而是存在另一个文件里的。
  最后,我们说一下签名。
  为避免别人宣称是你的风险,对所有你加密的东西签名是有用的。签名的意义在于两个方面:Authenticity和Integrity。即数字签名可以证明数据是你发送的,并同时证明发送的内容未曾被别人修改过。
  签名的命令为gpg -s [Data]或者gpg --sign [Data]。这样做的时候,同时数据也被压缩。也就是说,最终结果是无法直接读懂的。若你想要一个能直接读懂的结果,你可以用gpg --clearsign [Data],这样就能保证结果是清晰可读的。同时它也照样对数据签名:
lgl@pArch ~/tmp/minecraft $ gpg -s Hi.txt
lgl@pArch ~/tmp/minecraft $ gpg --clearsign Hi.txt
  上面两条命令分别生成了Hi.txt.gpg和Hi.txt.asc两个文件。
  需要注意的是,刚刚的签名自然是签的我们自己的名,所以用的是我们自己的私钥,需要用我们自己的公钥认证签名gpg --verify 签名文件:
lgl@pArch ~/tmp/minecraft $ gpg --verify Hi.txt.asc
gpg: 于 Wed 16 Mar 2016 02:33:42 AM CST 创建的签名,使用 RSA,钥匙号 DAEDCB5B
gpg: 完好的签名,来自于“刘海博 &shininglhb@163.com&” [绝对]
lgl@pArch ~/tmp/minecraft $ gpg --verify Hi.txt.gpg
gpg: 于 Wed 16 Mar 2016 02:33:18 AM CST 创建的签名,使用 RSA,钥匙号 DAEDCB5B
gpg: 完好的签名,来自于“刘海博 &shininglhb@163.com&” [绝对]
  两个文件均验证为正确,说明这两个文件是”刘海博“签的名。
  用gpg -b (--detach-sign) [Data],我们还可以将签名写进另一个文件。
  签名后的文件,我们还可以使用解密来读取:
lgl@pArch ~/tmp/minecraft $ gpg -d Hi.txt.asc
Hello, I am Liu Haibo.
This is my sample text sending to Justin.
gpg: 于 Wed 16 Mar 2016 02:33:42 AM CST 创建的签名,使用 RSA,钥匙号 DAEDCB5B
gpg: 完好的签名,来自于“刘海博 &shininglhb@163.com&” [绝对]
  可以看到区别就在与verify只显示认证的结果,而decrypt同时也显示出了原数据的内容。
  如果这个时候我们对认证后的动动手脚,修改一些内容:
lgl@pArch ~/tmp/minecraft $ gpg --verify Hi.txt.asc
gpg: 于 Wed 16 Mar 2016 02:33:42 AM CST 创建的签名,使用 RSA,钥匙号 DAEDCB5B
gpg: 已损坏的签名,来自于“刘海博 &shininglhb@163.com&” [绝对]
lgl@pArch ~/tmp/minecraft $ gpg -d Hi.txt.asc
Hello, I am Liu Haibdddddo.
This is my sample text sending to Justin.
gpg: 于 Wed 16 Mar 2016 02:33:42 AM CST 创建的签名,使用 RSA,钥匙号 DAEDCB5B
gpg: 已损坏的签名,来自于“刘海博 &shininglhb@163.com&” [绝对]
  可以看出签名的第二个功能生效了,我们可以根据签名验证文件内容是否被修改。
  有趣的是,如果再把修改过后的内容修改回去,则认证又会再次通过。这也说明了签名的确就是对整个文件的内容进行Hash产生的。
  而且,不管什么样的文件,签名的时候只是单纯的在文件内容前后添加头尾,即以下格式:
附录:为什么要先签名后加密?
  看你发送的这个信息算不算秘密。算的话必须先签名后加密。
如果不算的话都行。但签名后加密比较好。除非要大家都能验证信息来源。
  对于这个问题我们举个例子:
  对于先加密后签名
  A要把秘密给B。
  A有A的签名私钥和B的加密公匙
  B有A的签名公匙和B的加密私钥
  现在C加入。欺骗B说他也知道这个秘密(其实他不知道)
  C把自己的签名公匙给B
  因为C知道A的签名公匙,C可以把A给B的信息签名去掉再加上自己的签名
  这个时候
  B有用自己公匙加密的2条信息。明文是一样的。一个A签名一个C签名。B是无法知道谁真正知道秘密。
  如果是先签名后加密。
  因为C不可能知道加密密匙,所以不能解密后改签名。所以就不能欺骗B说他也知道秘密。
  所以先加密后签名的缺陷不是C能知道秘密,而是B可能被欺骗。
  因此签名都用在义务宣言上,表明自己说过的负责,不会不认帐。大家不会没事去冒名。(比如欠条)
  如果对于别人会冒名的宣言,比如(出售机密,勒索等)如果签名没有被加密,B就可能向不知道秘密的人买秘密。
要做到既加密又签名,完整的命令行大致如下:
gpg [-u Sender] [-r Recipient] [–armor] –sign –encrypt [Data]
-u (–local-user)
-r (–recipient)
  最后说一下密钥迁移的问题。
  如果我们现在想换电脑,无疑我们需要把之前的公钥和自己的私钥全部都导出来。
gpg --export puppylpg & puppylpg.public
gpg --export-secret-key puppylpg & puppylpg.private
  我们将puppylpg的两个密钥导出成为两个文件,之后再导入另一个电脑。
gpg --import puppylpg.public
gpg --allow-secret-key-import --import puppylpg.private
  注意导入私钥的时候需要添加--allow-secret-key-import给予允许添加私钥的权限,并且也不能遗漏--import参数。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:61228次
积分:1309
积分:1309
排名:千里之外
原创:67篇
(2)(1)(2)(1)(4)(1)(3)(4)(3)(6)(1)(4)(1)(2)(1)(3)(9)(8)(1)(4)(2)(4)(6)Git+GPG加密tag一直失败 - 博客频道 - CSDN.NET
堕落方能自由的专栏
不积跬步,无以至千里。
最近在学习Git方面的知识,发现廖雪峰老师的网站有系统介绍Git的教程
我用该命令:$ git tag -s v0.2 -m “signed version 0.2 released” fec145a(一个commit id,通过命令 git log –pretty=oneling –abbrev-commit可以看到所有的6位缩写的commit id)一直报错误:
gpg: skipped “brucezh ”: secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
error: unable to sign the tag
首先我排除了没有gpg密钥的可能,因为我用gpg –list-key能看到我之前生成的GPG key。之后一直查找资料,还是不能解决,看到一篇博客后得到启发,虽然在C:\Users\本地电脑的用户名.gnupg目录下有pubring.gpg和secring.gpg文件,但是我发现这两个文件竟然是0kb,至此我知道为什么一直报错了。怎么办呢?别担心哈,既然刚才我说了用cmd命令看到了key,那说明肯定是存在key的,对!该文件不在C:\Users\本地电脑的用户名.gnupg下,二是在C:\Users\本地电脑的用户名\AppData\Roaming\gnupg于是将这两个文件拷贝到C:\Users\本地电脑的用户名.gnupg目录下,再在Git Bash中输入命令(当然要进入你的Reposity目录下)注意:此时的命令是:git tag -u “你在生成GPG key的时候输入的Real name” -s v0.3 -m “my second tag message 2f7179c”
回车看到如下信息:
You need a passphrase to unlock the secret key for
user: “brucezh (GPG key for me) ”
2048-bit RSA key, ID E6556B1A, created
Enter passphrase:
输入生成GPG key输入的密码就可以了。
终于给tag加密成功了。
给自己备忘一下,也让遇到该问题一直找不到解决办法的童鞋们做参考!!!
最后再分享一个学习GPG入门教程:
排名:千里之外
(2)(1)(1)(1)1134人阅读
信息安全(8)
Linux(9)
信息安全原理&
作业3 与TA用公私钥交换信息
gpg - OpenPGP encryption and signing tool
就是一个加密和签名的工具
捣鼓了一上午,终于用起来了,说来还把字打错了,pgp真不知道是啥
首先生成一对密钥
amrzs@ubuntu:~$ gpg --gen-key
gpg (GnuPG) 1.4.14; Copyright (C) 2013 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.
请选择您要使用的密钥种类:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (仅用于签名)
(4) RSA (仅用于签名)
您的选择? 1
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)
您所要求的密钥尺寸是 2048 位
请设定这把密钥的有效期限。
0 = 密钥永不过期
= 密钥在 n 天后过期
&n&w = 密钥在 n 周后过期
&n&m = 密钥在 n 月后过期
&n&y = 密钥在 n 年后过期
密钥的有效期限是?(0) 60
密钥于 日 星期六 10时45分02秒 CST 过期
以上正确吗?(y/n) n
密钥的有效期限是?(0) 45
密钥于 日 星期五 10时45分02秒 CST 过期
以上正确吗?(y/n) y
您需要一个用户标识来辨识您的密钥;本软件会用真实姓名、注释和电子邮件地址组合
成用户标识,如下所示:
“Heinrich Heine (Der Dichter) &heinrichh@duesseldorf.de&”
真实姓名: amrzs
电子邮件地址:
注释: rsa for information security course
您选定了这个用户标识:
“amrzs (rsa for information security course) &&”
更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? o
您需要一个密码来保护您的私钥。
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
随机字节不够多。请再做一些其他的琐事,以使操作系统能搜集到更多的熵!
(还需要267字节)
fdgjhhujhtgertrefdgdeter]gfdgreiil[po4[]op[=owerewrewrewfjhfuhuewewewwwweee
ewrewweryyruwyruywuqgtght
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
随机字节不够多。请再做一些其他的琐事,以使操作系统能搜集到更多的熵!
(还需要92字节)
gpg: 密钥 340E02B6 被标记为绝对信任
公钥和私钥已经生成并经签名。
gpg: 正在检查信任度数据库
gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
gpg: 深度:0 有效性:
1 已签名:
0 信任度:0-,0q,0n,0m,0f,1u
gpg: 下次信任度数据库检查将于
[有效至:]
密钥指纹 = 891E B35E 31D1 F008
7FC0 656F 340E 02B6
amrzs (rsa for information security course) &&
[有效至:]
做这一堆琐事还真累
下面查看一下生成的密钥
amrzs@ubuntu:~$ gpg --list-keys
/home/amrzs/.gnupg/pubring.gpg
------------------------------
[有效至:]
amrzs (rsa for information security course) &&
[有效至:]
导出公钥到文件中 -a为ascii模式
amrzs@ubuntu:~$ gpg --export -a & public_key.rsa
amrzs@ubuntu:~$ cat public_key.rsa
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.14 (GNU/Linux)
mQENBFMns6EBCADYEMqh+uZ9xXct36e8ypyC6+W+qhge5roJ9E6vYwA7/mE4jKvj
Fi3izHdFCA3t56ggoaa8lSKrr7MapGyVvRVrZVCnqpPIwmUCHTrs2rbV6Zo1X688
B6ww2LJrp9EjsvKgR2G71ZlbjzfpnktgAKZd2DUEeIT17fEhF7Zem2FFuBpmtf4a
fNa02uJCCFuKCeGWyf0gBf29tEIDezXrXm0fBQrJa2ugtMQpV5YGg/KUtxW81Z/1
Exu87HPFQazwSdAU0n8uNJd1VZ9pTuPuHNPCvhcfJj7i5bgDrgjIoHVQOIoKJnoH
x0rc5vTwiJKQAvR7Rarap2uW7m8LE1CpQanDABEBAAG0QmFtcnpzIChyc2EgZm9y
IGluZm9ybWF0aW9uIHNlY3VyaXR5IGNvdXJzZSkgPGFtcnpzemhhbmdAZ21haWwu
Y29tPokBPgQTAQIAKAUCUyezoQIbAwUJADtTgAYLCQgHAwIGFQgCCQoLBBYCAwEC
HgECF4AACgkQf8BlbzQOAraqZgf9HvxjcU1fFMe1oxlndYG962BGZWkKsy/8EHQx
8cRuxGcIgIQ5W+UmzFtWqYVHFlAZcYOe69pkTGx6/bEyLnWRD3ZnaQ9uzM1bsFiF
xKV9+rRzO5S7DvqkOYISCxX8IygDOiYfiExRCgFP9xMLRj3GgUI3D/eprbKycAr1
zV42C20iwuoPtgAVPInX2zde+Qi7FQCGeD/7/yKNeSRhi7zT3KxA8S9L4MxhKS0I
gnR5rvw3paWTfK7MwyP8Cn06E9Rxg/XQqnlOYhMtqKrgWMovJapyFOFXiE8lVjlt
nn30bJz6NK1zNPQw+t4M4J0OnCLv7pm8gVMSL2wigzkNcDYLNLkBDQRTJ7OhAQgA
t4FopDxKKJYeIpjtJ9fZqJV7oR/gu0Yh/aYuWQYPqHE/RNpMtJCPEDoPGcVClq6o
XoEmZswpnfo7AoZLQsWah+Q4ffM0Y8y7HTyjhDDeF7bukBehVOZHaiv8tviA0+bW
MOPhb5bj/H8qi8hrL505SigYcO8uwQieIjmNHB9jk9a+VHZHhUbzB9RPEEaqqPbx
xPBRkTfCnEqq+tGIxKHW6cApQBQYAEP/rFTaLswISMT3+RCCBLPfohX9beqgNUpG
5kQeSPpm+scG6s2Cs7qK0u6MxO3GovUEypxnwTetpsvgsttCRZTc3fjZYB0izY4e
k5VVKuOB0gNu62/i488rPwARAQABiQElBBgBAgAPBQJTJ7OhAhsMBQkAO1OAAAoJ
EH/AZW80DgK2Ru8H/0yoAwC74yLW6Iaod8wwtvwt46A3D4Nh0fJvE1vPWFCE7kmG
l2bmT7UbdP93T6JG02xerYwkV7qw+jxBetmgsBYjuPw8fTz5uLsbcCbIPhqBYJyE
ygzS/JcI11ttQmEvtrp/YyqNJx48wsD0uxNOt7SX9heMB9TGitDT6ohvhQtkq3n9
uemcrB2n3lKOc0eJiMY1gjBoB+m8vm5PJ9iF4r8qFSD1MQko2XTAY08BpNwTaLMD
Frr0VskrjBSNOzW7FavmlfkqApFgbrAGFaxYayMduDrxJ39WyH2h1iTq4KUUv1CO
T+mD6NC3QP9J2JxoHWIWVeaxJ0OzpmRDoUsZb0w=
-----END PGP PUBLIC KEY BLOCK-----
使用gpg来加密解密
amrzs@ubuntu:~$ gpg -r amrzs -e hello.c
amrzs@ubuntu:~$ gpg -d hello.c.gpg
您需要输入密码,才能解开这个用户的私钥:“amrzs (rsa for information security course) &&”
2048 位的 RSA 密钥,钥匙号 13F9301C,建立于
(主钥匙号 340E02B6)
gpg: 由 2048 位的 RSA 密钥加密,钥匙号为 13F9301C、生成于
“amrzs (rsa for information security course) &&”
#include &stdio.h&
int main(){
其中要输入密码,应该是用来对使用私钥的控制,私钥应该是看不到的。
下面给出gpg的指令简略介绍:
amrzs@ubuntu:~$ gpg --help
gpg (GnuPG) 1.4.14
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &http://gnu.org/licenses/gpl.html&
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: ~/.gnupg
支持的算法:
公钥: RSA, RSA-E, RSA-S, ELG-E, DSA
对称加密: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,
TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
散列: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
压缩: 不压缩, ZIP, ZLIB, BZIP2
语法:gpg [选项] [文件名]
签名、检查、加密或解密
默认的操作依输入数据而定
-s, --sign [文件名]
生成一份签名
--clearsign [文件名]
生成一份明文签名
-b, --detach-sign
生成一份分离的签名
-e, --encrypt
-c, --symmetric
仅使用对称加密
-d, --decrypt
解密数据(默认)
--list-keys
--list-sigs
列出密钥和签名
--check-sigs
列出并检查密钥签名
--fingerprint
列出密钥和指纹
-K, --list-secret-keys
生成一副新的密钥对
--delete-keys
从公钥钥匙环里删除密钥
--delete-secret-keys
从私钥钥匙环里删除密钥
--sign-key
为某把密钥添加签名
--lsign-key
为某把密钥添加本地签名
--edit-key
编辑某把密钥或为其添加签名
--gen-revoke
生成一份吊销证书
--send-keys
把密钥导出到某个公钥服务器上
--recv-keys
从公钥服务器上导入密钥
--search-keys
在公钥服务器上搜寻密钥
--refresh-keys
从公钥服务器更新所有的本地密钥
导入/合并密钥
--card-status
打印智能卡状态
--card-edit
更改智能卡上的数据
--change-pin
更改智能卡的 PIN
--update-trustdb
更新信任度数据库
--print-md 算法 [文件]
使用指定的散列算法打印报文散列值
-a, --armor
输出经 ASCII 封装
-r, --recipient 某甲
为收件者“某甲”加密
-u, --local-user
使用这个用户标识来签名或解密
设定压缩等级为 N (0 表示不压缩)
--textmode
使用标准的文本模式
-o, --output
指定输出文件
-v, --verbose
-n, --dry-run
不做任何改变
-i, --interactive
覆盖前先询问
行为严格遵循 OpenPGP 定义
生成与 PGP 2.x 兼容的报文
(请参考在线说明以获得所有命令和选项的完整清单)
-se -r Bob [文件名]
为 Bob 这个收件人签名及加密
--clearsign [文件名]
做出明文签名
--detach-sign [文件名]
做出分离式签名
--list-keys [某甲]
--fingerprint [某甲]
请向 &gnupg-bugs@gnu.org& 报告程序缺陷。
请向 &i18n-& 反映简体中文翻译的问题。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:19081次
排名:千里之外
原创:27篇
(2)(23)(5)(2)(2)

我要回帖

更多关于 gpg 加密文件 的文章

 

随机推荐