使用gpg4win利用密码学技术签名加密数据
        人们总有各种秘密不希望被他人知道或者乱改,或希望仅仅与指定的人分享秘密。如今,利用自由开源软件,我们可以确保被数字签名的数据被篡改后可以立即获知、确认数据真正是来自自己所认为的那个人,同时,可以确保被加密的数据,在传输的过程中可以放心不被窃密。


        本帖子将展示开源软件GnuPG在Windows环境下的发行版gpg4win的使用。以及采用特定的方法来使用的理由。


        第一楼,简单展示鼠标右键菜单栏解密并验证签名,还有简单的加密的流程。


        第二楼,简单说明现行GnuPG的稳定版中所支持的各种算法。


        第三楼,简单讲述Windows 7环境下安装gpg4win的过程。


        第四楼,简单举例使用Kleopatra、GNU Privacy Assistant(GPA)、以及命令行工具下生成RSA公私密钥对的过程。


        本贴仅进行技术探讨。




        GnuPG,或被简称为gpg,源自一个名叫Pretty Good Privacy(PGP)的软件。而后,PGP公司开发了名为OpenPGP的软件,PGP类软件现今均遵循OpenPGP标准(RFC 4880)。然而,由于各种商业原因,如今OpenPGP几经易手,却不再免费,也没有了后续的开发和改进。好在自由软件社区开发了自由开源软件版本,也就是今天的GnuPG,而GnuPG仍然遵循OpenPGP的标准。


        使用GnuPG,我们可以通过密码学技术实现对数据的加解密、对数据的完整性和发送来源的真实性进行准确的验证。


        首先是解密并且验证签名的流程,实际上非常的简单,利用邮件菜单栏,我们可以轻而易举的点几下鼠标就可以,如图:


这是一个经过签名并且加密的文件,使用记事本打开,我们可以看到内容完全是无法看懂的密文
00.00解密并验证签名00.PNG




收件人希望解密内容,只需要对着文件点下鼠标右键,选取图中红色箭头所示,解密并校验的选项呼叫出软件的解密界面
00.00解密并验证签名01.PNG




在解密界面中确认文件的路径,并点“继续”
00.00解密并验证签名02.PNG




由于涉及解密操作,收件人需要输入自己的私钥的解锁口令
00.00解密并验证签名03.PNG




至此,软件会显示解密以及验证数字签名的结果
00.00解密并验证签名01.PNG




        如上图,软件的解密以及验证数字签名的结果显示,被解密的原文确确实实发送自密钥ID为58C2C554(生成密钥时随机生成),电子邮箱地址为test01@kechuang.org这个人,数据并无被篡改或加密自他人。(注1:该电子邮箱地址为虚构,本贴借用作为示范。)(注2:验证密钥的ID以及邮箱地址的工作需要在使用之前预先通过其他手段确认,如两人面对面确认。)

        虽然图片尺寸较大令帖子篇幅看上去非常长,实际上在Windows环境下,使用鼠标右键菜单解密并且验证签名的过程也就几秒钟而已,当然,时间受数据尺寸影响。


        接下来是签名加密的过程,签名加密的过程稍微复杂些,由于涉及到选择收件人的公钥、选择自己用于签名的私钥。如图:


这里采用虚构的隐私内容用于演示加密,请不要在意内容的明文。[s::lol]
00.01签名加密文件 (1).PNG



加密的流程同样简单,使用邮件菜单的“签名并加密”选项
00.01签名加密文件 (2).png



在被呼叫出的加密界面中,选择“签名并加密”的选项,根据需要,可以将密文完全转换成可以显示的文字,则把“文字输出(ASCII)”的选项勾上,并点下一步
00.01签名加密文件 (3).PNG



至此,选择收件人的公钥,图中的公私密钥列表仅有几个,假如随着使用,联系人的公钥列表越来越多,可以使用搜索功能查找收件人姓名对应的公钥。
00.01签名加密文件 (4).PNG



添加收件人的公钥到接收人列表后,假如没有你自己在内,软件会出现这样的提示:你自己没在收件人列表里,加密的数据连你自己也无法解密,确认要继续?
00.01签名加密文件 (5).PNG



在确认了收件人的公钥名单后,软件会询问你希望使用哪一个密钥来对数据进行签名,因为软件可以根据需要保存无数个私钥,使用者可以面对不同的人群使用不同的密钥。
00.01签名加密文件 (6).PNG



由于涉及到签名的操作,在这里软件会要求你输入自己的私钥的解锁口令来确认确实是你本人。
00.01签名加密文件 (7).PNG



操作完成后,软件会给出成功的提示
00.01签名加密文件 (8).PNG



如今,在相同的路径下,会出现一个新的文件,由于刚才选择了使用文字输出的模式,因此后缀名会是asc
00.01签名加密文件 (9).png



使用文本编辑器打开asc文件,可以看出,数据已经被加密成了人眼看不懂的内容
00.01签名加密文件 (10).PNG



        现在,只要使用任何手段将密文发送给收件人,无论发送的路径是否安全,只要收件人能收到,都不会有在传输过程中泄密、被篡改而不被察觉的威胁。


        实际上,使用鼠标右键菜单调出的,只是gpg4win这个软件所包含的一个叫Kleopatra的图形界面。而gpg4win这个软件包,还包含了其他的类似功能的图形界面,比如GNU Privacy Assistant(简称GPA)。使用GPA对数据进行加解密的操作实际上非常类似,就是过程繁琐些,如图:


GPA的界面分为几个部分,这里是密钥管理器的界面,上方快捷按钮区可以调出文件管理器界面:
00.02.GPA签名加密文件01.png



在文件管理器中,打开所需要处理的文件,无论是加密、解密、签名、验证签名,都从把需要处理的文件导入到文件管理器界面开始:
00.02.GPA签名加密文件02.png



找到所需要加密的文件:
00.02.GPA签名加密文件03.png



