使用GnuPG加密和签名

<blockquote> <p><em>老大哥在看着你。 ---《1984》</em></p> </blockquote> <h1 id="">背景引入</h1> <h2 id="_1">当前的网络环境</h2> <ol> <li> <p>当前的互联网是由网络巨头把持的。</p> </li> <li> <p>网络巨头很难不作恶,法律都靠不住,更加不能指望道德的约束。</p> </li> <li> <p>某些邪恶政府要求网络巨头提供用户数据,屁民很难独善其身。</p> </li> </ol> <p>下面援引两个<strong>事实</strong>:</p> <blockquote> <p><a href="https://zh.wikipedia.org/wiki/%E7%8E%8B%E5%B0%8F%E5%AE%81" title="王小宁">王小宁</a>2003年9月12日,被以“煽动颠覆国家政权罪”判处十年徒刑。王小宁的被捕和被判刑,同<a href="http://zh.wikipedia.org/wiki/%E9%9B%85%E8%99%8E%E4%B8%AD%E5%9B%BD#.E6.8A.AB.E9.9C.B2.E7.94.A8.E6.88.B6.E5.80.8B.E4.BA.BA.E4.BF.A1.E6.81.AF.E4.BA.89.E8.AE.AE" title="雅虎公司">雅虎公司</a>向中国当局泄露他的网上保密信息直接有关。</p> <p>因泄露国家机密指控被判入狱的中国记者兼诗人<a href="https://zh.wikipedia.org/wiki/%E5%B8%AB%E6%BF%A4" title="师涛">师涛</a>已被提前释放。这起案件曾导致雅虎受到来自美国国会和言论自由倡导者的强烈谴责。师涛在8月23日被释放,比他的10年刑期提前了15个月。师涛的案子凸显出外国互联网公司在政府密切监控信息和压制异见的市场运营时所面临的问题。中国国安局利用雅虎提供的邮件信息作为证据指控其泄漏国家机密。 ---<a href="http://www.solidot.org/story?sid=36375" title="中国提起释放师涛">solidot</a></p> </blockquote> <p>这两人都被列入了<a href="https://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9C%8B%E6%8C%81%E4%B8%8D%E5%90%8C%E6%94%BF%E8%A6%8B%E8%80%85%E5%88%97%E8%A1%A8" title="中华人民共和国持不同政见者列表">中华人民共和国持不同政见者列表</a>,俺很好奇为毛<a href="http://zh.wikipedia.org/wiki/%E9%98%B2%E7%81%AB%E9%95%B7%E5%9F%8E" title="GFW">GFW</a>没有封锁这个列表,兴许是<a href="https://zh.wikipedia.org/wiki/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E8%A2%AB%E5%B0%81%E9%94%81%E7%BD%91%E7%AB%99%E5%88%97%E8%A1%A8" title="被中华人民共和国封锁的网站列表">工作</a>太忙,搞忘了吧。</p> <h2 id="pgp">PGP的出现</h2> <blockquote> <p><em><a href="http://zh.wikipedia.org/wiki/PGP" title="PGP">PGP</a>是一套用于消息加密、验证的应用程序,其加密/验证机制采用名为IDEA算法的散列算法。PGP及其同类产品均遵守OpenPGP数据加解密标准。</em></p> </blockquote> <p>但是PGP的普及并非一帆风顺,PGP的主要开发者Philip R. Zimmermann,在1991年的时候将源码放到了互联网上。由于美国在当时对于加解密算法和软件的出口有严格的<a href="http://zh.wikipedia.org/wiki/%E5%AF%86%E7%A2%BC%E5%AD%B8#.E8.88.87.E5.AF.86.E7.A2.BC.E5.AD.B8.E6.9C.89.E9.97.9C.E7.9A.84.E6.B3.95.E5.BE.8B.E8.AD.B0.E9.A1.8C" title="与密码学有关的法律议题">限制</a>,Zimmermann被FBI侦讯达数年。不过,美国是保护个人著作的。于是,Zimmermann在志愿者的帮助下,将PGP的源码被出版为书,销往欧洲,由于<strong>合法</strong>,所以才有了今天的普及。</p> <p>而由于PGP是商业软件,<a href="https://www.gnupg.org/" title="GnuPG">GnuPG</a>是遵循OpenPGP数据加解密标准的自由软件实现,中文译为<strong>GNU隐私卫士</strong>,卫士之名当之无愧,不像某些公司,阿猫阿狗都敢叫<em>卫士</em>。</p> <h2 id="_2">对称加密和非对称加密</h2> <ul> <li> <p><a href="http://zh.wikipedia.org/wiki/%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86" title="对称加密">对称加密</a> 简单的说,加密和解密时使用相同的密钥即对称加密,比如我们日常使用的压缩软件加密使用的就是对称加密。</p> </li> <li> <p><a href="http://zh.wikipedia.org/wiki/%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86" title="非对称加密">非对称加密</a> 采用这种方法,首先需要生成一对密钥。公开发布出去的称为公钥,用户自己保密的称为私钥。公钥用来加密,私钥用来解密。</p> </li> </ul> <h2 id="rsa">RSA算法</h2> <p><a href="http://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95" title="RSA加密算法">RSA</a>加密算法是常用的非对称加密算法,一般认为RSA是1977年由在MIT工作的Ron Rivest、Adi Shamir和Leonard Adleman一起提出的,其实早在1973年,在英国政府通讯总部工作的数学家Clifford Cocks在一个内部文件中提出了一个相同的算法,但他的发现被列入机密,一直到1997年才被发表。</p> <h3 id="rsa_1">RSA算法的可靠性</h3> <p>要知道,没有绝对的安全,但是要破解RSA需要相当长的时间或是很大的代价,就可以认为它是安全的。</p> <ul> <li> <p>密钥长度是256位,个人电脑几小时就能分解其因子。</p> </li> <li> <p>1999年,数百台电脑合作分解了512位长的密钥。</p> </li> <li> <p>1994年Peter Shor)证明一台量子计算机可以在多项式时间内进行因数分解。</p> </li> </ul> <blockquote> <p><em>对极大整数做因数分解的难度决定了RSA算法的可靠性。</em> <em>今天只有短的RSA钥匙才可能被强力方式解破。到2013年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。</em></p> </blockquote> <p>因此,未来出现了量子计算机,或者找到了一种有效分解大整数的算法,RSA就被看作是不可靠的。 看到这,你应该明白,一定要用4096位长的密钥。</p> <h1 id="gnupg">使用GnuPG</h1> <h2 id="gnupg_1">安装GnuPG</h2> <ul> <li> <p>Linux用户直接使用包管理器安装,也可安装GUI前端<a href="http://www.kde.org/applications/utilities/kgpg/" title="KGpg">KGpg</a>。</p> </li> <li> <p>OS X用户有<a href="https://gpgtools.org/" title="GPGTools">GPGTools</a>项目可以使用GnuPG。</p> </li> <li> <p>Windows用户可以在<a href="http://www.gpg4win.org/" title="Gpg4win">Gpg4win</a>项目找到安装程序。</p> </li> </ul> <h2 id="_3">生成钥匙对</h2> <pre><code class="bash">$ gpg --gen-key </code></pre>