将需要加密的文件导入文件管理器后,点击上方快捷按钮区的加密按钮(签名加密也是)
00.02.GPA签名加密文件04.png



在这里,和Kleopatra使用的流程类似,选择收件人的公钥,由于需要签名加密为纯文本密文,因此将“签名”和“Armor”勾上(别问我为啥叫Armor,我也不知道)
00.02.GPA签名加密文件05.png



选择需要使用的签名私钥(这样收件人可以验证是这个私钥签发的数据)
00.02.GPA签名加密文件06.png



点击下一步,至此数据已经处理完毕。实际上,这里演示的加密的密文就是本贴最开始所演示的解密的密文的来源。
00.02.GPA签名加密文件07.png




        历史上,GnuPG本身是一个命令行界面的程序,gpg4win并没有彻底把他改头换面抛弃命令行界面,而许许多多的高级操作,往往通过命令行界面完成。这里仅仅展示加密的过程,非常简单,切换要所需加密的明文的文件的路径后敲命令就行。由于上面连续两次演示了对文件进行加密,在此演示一下对文字进行签名加密的过程,无论是图形界面环境还是命令行界面环境,GPG不仅支持对文件进行加密,还支持对文字的直接加密。这里需要对Windows系统的一些偏僻的东西的了解。不过请放心,在下会适当讲解。


这里在下首先打开命令行界面,使用Windows系统的“运行”功能打开自带的cmd.exe程序:
00.03.命令行界面签名加密00.PNG



上图中点击确定后,就可以来到命令行的界面,命令行界面中,GnuPG的名称是gpg2,意为GnuPG的2.0版,
00.03.命令行界面签名加密01.PNG




和上面的过程一样,指定收件人和自己用于签名的密钥,但在命令行界面中,所有的密钥均采用他们的具有唯一性的标识所表示——密钥的ID。在输入需要加密的文字前,先使用一行命令说清楚一切,其中-r参数后跟的是收件人的密钥的ID,-u参数后跟的是自己用于签名用的密钥的ID,后面的-vase中,v表示详细的信息;a表示使用文字输出模式,在命令行界面中假如不使用文字输出模式选项,会得到一大串无法轻易复制粘贴的乱码,实际上是十六进制数;s表示签名;e表示加密:
00.03.命令行界面签名加密02.PNG




和命令行界面一样,由于涉及签名的操作,因此,程序会询问签名用的私钥的解锁口令。输入口令后,程序会等待您输入需要签名加密的密文(实际上光标会闪动,无奈在下几次截图都截不到光标)
00.03.命令行界面签名加密03.PNG




此时,就可以在这个命令行界面中输入需要加密的文字了,图中内容纯属虚构,仅用于演示目的:
00.03.命令行界面签名加密04.PNG




在完成文字的输入后,输入EOF符号即可(Windows下的EOF符号为Ctrl+Z键),程序会开始将明文进行加密并输出:
00.03.命令行界面签名加密05.PNG




此时,将界面中的密文用鼠标全选后复制出来,就可以发送给收件人了。而收件人在收到文字后需要解密并验证签名时,操作比签名加密简单的多,只需要复制所有的密文,然后在命令行界面中输入gpg2然后回车,再粘贴所有部分的密文,再输入EOF符号即可,程序会要求输入解密用的私钥的口令以完成解密。如下图,签名已经验证通过(见Good signature字样)。(注:再次声明,本演示内容无论是邮件地址还是姓名还是消息内容均属虚构)
00.03.命令行界面签名加密06.PNG



        看到这里,或许您会认为GPG仅仅是一个保密工具,实际上并不仅仅是这样。加密和签名是两个分开的功能,使用者可以仅仅加密,或仅仅签名。而仅仅签名的使用方法,在自由开源软件社区中作为验证各种软件包的完整性和真实性,正被广泛地使用。对文件进行签名,可以生成一个分离于文件本身的独立签名文件;对文字内容进行签名,可以生成将文字包含在签名里的明文签名。如下图,


这里在下使用演示用密钥给一个软件安装包进行签名,往后假如由于各种原因如磁盘坏道导致数据部分丢失,签名将无法验证通过。而下图中显示了签名和验证签名的命令行界面的过程。其中,参数b为分离的签名。
00.04.文件签名和验证.PNG




以下是对纯文字进行签名的过程
00.05.文字签名和验证01.PNG




可以看出,签名内部带有文字的明文内容,直接使用gpg2并回车的命令后粘贴完整的签名并跟随EOF符号后,可以看出签名已经获得通过
00.05.文字签名和验证02.PNG


假如明文签名中无论是签名内容还是文字内容本身任意一项受到了改动,签名都不会验证通过,比如改改金额什么的……

[修改于 4 年前 - 2015-06-17 16:38:35]

来自 科创茶话
 
2015-6-17 06:30:44
熊猫阿Bo(作者)
1楼
占楼待编辑。

GnuPG v2.0.27版之算法介绍以及公私密钥技术介绍部分
折叠评论
加载评论中,请稍候...
折叠评论
熊猫阿Bo(作者)
2楼
占楼待编辑。

gpg4win在Windows 7中安装过程图文介绍
折叠评论
加载评论中,请稍候...
折叠评论
熊猫阿Bo(作者)
3楼
占楼待编辑。

gpg4win各界面之RSA密钥对生成流程图文介绍
折叠评论
加载评论中,请稍候...
折叠评论
4楼
额,这样加密解密倒置,强烈的意识流风格,不太好吧[s:30]我只想先知道使用gpg加密的概念和要点。

[修改于 4 年前 - 2015-06-17 11:05:38]

折叠评论
加载评论中,请稍候...
折叠评论
5楼
有图形界面应该优先使用图形界面。。。文本界面方便编写脚本

[修改于 4 年前 - 2015-06-17 11:06:12]

折叠评论
加载评论中,请稍候...
折叠评论
熊猫阿Bo(作者)
6楼
引用 acmilan:
额,这样加密解密倒置,强烈的意识流风格,不太好吧我只想先知道使用gpg加密的概念和要点。
假如我先从密码学概念开始讲的话,这个帖子会有人看?
折叠评论
加载评论中,请稍候...
折叠评论
7楼
引用 熊猫阿Bo:
假如我先从密码学概念开始讲的话,这个帖子会有人看?
不是从密码学基础概念讲,而是把gpg软件中的概念和流程讲清楚。
软件概念和基础概念是两回事。
你的意思是先漫无目的地讲基础概念,然后突然切换到漫无目的地流水账,这也是一种意识流。
折叠评论
加载评论中,请稍候...
折叠评论
8楼
基础概念:懂得该软件的原理所需的基础知识
软件概念:使用该软件中需要碰到的抽象事物
软件流程:基于软件概念的大致操作流程
软件教程:使用该软件的上机操作实例

对于密码学专业的来说,懂得软件中的抽象事物似乎不是多难,但是对于外行来讲,看帖子无非是这个感觉:
“斜解立方,得两壍堵。斜解壍堵,其一为阳马,一为鳖臑。阳马居二,鳖臑居一,不易之率也。合两鳖臑三而一,验之以棊,其形露矣。”
折叠评论
加载评论中,请稍候...
折叠评论
熊猫阿Bo(作者)
9楼
引用 acmilan:
基础概念:懂得该软件的原理所需的基础知识
软件概念:使用该软件中需要碰到的抽象事物
软件流程:基于软件概念的大致操作流程
软件教程:使用该软件的上机操作实例

您说的非常有道理,要是出书的话这样写非常完美,但还是没多少人看啊。[s::L]

况且,懂的该软件的原理所需的基础知识可不就是从密码学原理开始讲么?



我希望这个帖子的开头能够表达:使用高安全程度的密码学应用软件可以跟点两下鼠标一般简单。尽管某个国外著名的记者因为没装这个东西,差点与其职业生涯辉煌的一页失之交臂。而他不装的理由:这玩意太复杂。
折叠评论
加载评论中,请稍候...
折叠评论
10楼
引用 熊猫阿Bo:
您说的非常有道理,要是出书的话这样写非常完美,但还是没多少人看啊。

况且,懂的该软件的原理所需的基础知识可不就是从密码学原理开始讲么?



我希望这个帖子的开头能够表达:使用高安全程度的密码学应用软件可以跟点两下鼠标一般简单...
没让你从原理开始讲,让你描述一下软件中可能碰到的抽象事物,或者至少做个摘要吧。。。
折叠评论
加载评论中,请稍候...
折叠评论
熊猫阿Bo(作者)
11楼
引用 acmilan:
没让你从原理开始讲,让你描述一下软件中可能碰到的抽象事物,或者至少做个摘要吧。。。
[s::L]好吧,这个帖子的开头确实没写好。不过我想无论怎么写,都会是意识流的。
折叠评论
加载评论中,请稍候...
折叠评论
12楼
这个软件我会用了。
输入密码可以产生个人公钥和个人私钥。个人公钥发给对方加密用,个人私钥自己保留解密用。
你通过ta的个人公钥加密数据并发给ta,ta用自己保留的私钥解开。ta通过你的个人公钥加密数据并发给你,你用自己保留的私钥解开。
而数字签名则是通过私钥加密hash,对方用公钥解开以验证信息的完整性。
是这个意思吗?
折叠评论
加载评论中,请稍候...
折叠评论
熊猫阿Bo(作者)
13楼
引用 acmilan:
这个软件我会用了。
输入密码可以产生个人公钥和个人私钥。个人公钥发给对方加密用,个人私钥自己保留解密用。
你通过ta的个人公钥加密数据并发给ta,ta用自己保留的私钥解开。ta通过你的个人公钥加密数据并发给你,你用自己保留的私钥解开。 ...
实际上,公私密钥并不是从输入的口令来的,口令是用来保护自己的私钥使用的。
折叠评论
加载评论中,请稍候...
折叠评论
14楼
引用 熊猫阿Bo:
实际上,公私密钥并不是从输入的口令来的,口令是用来保护自己的私钥使用的。
嗯。。。那可能是我理解错了。。。自己通过密钥生成器生成的密钥,然后再用密码加密私钥吧。。。我记得在linux中用的时候还有一步输入随机字符串
折叠评论
加载评论中,请稍候...
折叠评论
熊猫阿Bo(作者)
15楼
引用 acmilan:
嗯。。。那可能是我理解错了。。。自己通过密钥生成器生成的密钥,然后再用密码加密私钥吧。。。我记得在linux中用的时候还有一步输入随机字符串
用脸滚键盘(输入随机字符串)、创造巨大的互联网流量、大量的磁盘IO操作、鼠标到处乱飞等方法都是用来给随机数发生器提供熵的方法。具体情形第二楼和第四楼会作讲解。实际上,我们需要努力使得操作系统的随机数发生器的输出足够随机,否则公私密钥的安全程度会受到影响。详情可搜索网页关键字:“路由器”“同一个”“公钥”“证书”。
折叠评论
加载评论中,请稍候...
折叠评论
2015-07-05 22:33:36
2015-7-5 22:33:36
熊猫阿Bo(作者)
16楼
原理

        在了解了gpg4win(实际上,GnuPG)的简单使用后,我们来看一看它的原理,以及为什么他可以起到保密的作用。有朋友会说,我根本用不到这些密码算法,然而,所有使用网银、登陆某些网站的时候,我们的计算机系统都在使用他们,我们甚至完全没有注意到。不仅仅是本帖子所提到的GnuPG软件,在登陆网银、支付宝、淘宝的登陆页面时,我们会使用到一种叫HTTPS的安全网页协议。而HTTPS协议使用的,实际上是一种叫TLS的密码学应用协议。在国内使用最广的算法,就是大名鼎鼎的RSA算法!当然还有其他的一些算法,我们后文再谈。

        一般来讲,网络安全的基本组成部分之一——保密技术的基础方法,是使用特殊的方法,将对手(或称攻击者)的攻击成本大大提高,使得攻击所需要的时间非常的长,长于秘密所需要保密的期限,来达到我们所需要的保密的目的。而密码技术,现在来讲,是使用数学方法,创造出使用者的成本很小,但是攻击者所需要的攻击成本很大的方法,来达到我们的目的。而对于数字签名技术来说,也是一样,使用相同的方法,使得攻击者的伪造成本非常巨大来确保签名的来源的真实性和有效性,从而保证被签名数据的完整性和来源的真实有效。

        GnuPG软件支持的算法有很多,公私密钥算法有RSA算法、数字签名算法DSA、私钥交换算法Elgamal;对称加密算法有IDEA3DESCAST5BLOWFISHAESTWOFISHCAMELLIA;数据校验哈希算法有MD5SHA1RIPEMD160SHA2;数据压缩算法有ZIPZLIBBZIP2。我们可以在命令行界面下使用软件的帮助命令来得到支持的列表:
01.原理.插图0.PNG



        由于本帖子顶楼的简单使用的例子采用的非对称数据加密、签名的算法都是RSA算法。这里便从RSA开始谈起。根据现有历史资料,RSA算法分别由三位美国麻省理工的科学家Ron
Rivest, Adi Shamir, 还有Leonard
Adleman设计并在1978年公开发布的算法,算法名称来源于三位科学家的姓氏的首字母。它的核心思想为,通过对合数分解的难度(实际上是很大很大的合数)和同余的概念创造一个单向陷门函数从而对数据进行认证加密。对数学很有研究的朋友,请看下面的教科书式的RSA算法小节。
        合数:自然数中,除了质数(又叫素数)之外的数都是合数。
        单向陷门函数:当没有关键的信息时,函数仅可进行单向运算,很难(接近于不可能)进行反方向运算,只有持有关键的信息的人可以轻易地对函数进行反方向运算。
        我们使用单向陷门函数作为认证加密算法时,通常我们需要三个算法:密钥生成算法、加密算法、解密算法。通过密钥生成算法,我们会得到公私密钥对,由公钥和密钥组成。公钥,相当于一把锁,只有对应的私钥作为钥匙才能解开的锁。私钥所有者向自己的朋友发布这个可以随意拷贝无数份的锁。当缺少私钥时,使用这把锁锁住的箱子很难(几乎不可能)打开,只有私钥的所有人可以轻易打开这把锁。而这,就是公私密钥密码的特点。当然,以上仅仅从加密解密的角度去看待公私密钥密码,毕竟用锁来比喻签名非常费解。而通过单向陷门函数,我们可以确认,只有持有私钥的人,才可以创造出对应数据的签名。


教科书式的RSA算法

        RSA算法具体由两个质数pq、这两个质数的乘积N、与N互质的数的个数φ(N)、两个乘积与φ(N)互质的数、密钥生成算法、加密算法、解密算法组成。
        密钥生成算法为:随机寻找两个很大很大的不同的质数,我们将他们俩分别由pq表示。然后随机寻找两个正整数,我们将他们分别用ed来表示。满足ed的条件,是ed的乘积与pq的乘积互质的个数 互质。通过数论知识,我们可以知道,当N=pq时,由于欧拉函数(Euler Totient Function),我们知道与N互质的数的个数是φ(N),其中φ(N)=(p-1)(q-1)。与φ(N)互质的数即是ed的乘积所需要满足的条件。也就是说
01.原理.插图1.PNG


        ed,就是我们所需要生成的RSA算法的公钥和私钥的组成部分。其中,Ne为公钥,Nd为私钥。请注意,自己的私钥千万不可以让第二者知道!
        加密算法:将所需要加密的信息m(须为正整数)e次方,然后求除以N的余数,从而得到密文c。我们可以用一条式子来表示:
01.原理.插图2.PNG



        解密算法:将所需要解密的密文cd次方,然后求除以N的余数,就可以得到明文原文m。我们可以用一条式子来表示:
01.原理.插图3.PNG



        由于cd次方等价于me次方再求d次方,也就是me乘以d次方,解密实际上就是me乘以d次方再除以N的余数。由于我们一开始e和d的定义,再结合数论基本性质,e和d的乘积刚好与(p-1)互质,同时也和(q-1)互质。由于费马小定理,med的乘积次方再除以p的余数刚好是自己m,同时med的乘积次方再除以q的余数刚好也是自己m。另外由于pq都是质数,结合中国剩余定理,我们可以得到me乘以d次方再除以pq的乘积后的余数,刚刚好就是它自己m
01.原理.插图4.PNG



        三位密码学家RSA最初在描述这个算法的时候使用的是费马小定理,而在寻找RSA算法的资料的时候,在下发现了使用欧拉-费马定理描述的方法,非常简单:其中h是非负的整数。
f461c4cbcb3681ae2794f0fc62e2af36.png



        以上就是RSA算法的数学方面的描述。
        通行的表示方法,我们将这些数写作2的指数次方的形式来表示这些数的位数,因为目前我们采用的计算机都使用二进制数进行所有的操作。因此,对于计算机来说,mc都是数字而已。目前在实际应用中,为了大幅度增加攻击者的攻击难度,我们往往需要严格地随机挑选pq。而位数越大,逆向这个单向陷门函数的成本就越高。在顶楼的例子中,test03便是4096位的密钥对。假如您能轻易逆向运算一个pq都是落在22047次方到22048次方范围内的质数所构成的RSA算法,请受我一拜!