<p>接着会出现算法选择的问题:</p> <pre><code class="bash">gpg (GnuPG) 1.0.7; Copyright (C) 2002 Free Software Foundation, Inc. This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See the file COPYING for details.

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) Your selection? </code></pre>

<p>默认的是RSA,既支持加密也支持签名,输入1并回车。接着选择密钥长度:</p> <pre><code class="bash">RSA keypair will have 1024 bits. RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048)2048 </code></pre>

<p>默认的长度是2048位,直接回车即可。不过俺强烈建议使用4096位,输入4096并回车,接下来选择钥匙有效期限:</p> <pre><code class="bash">Please specify how long the key should be valid. 0 = key does not expire &lt;n&gt; = key expires in n days &lt;n&gt;w = key expires in n weeks &lt;n&gt;m = key expires in n months &lt;n&gt;y = key expires in n years Key is valid for? (0)0 Key does not expire at all Is this correct (y/n)? y </code></pre>

<p>默认永久有效,建议输入一个有效期限并回车,120表示120天,24w表示24个星期,6m表示6个月,1y表示1年。 我用的默认永久有效,直接回车。问你是否确定,输入y并回车。</p> <p>接着填写个人信息:</p> <pre><code class="bash">GnuPG needs to construct a user ID to identify your key.

Real name: ibrother Email address: ibrother.linux@gmail.com Comment: ibrother in github You selected this USER-ID: "ibrother (ibrother in github) <ibrother.linux@gmail.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O </code></pre>