真实世界中所使用的RSA算法

        看完了上面的教科书式RSA算法的说明,我想大多数人都会直接将自己想要加密的数据直接求e的指数次方再除以N之后发出去,然而这样的教科书式的RSA算法使用方法是非常非常危险的方法。在许多年前就已经有密码学家针对这种方法提出了一种“中间相遇攻击,可以在比起密钥位数来讲小得多的有限数量的密文传输后推导出密钥来!
        为了规避这种危险,现有的RSA算法都结合对称加密算法、哈希算法来使用。对称加密算法,即加密密钥和解密密钥都是同一个的算法。哈希算法,即将数据本身内容推导出相对应唯一的值的算法。使用RSA算法来保护的秘密不再是消息本身,而是随机生成的数经过哈希算法得到临时会话用密钥。由于经过哈希算法得到一个相对唯一的值,使得RSA算法的明文的空间大大扩展,将中间相遇攻击的难度大幅度增加。而这里的临时会话密钥,用作对称加密算法的密钥。在用作签名的方面也是,不再使用RSA私钥直接对需要传输的数据进行签名,而是使用哈希算法,求得需要传输的数据的相对唯一的值,再使用RSA私钥对这个值进行签名。
        另外,RSA公私密钥对的生成过程中,也有很多严格的讲究,哪怕有一条不遵守的话,都会导致严重的后果。例如,p和q的选择,必须要足够随机,国外有密码学家的论文指出了大量的家用路由器的RSA证书的质数都使用同一个!随机性的不足,会导致相当于同一个密钥被无数人同时使用,造成严重的负面后果!还有就是e的选择,e本身不能为2就不用多说了,e的大小不足的话也会导致明文本身非常容易被攻击者得到。还有其他的一些小讲究请大家自行查找。国际标准的文献很多,例如翻阅最新的RFC文档便可收获良多。
        目前,不仅最新版的GnuPG软件,本楼开头提到的TLS协议的最新的版本也不再使用教科书式的RSA算法来保护数据。而同时依赖公私密钥算法的安全性、对称加密算法的安全性还有哈希算法的安全性来保障验证加密的安全可靠。
        下面,是对现有GnuPG软件在使用RSA公私密钥的情况下对数据进行加密解密的图示:
加密图示:
encrypt.JPG



        结合顶楼的演示可以看到,虽然我们在使用时无非鼠标动动或者按几下键盘而已,但是计算机软件却在进行复杂的操作,为了方便理解,有些步骤图中并没有表现出来:首先使用可靠的方法得到一个随机数,通过哈希算法计算这个随机数得到一个临时会话密钥,也就是图中左上角的那把钥匙。然后使用这把“钥匙”和对称加密算法将我们要传输的明文加密保护起来。接着使用公私密钥算法,利用收件人的公钥将最开始的随机数保护起来。将两个被保护的密文合在一起发给收件人。
解密图示:
decrypt.JPG



        虽然我们使用软件进行解密时同样是动动鼠标或者按几下键盘。但软件首先把整个包裹拆开,先使用私钥解开含有临时会话密钥的部分,得到那个随机数。然后使用同一个哈希算法计算这个随机数,得到真正的唯一的临时会话密钥。接着使用对称密码算法中的解密算法和临时会话密钥,解开真正存着明文的包裹。最后得到被保护着的明文。
        至于认证加密的方面,很遗憾,本熊猫并没有找到签名加密算法的图示,在此只能单纯地使用文字进行描述。实际上,在进行签名加密时,软件会首先使用哈希算法,对需要加密的明文进行计算得到一个相对唯一的值。然后将签名的时间以及其他的一些必要的唯一性信息、刚才的哈希值通过发送者的私钥和RSA的解密算法(是的,RSA的签名算法和解密算法使用的是同一条数学式子,都是求数据的d次方然后求除以N的余数。验证签名的算法和加密算法使用的都是同一条数学式子,都是求数据的e次方然后求除以N的余数。由于发送人和接收人的公私密钥完全不一样,因此不会出现意外地通过对密文和签名结合分析得到私钥的尴尬状况。)得到签名值。最后将签名附在包裹中。
        收件人在收到整个包裹后,他首先经过上面所述的解密流程得到明文。然后使用发件人给他的公钥经过加密算法对签名信息进行运算,得到签名的时间、其他的一些信息以及明文的哈希值。最后使用哈希算法对明文进行计算,比对两个哈希值是否一致,从而验证签名的真实性、被加密的数据的完整性和有效性。
        由于GnuPG软件所支持的其他的公私密钥算法如DSAElgamal算法的结合在安全性的解释上难度比RSA算法大得多。因此,有兴趣的朋友敬请自行了解,在下在将来的日子里有时间再作解释。需要注意的是,与RSA算法能够同时提供加密和签名相比,DSA算法仅仅提供签名的能力,Elgamal仅仅提供密钥交换的能力。DSAElgamal结合起来的公私密钥对在使用时和实际使用RSA算法差不多,首先随机生成一个数后哈希得到临时密钥;然后使用对称加密算法利用这个临时会话密钥加密数据;接着通过Elgamal算法将随机生成的数保护起来,同时对需要加密的数据的明文进行哈希计算并将哈希值和唯一性数据如签名时间等使用DSA算法进行签名;最后将临时会话密钥的密文、需要加密的数据的密文以及签名放在一起发送给收件人。算法原理和解密流程具体不再赘述。




        接下来是关于对称加密算法和哈希算法的简要介绍。由上面的内容我们可以了解到,公私密钥算法、对称加密算法和哈希算法三者的可靠性缺一不可,任何短板都会让我们遭到严重损失。而从公开的文献中我们可以了解到,目前来讲,非常著名的被破解的对称加密算法3DES以及可被碰撞的哈希算法MD5已经不再可靠。因此,在下强烈建议大家不要使用公认不再可靠的算法
        GnuPG支持的对称加密算法中,AES算法(原名Rijndael算法,来自比利时)和TwoFish算法都是美国国家标准与技术研究院的“高级加密标准”竞赛的参选算法,都是块加密算法,后来Rijndael算法赢的竞赛,被称作高级加密标准(英文缩写AES)算法被广为使用;Camellia算法为日本企业联合开发的块加密算法,受欧盟信息社会技术委员会 (Information SocietyTechnologies) 的“欧盟新签名、完整性和加密方案”计划(New European
Schemes for Signatures, Integrity and Encryption,简称NESSIE)以及日本的密码学研究评估委员会 (Cryptography Research and Evaluation Committees,简称CRYPTREC)审定,有与AES算法相一致的安全性的算法;CAST5算法为加拿大密码学家设计的算法,CAST系列中的CAST6曾参加美国的AES算法竞选,但是并没有最后入围最终的5个算法之一,而作为分组密码的CAST5CAST6要弱;IDEA算法(全名International
Data Encryption Algorithm,即国际数据加密算法)为上海交大的来学嘉教授和瑞士苏黎世联邦理工学院的James
Massey教授共同开发的用于替代DES算法的块加密算法;Blowfish算法同样是一个分组密码算法,由TwoFish算法的设计者之一,著名密码学家Bruce
Schneier所设计,然而它已经被TwoFish算法所替代。
        GnuPG支持的哈希校验算法中,SHA224SHA256SHA384SHA512都属于SHA2系列的算法;RIPEMD160算法为RIPEMD家族的算法,由比利时的荷兰语天主教鲁汶大学的密码学家们设计,在2004年八月,有论文称RIPEMD算法存在碰撞攻击(专门构造出来的完全不同与参照数据的奇♂怪的数据经过算法计算能得到和参照数据有同一个哈希值),但并RIPEMD160算法并不受影响。SHA1MD5我想已经不必多解释,山东大学的王小云教授和同事们在分别在2005年和2004年发布关于两者存在碰撞攻击的论文,还不难实现,全世界都不淡定了。在此为王小云教授和同事们说一句,这两算法不是因为他们而不安全了,而是他们的不安全之处被他们发现了。密码学家本身无罪,请不要迁怒于发现问题所在的人们。