<p>这3行个人信息将用于产生钥匙的uid 第1行建议填写网名,比如俺常用的网名是ibrother。 第2行填写你的email地址,比如俺的邮箱<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#105;&#98;&#114;&#111;&#116;&#104;&#101;&#114;&#46;&#108;&#105;&#110;&#117;&#120;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">&#105;&#98;&#114;&#111;&#116;&#104;&#101;&#114;&#46;&#108;&#105;&#110;&#117;&#120;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;</a> 第3行是备注,用于进一步标明身份。</p> <p>接下来,输入密码用于保护私钥,程序就会开始生成钥匙对,过程可能几秒钟到几分钟。此时,动动鼠标让电脑工作起来有助于产生足够的随机数。</p> <pre><code class="bash">You need a Passphrase to protect your secret key.

Enter passphrase: </code></pre>

<p>一旦生成钥匙对,强烈建议立即生成注销证书</p> <p>首先查看一下公钥ID</p> <pre><code class="bash">$ gpg --list-keys /home/ibrother/.gnupg/pubring.gpg --------------------------------- pub 2048R/A0A2A2F8 2014-07-09 uid [ultimate] ibrother (ibrother in github) &lt;ibrother.linux@gmail.com&gt; sub 2048R/4AAB15B9 2014-07-09 </code></pre>

<h2 id="_4">生成注销证书</h2> <pre><code class="bash">gpg --output revoke.asc --gen-revoke A0A2A2F8

sec 2048R/A0A2A2F8 2014-07-09 ibrother (ibrother in github) <ibrother.linux@gmail.com>

Create a revocation certificate for this key? y Please select the reason for the revocation: 0 = No reason specified 1 = Key has been compromised 2 = Key is superseded 3 = Key is no longer used Q = Cancel (Probably you want to select 1 here) Your decision? 1 Enter an optional description; end it with an empty line: > Someone cracked me and got my key and passphrase > Reason for revocation: Key has been compromised Someone cracked me and got my key and passphrase Is this okay? y

You need a passphrase to unlock the secret key for user: "ibrother (ibrother in github) <ibrother.linux@gmail.com>" 2048-bit RSA key, ID A0A2A2F8, created 2014-07-09

ASCII armored output forced. Revocation certificate created.

Please move it to a medium which you can hide away; if Mallory gets access to this certificate he can use it to make your key unusable. It is smart to print this certificate and store it away, just in case your media become unreadable. But have some caution: The print system of your machine might store the data and make it available to others! </code></pre>

<p>注销证书已经生成,请妥善保管。如果不小心被人盗取了密码,这是你注销公钥的唯一凭证。</p> <h2 id="_5">发布公钥</h2> <p>由于是公钥加密,我们必须将公钥发布出去,有以下两种方法:</p> <h3 id="_6">导出公钥</h3> <pre><code class="bash">$ gpg -a --output key.public --export UID </code></pre>

<p>把UID替换成你的名字或email地址。会在当前工作目录得到key.public文件,使用以下命令查看内容:</p> <pre><code class="bash">$ cat key.public </code></pre>

<p>内容类似如下:</p> <pre><code class="bash">-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 ....... -----END PGP PUBLIC KEY BLOCK----- </code></pre>

<p>这样你就可以把公钥放在博客上,或者email给你的小伙伴。另一种方法是将公钥发送至公钥服务器:</p> <h3 id="_7">把公钥发布到公钥服务器</h3> <pre><code class="bash">$ gpg --keyserver keys.gnupg.net --send-key ID </code></pre>

<p>只需要将ID替换成你的公钥ID。</p> <p>以上说的是发布你的公钥,这样小伙伴就可以发送加密的文件或邮件给你,那么如何发送加密文件或邮件给小伙伴呢?这就需要获取小伙伴的公钥。</p> <h2 id="_8">导入公钥</h2> <pre><code class="bash">$ gpg --keyserver keys.gnupg.net -recv-key 0xA0A2A2F8 </code></pre>

<p>0xA0A2A2F8是俺的公钥id,替换成你的小伙伴的公钥id</p> <p>或者导入公钥文件</p> <pre><code class="bash">$ gpg --import key.public </code></pre>

<p>由于公钥加密的特点,公钥的发布过程,和获取公钥的过程必须保证可靠性,因此有了指纹验证:</p> <h2 id="_9">验证指纹并签收公钥</h2> <pre><code class="bash">$ gpg --fingerprint </code></pre>

<p>输出应该包含如下所示:</p> <blockquote> <p>pub 2048R/A0A2A2F8 2014-07-09 Key fingerprint = DE91 71DC AE38 DE8E AB5A C423 3E6A 8CC1 A0A2 A2F8 uid [ultimate] ibrother (ibrother in github) <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#105;&#98;&#114;&#111;&#116;&#104;&#101;&#114;&#46;&#108;&#105;&#110;&#117;&#120;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">&#105;&#98;&#114;&#111;&#116;&#104;&#101;&#114;&#46;&#108;&#105;&#110;&#117;&#120;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;</a> sub 2048R/4AAB15B9 2014-07-09</p> </blockquote> <p>其中“DE91 71DC AE38 DE8E AB5A C423 3E6A 8CC1 A0A2 A2F8”就是这个公钥的指纹,和小伙伴核对确认无误后就可以签收了:</p> <pre><code class="bash">$ gpg --sign-key ibrother </code></pre>

<h2 id="_10">加密文件</h2> <pre><code class="bash">$ gpg -a --output message-ciper.txt -r ibrother -e message.txt </code></pre>

<p>参数说明:</p> <ul> <li>-a输出文本格式</li> <li>--output指定输出文件名</li> <li>-r知道接收者的公钥uid</li> <li>-e表示执行加密操作</li> </ul> <p>如果加密二进制文件不需要-a参数</p> <h2 id="_11">解密文件</h2> <pre><code class="bash">$ gpg --output message-plain.txt -d message-ciper.txt </code></pre>

<p>参数说明:</p> <ul> <li>--output指定解密后的文件名</li> <li>-d表示执行解密操作</li> </ul> <h2 id="_12">签名一个文件</h2> <h3 id="_13">独立签名文件签名方式</h3> <pre><code class="bash">$ gpg -a -b message.txt </code></pre>

<p>独立签名方式是原文件和签名文件分开,可以用如下命令验证签名:</p> <pre><code class="bash">$ gpg --verify message.txt.asc </code></pre>

<p>输出一定要有“Good signature”字样,就说明验证成功。</p> <h3 id="clear">clear签名方式</h3> <pre><code class="bash">$ gpg -a --clearsign message.txt </code></pre>

<p>使用如下命令提取原始信息:</p> <pre><code class="bash">$ gpg --output message-original.txt -d message.txt.asc </code></pre>

<h1 id="gnupgmutt">GnuPG和mutt的整合</h1> <p>关于mutt的初步配置,建议看俺之前的<a href="http://ibrother.me/2014/07/07/Use-email-with-mutt/" title="使用mutt作为email客户端">博文</a></p> <p>一旦mutt安装好后,在/usr/share/doc/mutt-1.5.22-r3/samples/目录下可以找到<code>gpg.rc.bz2</code>文件</p> <pre><code class="bash">$ bzcat /usr/share/doc/mutt-1.5.22-r3/samples/gpg.rc.bz2 &gt;&gt; .mutt/gpg.rc $ echo echo &quot;source ~/.mutt/gpg.rc&quot; &gt;&gt; .muttrc </code></pre>