AES加密算法

        由于上述对称加密算法较多,在下无法一一解释,因此这里仅举例AES算法说明,有兴趣的朋友敬请自行了解其他的对称加密算法。上面已经说到,AES算法原名Rijndael算法。多年前,由于DES和3DES对于目前的计算机硬件来说太慢了,美国国家标准与技术研究院为了制订新的标准,主办了“高级加密标准”竞赛,广纳设计后一一遴选,结合他们自己的实际需要,最后在2001年公布将Rijndael算法定为AES对称加密分组密码算法。
        同样可以看作由加密算法和解密算法组成。使用加密算法,可以将明文通过密钥加密成密文;使用解密算法,可以将密文通过密钥解密成明文。而分组密码的特点,是将需要加密的明文,分隔成指定大小的一个个分组,然后按照算法的设计,对每一个分组逐一进行加密,而且,分组密码往往有多轮数的设计,也就是分组每被加密一次则被称之为一轮,最后再将加密后的每个分组连接起来。在一些场合,分组密码的特性会带来一些好处,这里略过不谈。而每一个分组密码算法,都会在设计时使用不同的方法对密钥进行一些处理,或将原密钥通过计算生成每一个分组都不同的子密钥,每一种分组密码对密钥的使用都不一样,这里仅谈AES:
        AES算法的核心思想是一个基于代换置换网络构建的算法。而AES算法实际上并不是与Rijndael算法完全相同,因为限制了密钥长度和块长度。而目前AES主要分为3个不同密钥长度和轮数,但三者都是用同一个分组大小(均为128位)。其中AES128的密钥长度为128位,轮数为10轮;AES192的密钥长度为192位,轮数为12轮;AES256的密钥长度为256位,轮数为14轮。AES算法对于密钥的处理,使用Rijndael密钥生成方案来产生在加密过程中使用的密钥,将对应长度的密钥扩展成可以满足每一轮的密钥长度。每一个分组都放入一个4×4的矩阵中。而除了最后一轮外,各轮加密循环均不断地重复四个步骤:AddRoundKey、SubBytes、ShiftRows、MixColumns。其中:
        AddRoundKey:矩阵中的每一个字节都与该次回合密钥(round key)做异或(XOR)运算;每个子密钥由密钥生成方案产生。
        SubBytes:通过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
        ShiftRows:将矩阵中的每个横列进行循环式移位。
        MixColumns:为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。
        注:最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。

        在这里引用一下斯坦福大学的著名密码学家Dan Boneh的一张PPT来说明:
01.原理.插图7.PNG


        图中中间的加号外面再圈一圈的符号,为XOR号。每一个XOR号开始到下一个XOR号之前为一轮。为了计算可逆(因为解密)最后一轮并没有MixColumns的步骤。针对AES算法的攻击,这里举一个相关密钥攻击的例子。在初始密钥并不是随机生成的情况下,各个AES加密的包裹的加密的密钥会存在一定的相关性,在这种情况下,相关密钥攻击非常有效,攻击成本低于穷举攻击的成本。正因为这种攻击的存在,GnuPG采用随机生成的密钥来加密数据,无论是公私密钥加密的情况还是直接使用口令加密的情况。以上,就是AES算法的样子,非常的复杂在下已经晕了。[s::(]实际上,分组密码如今同样已经不再使用教科书式的用法,而是采用各种各样的模式(mode of operation)来进行使用。以最新版本的TLS(目前成标准的为TLS v1.2)为例,认证加密模式GCM应该成为所有HTTPS网站的标配,各网站管理员,请抛弃3DES算法吧!!!

[修改于 4 年前 - 2015-07-06 07:30:50]

折叠评论
加载评论中,请稍候...
折叠评论
17楼
某些弱校验算法本来就是用来校验文件的微小随机跳变的,对于人为造假是没有辨别能力的,比如奇偶校验和CRC算法。
奇偶校验就不说了,跳一个bit可以检测,跳两个bit就检测不到了,硬件用的比较多,软件上不太实用。
微软的原版XP光盘镜像的CRC32就是0xFFFFFFFF,如果不是一定是出错了或被修改了。
上传东西用RAR或7ZIP打包,有CRC32,下载中间出了差错(比如插入了400页面或CMCC登录页面或文件被截断等)基本都可以检测出来。(检测不出来的概率非常小,并不是没有,但是我没碰到过)
MD5和SHA1也同样在检测微小随机跳变中很实用,在网络上应用非常普遍。(检测不出来是不可能的)
至于ed2k链接,本来就包含是hash,因此进行验证很简单,如果迅雷下到最后总是99.9%却有速度,那么肯定下坏了,重下吧。
折叠评论
加载评论中,请稍候...
折叠评论
熊猫阿Bo(作者)
18楼
引用 acmilan:
某些弱校验算法本来就是用来校验文件的微小随机跳变的,对于人为造假是没有辨别能力的,比如奇偶校验和CRC算法。
奇偶校验就不说了,跳一个bit可以检测,跳两个bit就检测不到了,硬件用的比较多,软件上不太实用。
微软的原版XP光盘镜像的C...
不同的校验算法,是为了不同的目的而选择不同的设计思想。当然用起来也不一样,顶楼的例子为SHA256。在本贴接下来的主要内容楼层中,在下将介绍命令行界面下修改默认算法的命令以及采用这些算法作为默认算法的原因。敬请期待。
折叠评论
加载评论中,请稍候...
折叠评论
2015-07-06 04:34:55
熊猫阿Bo(作者)
19楼
安装流程

        本楼将介绍Gpg4win的安装流程。Gpg4win为自由开源软件GnuPG在微软Windows平台下的一个开源实现,由德国联邦信息安全办公室(BSI)将GnuPG软件的32位微软Windows环境下运行的程序与一些图形界面程序结合拼凑在一起的一个自由开源软件包。它遵循Gnu GPL自由开源软件许可证。
Gpg4win包含的软件有:
GnuPG:GnuPG本身
Kleopatra:图形界面的OpenPGP和X.508证书管理器和密码学应用界面。
GPA:全称GNU Privacy Assistant。另一个图形界面的OpenPGP和X.508证书管理器和密码学应用界面。
GpgOL:一个微软Outlook的gpg插件。可以用来简化使用Outlook收发加密邮件的流程。
GpgEX:微软系统窗口插件。主要为鼠标右键菜单。可以用来简化文件加解密和签名认证的流程。本贴顶楼已经演示了GpgEX的简单使用。
Claws Mail:一个支持加解密和签名认证的邮件收发程序。
Gpg4win Compendium:Gpg4win的英文和德文使用文档。


        假如您认为BSI不可信。可以前往GnuPG软件项目官方网站下载最新版的Windows环境下的程序,然而只有命令行界面。本贴内容会囊括命令行界面的操作,但不再赘述安装流程。

        Gpg4win的安装包可以前往官方网站 http://www.gpg4win.org/ 的下载页面下载。下载页面中同样包含了安装包的哈希值以及软件发布者的签名。发布者的公钥的真实性验证需要自行在互联网上搜索其他人对该公钥的可信程度签名。在此在下所见的发布者的公钥指纹为61AC 3F5E E4BE 593C 13D6  8B1E 7CBD 620B EC70 B1B8,但本人截止目前为止并未对此公钥进行可信签名。
        Gpg4win官方网站的下载页中,还提供了一些简化的版本,如:
Gpg4win-Light版:去掉了Kleopatra和Gpg4win的官方文档的版本。
Gpg4win-Vanilla版:只有GnuPG本体的版本,然而GnuPG官方已经提供了这样的版本,为何……?
Gpg4win的源代码:可供对比审查。
每一版都提供了对应的文件校验哈希值和数字签名以供检验。

        在验证了安装包的哈希值之后,我们可以运行此安装程序,一番“下一步”后,我们便会来到软件包的组件选择界面。如图:
02.安装流程.01.PNG



        请根据自己的需要选择所需安装的组件。假如您并不使用微软Outlook,则完全没有必要安装GpgOL。假如您已经有中意的电子邮件收发软件(如Mozilla开发的Thunderbird之类),或完全不使用电子邮件收发软件,那么Claws-Mail也不必勾选安装了。在完成组件选择后,可以继续“下一步”直到安装流程结束。
        安装完成后,我们可以选择使用任意一个图形界面程序运行使用。这里以Kleopatra为例进行截图,如下图:
02.安装流程.02.PNG



        同时还有GPA的截图,请不要在意图中已经导入了的一个公钥,第一次运行GPA时,软件会检查自己是否已经生成了自己的密钥对,假如没有的话(往往第一次运行时都没有)会弹出如图中的对话框询问是否现在马上生成自己的密钥对。见下图:
02.安装流程.03.PNG


        很遗憾目前开源软件社区并没有做出官方认可的汉化版。而一般来讲,官方原始的软件包所没有的内容,都请提防。目前Gpg4winGnuPG软件项目的官方网站的列表里,姑且可以使用。
        关于公私密钥对的生成以及他人的公钥的导入,事涉一些讲究和注意事项,篇幅较长,将在下一部分进行描述。本楼就到这里,谢谢您的观看!
折叠评论
加载评论中,请稍候...
折叠评论
20楼
[paragraph]还是喜欢费纳姆密码,没密钥谁也解不开,爆破更别想,,写的挺好的,给你32个赞
折叠评论
加载评论中,请稍候...
折叠评论
熊猫阿Bo(作者)
21楼
引用 电妖妖:
还是喜欢费纳姆密码,没密钥谁也解不开,爆破更别想,,写的挺好的,给你32个赞
不知道您说的是不是一次一密,往往在使用中,密钥只使用一次就销毁的话实现起来比较困难,因为没有什么经济、有效、方便的方法传递密钥,而且仅仅提供加密,并不提供签名。
折叠评论
加载评论中,请稍候...
折叠评论
2015-07-07 14:45:43
22楼
这还是古典加密啊,密钥猜解很简单啊,只要统计字符频率就行啊
折叠评论
加载评论中,请稍候...
折叠评论
熊猫阿Bo(作者)
23楼
引用 fuwen0202:
这还是古典加密啊,密钥猜解很简单啊,只要统计字符频率就行啊
何来的古典加密?
折叠评论
加载评论中,请稍候...
折叠评论
2015-07-25 17:34:56
2015-7-25 17:34:56
24楼
引用 fuwen0202:
这还是古典加密啊,密钥猜解很简单啊,只要统计字符频率就行啊
连我这外行都看出来这不是“古典加密”[s::lol]
折叠评论
加载评论中,请稍候...
折叠评论
2016-01-25 09:44:45
2016-1-25 09:44:45
熊猫阿Bo(作者)
25楼
[paragraph]







GnuPG的配置



在完成了软件的安装后,我想很多人往往首先做的第一件事是直接生成自己的密钥然后散发公钥并各种加密、签名试玩。这在Gpg4win 2.2.4(GnuPG版本2.0.27)之后问题不是很大,然而更旧的版本上,问题会不小。在看完上面讲述算法的章节,在下建议大家采用安全的算法。然而在生成密钥的过程中,软件就使用了不止一种算法,其中就包括了哈希算法。见图 配置-00(生成密钥过程中主密钥对子密钥进行签名):
配置-00.PNG


可以看出,子密钥在生成之时,对应的主密钥需要对其进行签名以让软件相信这是该主密钥对应的子密钥,相关内容在下将在密钥生成的章节再作介绍。
而在旧版本里,默认的哈希算法是SHA1,对于此算法,山东大学的王小云教授有话说。另外,虽然每个密钥的指纹是唯一的,但是密钥的ID却是指纹的后面一小截,本熊猫在网上碰到过这样的场景,见图 配置-01:
配置-01.jpg


可见两个完全不同的Key,指纹的最后8位是一样的,尽管一个是2048位的RSA密钥,另个是3072位的。为了避免这种状况,实际上GnuPG可以显示长ID,见图 配置-02:
配置-02.PNG


图“配置-02”分为左中右三种不同的配置的图示,左为默认配置,中为长ID,右为长ID的基础上前面加上“0x”字样。


在软件的日常使用过程中可以自己通过命令行界面添加参数的方式选择不同的算法。曾经的默认哈希算法SHA1让无数软件开发者、操作系统发行版发布者放出使用SHA1算法哈希的签名文件,这是不靠谱的,如本论坛上有人介绍的kali Linux,它的ISO镜像文件的下载页上公布的哈希值就是SHA1算法产生的,同时,对哈希值文件的GPG签名采用的……请看图 配置-03:
配置-03.PNG


尴尬……无以言表……
而完成软件安装之初就修改软件配置文件定死自己所希望使用的算法,可让整个使用的体验更加的简便、无痛。





需要修改配置文件,首先需要知道配置文件的位置。出于人性化设计,每一个操作系统用户的配置文件都是分开的。尽管配置文件的路径可以手工修改,其默认路径为:
%APPDATA%\gnupg\gpg.conf
(熊猫注:在微软Windows 7系统中,[百分号]APPDATA[百分号]确实为有效路径,每个用户对应的路径都会不一样)可以使用系统自带的记事本将其打开。刚刚安装完毕并试运行各GUI界面后,该文件里实际上并没有什么内容,如图 配置-04:
配置-04.PNG








接下来,本熊猫将使用自己所常用的配置以文件注释的方式进行说明,在下使用的配置:

###+++--- GPGConf ---+++###
utf8-strings
verbose
keyserver hkp://keys.gnupg.net

# ASCII armored 输出中不显示版本号
no-emit-version

# 显示前面带0x字样的长密钥ID
keyid-format 0xlong

# 显示密钥时连同指纹也一起显示
with-fingerprint

# 显示UID效力
list-options show-uid-validity
verify-options show-uid-validity

# 命令行界面使用UTF-8字符集
charset UTF-8

# 个人选择的优先采用的对称加密算法列表
personal-cipher-preferences AES256 CAMELLIA256

# 个人选择的优先采用的哈希加密算法列表
personal-digest-preferences SHA512 SHA384 SHA256

# 对密钥进行签名时使用的哈希算法
cert-digest-algo SHA512

# 默认优先采用算法列表
default-preference-list  SHA512 SHA384 SHA256 CAMELLIA256 AES256 CAMELLIA192 AES192 CAMELLIA128 AES ZLIB BZIP2 ZIP Uncompressed
###+++--- GPGConf ---+++### 11/25/14 15:42:04 中国标准时间
# GPGConf edited this configuration file.
# It will disable options before this marked block, but it will
# never change anything below these lines.



稍稍解释一下这个配置:
长的keyid我想不必多说;
为了避免图“配置-00”到“配置-03”所出现的尴尬状况,一律采用目前可以使用的最高强度的哈希算法SHA512(实际上SHA2系列算法的强度都相近,使用SHA512纯粹是在下强迫症所致)。
加密的数据一律使用信得过的对称加密算法进行加密,因此无论是个人优选还是默认支持列表,都把心目中信得过的算法从高到低排列配置。
为了方便校对,将密钥签名强制显示,如此每次校验签名的界面中密钥签名将在命令行界面中一同显示出来。


最后,放出一个配置文件范例供大家下载参考,强烈建议根据自己需要订制,切勿直接复制粘贴覆盖自己的配置文件。

gpg配置文件范例.7z
1.02e+3b
7Z
0次下载
折叠评论
加载评论中,请稍候...
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
ID:{{user.uid}}
{{user.username}}
{{user.info.certsName}}
{{user.description}}
{{format("YYYY/MM/DD", user.toc)}}注册,{{fromNow(user.tlv)}}活动
{{submitted?"":"投诉"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png