<p>然后编辑<code>~/.mutt/gpg.rc</code>,编辑或者加入以下几行</p> <pre><code class="bash">set pgp_good_sign=&quot;^\\[GNUPG:\\] GOODSIG&quot;

set pgp_sign_as = 0xA0A2A2F8 set pgp_timeout = 3600 set crypt_autosign = yes set crypt_replyencrypt = yes </code></pre>

<p>将0xA0A2A2F8改为你自己的公钥id。这样使用mutt发送邮件默认使用签名。</p> <p>在mutt的发信界面可以选择其他选项:</p> <p><img alt="" src="http://ibrother.qiniudn.com/mailsend.png" title="发信界面" /></p> <p>输入P</p> <p><img alt="" src="http://ibrother.qiniudn.com/muttgpg.png" title="gpg选项" /></p> <p>e表示只加密,s表示签名,b表示既加密又签名,c表示不进行加密和签名</p> <p>收信界面,有s的即标明签名邮件</p> <p><img alt="" src="http://ibrother.qiniudn.com/signmail.png" title="收信界面" /></p> <p>如果有公钥的话,查看邮件,mutt会自动验证签名,并给出提示信息:</p> <p><img alt="" src="http://ibrother.qiniudn.com/goodsign.png" title="验证成功" /></p> <h1 id="_14">其他邮件客户端支持</h1> <ul> <li> <p>Linux用户可以使用Thunderbird,KDE桌面用户建议使用<a href="http://www.kde.org/applications/internet/kmail/" title="kmail">Kmail</a>,Kmail对Gmail有更好的支持。</p> </li> <li> <p>OS X自家的Mail就可以支持gpg邮件加密</p> </li> <li> <p>Windows用户推荐<a href="https://www.mozilla.org/zh-CN/thunderbird/" title="Thunderbird">Thunderbird</a></p> </li> </ul> <h1 id="_15">参考网站</h1> <ol> <li> <p><a href="http://archboy.org/2013/05/15/gnupg-pgp-encrypt-decrypt-file-and-digital-signing-easy-tutorial/" title="使用 GnuPG 实现文件加密和数字签名——PGP 30分钟简明教程(2)">使用 GnuPG 实现文件加密和数字签名——PGP 30分钟简明教程(2)|ArchBoy</a></p> </li> <li> <p><a href="http://wiki.gentoo.org/wiki/GnuPG" title="GnuPG --Gentoo Wiki">GnuPG|Gentoo Wiki</a></p> </li> <li> <p><a href="https://wiki.archlinux.org/index.php/GnuPG" title="GnuPG --Arch Wiki">GnuPG|Arch Wiki</a></p> </li> <li> <p><a href="http://zh.wikipedia.org/wiki/PGP" title="PGP --维基百科">PGP|维基百科</a></p> </li> <li> <p><a href="http://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95http://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95" title="RSA加密算法 --维基百科">RSA加密算法|维基百科</a></p> </li> <li> <p><a href="http://dev.mutt.org/trac/wiki/MuttGuide/UseGPG" title="MuttGuide/UseGPG --Mutt">MuttGuide/UseGPG</a></p> </li> <li> <p><a href="https://ibrother.me/2014/07/29/encrypt-with-GnuPG/" title="使用GnuPG加密和签名">本文地址</a></p> </li> </ol>

转载于:https://my.oschina.net/ibrother/blog/296928

好的,下面是使用 Pythongnupg 模块对邮件进行加密、解密、签名、验证等一系列操作的详细说明: 1. 安装 GnuPG 软件和 gnupg 模块:在使用 gnupg 模块之前,需要先安装 GnuPG 软件并安装 gnupg 模块。在 Ubuntu 上,可以使用以下命令安装: ``` sudo apt-get install gnupg pip install python-gnupg ``` 2. 导入 gnupg 和 smtplib 模块: ``` import gnupg import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication from email.utils import COMMASPACE from email import encoders ``` 3. 初始化 GPG 对象: ``` gpg = gnupg.GPG() ``` 4. 生成密钥对: ``` input_data = gpg.gen_key_input( name_real='Real Name', name_email='email@example.com', passphrase='passphrase' ) key = gpg.gen_key(input_data) ``` 5. 创建邮件: ``` from_addr = 'from@example.com' to_addr = 'to@example.com' subject = 'Test Email' body = 'Hello, world!' attachment_path = '/path/to/attachment' msg = MIMEMultipart() msg['From'] = from_addr msg['To'] = to_addr msg['Subject'] = subject msg.attach(MIMEText(body)) with open(attachment_path, 'rb') as f: part = MIMEApplication( f.read(), Name='attachment.txt' ) part['Content-Disposition'] = f'attachment; filename="{part["Name"]}"' msg.attach(part) ``` 6. 加密邮件: ``` encrypted_data = gpg.encrypt(str(msg), 'recipient@example.com') msg_encrypted = MIMEMultipart() msg_encrypted['From'] = from_addr msg_encrypted['To'] = to_addr msg_encrypted['Subject'] = subject msg_encrypted.attach(MIMEText(str(encrypted_data))) ``` 7. 发送加密邮件: ``` smtp_host = 'smtp.gmail.com' smtp_port = 587 smtp_username = 'username' smtp_password = 'password' smtp_conn = smtplib.SMTP(smtp_host, smtp_port) smtp_conn.starttls() smtp_conn.login(smtp_username, smtp_password) smtp_conn.sendmail(from_addr, to_addr, str(msg_encrypted)) smtp_conn.quit() ``` 8. 接收加密邮件并解密: ``` mail_server = 'imap.gmail.com' mail_port = 993 mail_username = 'username' mail_password = 'password' mail_conn = imaplib.IMAP4_SSL(mail_server, mail_port) mail_conn.login(mail_username, mail_password) mail_conn.select('INBOX') _, data = mail_conn.search(None, 'FROM', 'sender@example.com') for num in data[0].split(): _, msg_data = mail_conn.fetch(num, '(RFC822)') msg = email.message_from_bytes(msg_data[0][1]) if 'encrypted.asc' in msg.get_payload()[0].get_filename(): encrypted_data = msg.get_payload()[0].get_payload() decrypted_data = gpg.decrypt(str(encrypted_data), passphrase='passphrase') decrypted_msg = email.message_from_string(str(decrypted_data)) print(decrypted_msg) ``` 9. 签名邮件: ``` signed_data = gpg.sign(str(msg), keyid=key.fingerprint, passphrase='passphrase') msg_signed = MIMEMultipart() msg_signed['From'] = from_addr msg_signed['To'] = to_addr msg_signed['Subject'] = subject msg_signed.attach(MIMEText(str(signed_data))) ``` 10. 发送签名邮件: ``` smtp_host = 'smtp.gmail.com' smtp_port = 587 smtp_username = 'username' smtp_password = 'password' smtp_conn = smtplib.SMTP(smtp_host, smtp_port) smtp_conn.starttls() smtp_conn.login(smtp_username, smtp_password) smtp_conn.sendmail(from_addr, to_addr, str(msg_signed)) smtp_conn.quit() ``` 11. 接收签名邮件并验证: ``` mail_server = 'imap.gmail.com' mail_port = 993 mail_username = 'username' mail_password = 'password' mail_conn = imaplib.IMAP4_SSL(mail_server, mail_port) mail_conn.login(mail_username, mail_password) mail_conn.select('INBOX') _, data = mail_conn.search(None, 'FROM', 'sender@example.com') for num in data[0].split(): _, msg_data = mail_conn.fetch(num, '(RFC822)') msg = email.message_from_bytes(msg_data[0][1]) if 'signature.asc' in msg.get_payload()[0].get_filename(): signed_data = msg.get_payload()[0].get_payload() verified_data = gpg.verify(str(signed_data)) print(verified_data) ``` 以上就是使用 Pythongnupg 模块对邮件进行加密、解密、签名、验证等一系列操作的详细说明。希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值