﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-alancxx-文章分类-Security</title><link>http://www.blogjava.net/alancxx/category/47608.html</link><description>------简单就是美</description><language>zh-cn</language><lastBuildDate>Fri, 27 May 2011 20:38:27 GMT</lastBuildDate><pubDate>Fri, 27 May 2011 20:38:27 GMT</pubDate><ttl>60</ttl><item><title>Fedora Core 4下的GPG加密解密及文件完整性验证</title><link>http://www.blogjava.net/alancxx/articles/348896.html</link><dc:creator>蜂鸟</dc:creator><author>蜂鸟</author><pubDate>Sat, 23 Apr 2011 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/alancxx/articles/348896.html</guid><wfw:comment>http://www.blogjava.net/alancxx/comments/348896.html</wfw:comment><comments>http://www.blogjava.net/alancxx/articles/348896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alancxx/comments/commentRss/348896.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alancxx/services/trackbacks/348896.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed">
        <tr>
            <td>
            <div class="cnt" id="blog_text">准备知识:<br />
            对称加密:<br />
            发送方: 010111 XOR 101100 = 111011&nbsp;&nbsp; (101100为加密密钥)<br />
            接收方: 111011 XOR 101100 = 010111<br />
            公钥加密:<br />
            发送方产生两把密钥:公钥(Public Key)&amp;私钥(Private Key),也就是密钥对(Key Pair)<br />
            明文-&gt;公钥加密-&gt;密文-&gt;私钥解密-&gt;明文<br />
            数字签名:<br />
            ....<br />
            <br />
            <br />
            -----------------------------发送方的操作-------------------------------------<br />
            sh# mkdir ~/.gnupg&nbsp;&nbsp; //默认是把密钥对存在此目录<br />
            sh# gpg --gen-key //生成公钥pubring.gpg,私钥secring.gpg,邮箱是很重要的<br />
            sh# gpg --list-keys //查看所有密钥,如果生成了多个密钥对的话就有多个了<br />
            sh# gpg --list-public-key //查看所有公钥,注意pub后面的*号字符串,pub xxxxx/******** 2007-07-10,它就是以下可能用到的KEYID<br />
            sh# gpg --list-secret-key //查看所有密钥<br />
            sh# gpg --list-sig //查看所有签名<br />
            sh# gpg --export-secret-keys -a -o secring.asc //导出私钥,作为备份<br />
            sh# gpg -a --export zjstandup@126.com &gt;test.gpg //导出公钥,邮箱名是第一步填的,对应于zjstandup@126.com的公匙信息就保存到了test.gpg文件中,此文件可以由邮箱发送或上传至公钥服务器供别人下载(如subkeys.pgp.net),有点像BT种子,哈哈<br />
            <br />
            /**此处将演示怎么把公钥上传至公钥服务器上,可以直接去网站上传,也可以像以下这样用命令上传<br />
            sh# gpg --send-keys KEYID //KEYID用以上那个代替,默认好像是传到了subkeys.pgp.net,文件名就不是test.gpg了,这些公钥服务器好像是全球同步更新!厉害阿!<br />
            <br />
            **/<br />
            <br />
            <br />
            sh# gedit test.txt //生成一个文本,里面输入点东西,用于以下测试<br />
            <br />
            将演示两种验证方式和一个数字签名<br />
            一种是公钥验证,大概是用于验证文件完整性,相当于:sh#md5sum ***;<br />
            另一种是私钥验证,控制只让那些知道密码的人能打开看<br />
            <br />
            sh# gpg --clearsign test.txt //使用私匙对数据进行签名,生成test.txt.asc,打开此文件还是可以看到内容的,只是多了一些东西,把这个发给其他人,这个演示公钥验证<br />
            sh# gpg --output test.txt.gpg -r zjstandup@126.com -as --encrypt test.txt //导入私钥,数据被加密成了test.txt.gpg,打开此文件看不到原信息的,把这个发给对方,这个演示私钥验证<br />
            sh# gpg --output test.sig --sign test.txt //这个演示数字签名<br />
            <br />
            <br />
            <br />
            ---------------------------接收方的操作------------------------------------------<br />
            /**下载公钥,由邮件接收或者从服务器上下载,此处演示从服务器下载<br />
            sh# gpg --search-keys zjstandup@126.com //搜索公钥,启动了全球搜索?!然后填入1就下载!<br />
            <br />
            **/<br />
            sh# gpg --import test.gpg //导入公钥至本机,test.gpg由发送方邮件传输过来或从公钥服务器下载过来的<br />
            <br />
            /**以下一段不太清楚,好像是防止公钥被篡改,验证公钥的完整性<br />
            sh# gpg --fingerprint zjstandup@126.com //指纹取样,防伪造的公钥,执行后可以看到密钥指纹,可以通过其他通讯方式咨询对方,是否是这个公钥(应该是上方让大家注意的pub后面的字符串)<br />
            sh# gpg --sign-key zjstandup@126.com<br />
            sh# gpg --check-sigs zjstandup@126.com<br />
            sh# gpg --edit-key zjstandup@126.com<br />
            sh# trust<br />
            sh# quit<br />
            **/<br />
            <br />
            1:公钥验证<br />
            sh# gpg --verify test.txt.asc //将有信息表明是完整的签字,假如改变了这个文件里面的信息再执行此命令,将出现不同的结果哦! <br />
            <br />
            2:私钥验证<br />
            sh# gpg --decrypt test.txt.gpg &gt; zjstandup.txt //执行,要输入正确的密码(在发送端生成密钥对时的那个)才能生成txt<br />
            <br />
            3;数字签名<br />
            sh# gpg --output sig.txt --decrypt test.sig //将显示完整的签字并还原内容生成sig.txt<br />
            <br />
            <br />
            sh# gpg --help &gt;&gt; manule.txt<br />
            sh# gedit manule.txt<br />
            <br />
            //将看到以下说明<br />
            gpg (GnuPG) 1.4.1<br />
            Copyright (C) 2005 Free Software Foundation, Inc.<br />
            This program comes with ABSOLUTELY NO WARRANTY.<br />
            This is free software, and you are welcome to redistribute it<br />
            under certain conditions. See the file COPYING for details.<br />
            <br />
            Home: ~/.gnupg<br />
            支持的算法：<br />
            公钥：RSA, RSA-E, RSA-S, ELG-E, DSA<br />
            对称加密：3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH<br />
            散列：MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512<br />
            压缩：不压缩, ZIP, ZLIB, BZIP2<br />
            <br />
            语法：gpg [选项] [文件名]<br />
            签字、检查、加密或解密<br />
            默认的操作依输入数据而定<br />
            <br />
            指令：<br />
            <br />
            -s, --sign [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一份签字<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --clearsign [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一份明文签字<br />
            -b, --detach-sign&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一份分离的签字<br />
            -e, --encrypt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加密数据<br />
            -c, --symmetric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 仅使用对称加密<br />
            -d, --decrypt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解密数据(默认)<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --verify&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 验证签字<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --list-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出密钥<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --list-sigs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出密钥和签字<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --check-sigs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出并检查密钥签字<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --fingerprint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出密钥和指纹<br />
            -K, --list-secret-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出私钥<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --gen-key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一副新的密钥对<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --delete-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从公钥钥匙环里删除密钥<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --delete-secret-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从私钥钥匙环里删除密钥<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --sign-key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为某把密钥添加签字<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --lsign-key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为某把密钥添加本地签字<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --edit-key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑某把密钥或为其添加签字<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --gen-revoke&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一份吊销证书<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --export&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导出密钥<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --send-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把密钥导出到某个公钥服务器上<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --recv-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从公钥服务器上导入密钥<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --search-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在公钥服务器上搜寻密钥<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --refresh-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从公钥服务器更新所有的本地密钥<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --import&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导入/合并密钥<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --card-status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打印卡状态<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --card-edit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更改卡上的数据<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --change-pin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更改卡的 PIN<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --update-trustdb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更新信任度数据库<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --print-md 算法 [文件]&nbsp;&nbsp;&nbsp; 使用指定的散列算法打印报文散列值<br />
            <br />
            选项：<br />
            <br />
            -a, --armor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出经 ASCII 封装<br />
            -r, --recipient 某甲&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为收件者&#8220;某甲&#8221;加密<br />
            -u, --local-user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用这个用户标识来签字或解密<br />
            -z N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设定压缩等级为 N (0 表示不压缩)<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --textmode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用标准的文本模式<br />
            -o, --output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定输出文件<br />
            -v, --verbose&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 详细模式<br />
            -n, --dry-run&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不做任何改变<br />
            -i, --interactive&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 覆盖前先询问<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --openpgp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 行为严格遵循 OpenPGP 定义<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --pgp2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成与 PGP 2.x 兼容的报文<br />
            <br />
            (请参考在线说明以获得所有命令和选项的完整清单)<br />
            <br />
            范例：<br />
            <br />
            -se -r Bob [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为 Bob 这个收件人签字及加密<br />
            --clearsign [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做出明文签字<br />
            --detach-sign [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做出分离式签字<br />
            --list-keys [某甲]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示密钥<br />
            --fingerprint [某甲]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示指纹<br />
            <br />
            请向 &lt;gnupg-bugs@gnu.org&gt; 报告程序缺陷。<br />
            请向 &lt;zuxyhere@eastday.com&gt; 反映简体中文翻译的问题。</div>
            </td>
        </tr>
</table><img src ="http://www.blogjava.net/alancxx/aggbug/348896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alancxx/" target="_blank">蜂鸟</a> 2011-04-23 23:02 <a href="http://www.blogjava.net/alancxx/articles/348896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GPG(pgp)加解密详述</title><link>http://www.blogjava.net/alancxx/articles/348895.html</link><dc:creator>蜂鸟</dc:creator><author>蜂鸟</author><pubDate>Sat, 23 Apr 2011 14:55:00 GMT</pubDate><guid>http://www.blogjava.net/alancxx/articles/348895.html</guid><wfw:comment>http://www.blogjava.net/alancxx/comments/348895.html</wfw:comment><comments>http://www.blogjava.net/alancxx/articles/348895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alancxx/comments/commentRss/348895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alancxx/services/trackbacks/348895.html</trackback:ping><description><![CDATA[<h2><span style="color: #3366ff">一、介绍</span></h2>
<p>我们都知道，互联网是不安全的，但其上所使用的大部分应用，如Web、Email等一般都只提供明文传输方式（用https、smtps等例外）。所以，当我们需要传输重要文件时，应该对当中的信息加密。非对称密码系统是其中一种常见的加密手段。而在基于PGP方式加密的中文介绍少之又少，所以萌生了写一个完整教程的想法，当然本文部分资料是我搜遍网络整理出来的，并不能保证百分之百的原创 </p>
<p></p>
<blockquote>
<p>GnuPG 是一个用来进行非对称加密(PGP)的免费软件，简称GPG（是不是有的童鞋已经被PGP和GPG给搞昏了）。先说说什么是非对称加密。传统的加密手段往往是使用同一个密码进行加密和解密。例如你加密时用的密码是&#8220;abc&#8221;， 则解密时也要使用&#8220;abc&#8221;才行。这样就存在一个问题，你不能够把一段加密信息发送给你的朋友。试想，如果采用这种加密方式把信息发送给你的朋友时，你的 朋友必须要知道你的密码才能把你的信息解密出来。但你如何保证你的朋友是绝对可靠的呢？也就是说，如果你的朋友把你的密码告诉了别人，你的密码就不再安全 了。<br />
非对称加密采用的是另一种思想。它会给你产生两个密钥，一个称为&#8220;公钥&#8221;，另一个称为&#8220;私钥&#8221;。公钥是可以公开的，你尽管把它传给别 人；私钥你一定要保管好不让其他任何人知道。当某人得到你的公钥后，他就可以给你发送加密信息了。具体来说，他把他要发给你的信息用你的公钥加密后发给 你，加密的信息只能用你的私钥去解密。这样，因为世界上除了你以外没有别人知道你的私钥，所以即使别人看到发送给你的加密信息他也无法解密，甚至连发送者 本人也不行。因为他不知道你的私钥。简单说来，就是用公钥去加密；用对应的私钥去解密。想给谁发送加密信息，首先要得到他的公钥。<br />
支持非 对称加密的软件有多种，最著名的可能是美国的PGP了，不过它是个商业软件，价格不便宜。对于加密软件，我反对使用破解软件，因为如果信息需要加密的话， 肯定是非常重要的信息，破解软件无法保证加密的安全可靠。因此我建议使用免费开源的GnuPG软件进行信息的加密和解密。</p>
</blockquote>
<h2><span style="color: #3366ff">二、使用:</span></h2>
<p><span style="color: #ff6600"><strong>1.生成密钥对</strong></span><br />
要使用GnuPG加密，首先需要创建密钥对，执行：</p>
<div class="quote">
<blockquote>
<div class="quote-content"># gpg &#8211;gen-key<br />
gpg (GnuPG) 1.4.5; Copyright (C) 2006 Free Software Foundation, Inc.<br />
This program comes with ABSOLUTELY NO WARRANTY.<br />
This is free software, and you are welcome to redistribute it<br />
under certain conditions. See the file COPYING for details.
<p>&nbsp;</p>
<p>请选择您要使用的密钥种类：<br />
(1) DSA 和 ElGamal (默认)<br />
(2) DSA (仅用于签名)<br />
(5) RSA (仅用于签名)<br />
您的选择？ 1&nbsp;&nbsp;<span style="color: #ff0000">&#8592;只有1可以用于加密，其他种类只能用于签名</span><br />
DSA 密钥对会有 1024 位。<br />
ELG-E 密钥长度应在 1024 位与 4096 位之间。<br />
您想要用多大的密钥尺寸？(2048)&nbsp;&nbsp;<span style="color: #ff0000">&#8592;选择密码的位数，位数越大，越安全，但速度越慢</span><br />
您所要求的密钥尺寸是 2048 位<br />
请设定这把密钥的有效期限。<br />
0 = 密钥永不过期<br />
&lt;n&gt;&nbsp;&nbsp;= 密钥在 n 天后过期<br />
&lt;n&gt;w = 密钥在 n 周后过期<br />
&lt;n&gt;m = 密钥在 n 月后过期<br />
&lt;n&gt;y = 密钥在 n 年后过期<br />
密钥的有效期限是？(0) 0&nbsp;&nbsp;<span style="color: #ff0000">&#8592;根据实际情况选择密钥期限</span><br />
密钥永远不会过期<br />
以上正确吗？(y/n)y&nbsp;&nbsp;<span style="color: #ff0000">&#8592;确认</span></p>
<p>您需要一个用户标识来辨识您的密钥；本软件会用真实姓名、注释和电子邮件地址组合<br />
成用户标识，如下所示：<br />
&#8220;Heinrich Heine (Der Dichter) &lt;heinrichh@duesseldorf.de&gt;&#8221;</p>
<p>真实姓名：Hyphen Wang&nbsp;&nbsp;<span style="color: #ff0000">&#8592;请填入真实姓名，后面会用到</span><br />
电子邮件地址：gpgencrypt@linuxfly.org&nbsp;&nbsp;<span style="color: #ff0000">&#8592;邮件作为标记之一，不能重复</span><br />
注释：Use for GPG Encrypt&nbsp;&nbsp;<span style="color: #ff0000">&#8592;仅是注释而已</span><br />
您选定了这个用户标识：<br />
&#8220;Hyphen Wang (Use for GPG Encrypt) &lt;gpgencrypt@linuxfly.org&gt;&#8221;</p>
<p>更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)？O&nbsp;&nbsp;<span style="color: #ff0000">&#8592;输入&#8220;O&#8221;确认</span><br />
您需要一个密码来保护您的私钥。&nbsp;&nbsp;<span style="color: #ff0000">&#8592;输入两次用于访问私钥的密码，紧记，不能公开或丢失</span></p>
<p>我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动<br />
鼠标、读写硬盘之类的)，这会让随机数字发生器有更好的机会获得足够的熵数。<br />
++++++++++&#8230;++++++++++..++++++++</p>
<p>随机字节不够多。请再做一些其他的琐事，以使操作系统能搜集到更多的熵数！<br />
(还需要274字节)&nbsp;&nbsp;<span style="color: #ff0000">&#8592;运行一些的程序，以便在内存中获得更多随机数</span><br />
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动<br />
鼠标、读写硬盘之类的)，这会让随机数字发生器有更好的机会获得足够的熵数。<br />
+++++++++++++++++++++++++.+++++.+++++.++++++++++.+++&lt;+++++..+++++^^^<br />
gpg: 密钥 <strong><span style="color: #dc143c">A3942296</span></strong> 被标记为绝对信任&nbsp;&nbsp;<span style="color: #ff0000">&#8592;密钥ID</span><br />
公钥和私钥已经生成并经签名。</p>
<p>gpg: 正在检查信任度数据库<br />
gpg: 需要 3 份勉强信任和 1 份完全信任，PGP 信任模型<br />
gpg: 深度：0 有效性：&nbsp;&nbsp;2 已签名：&nbsp;&nbsp;0 信任度：0-，0q，0n，0m，0f，2u<br />
pub&nbsp;&nbsp; 1024D/A3942296 2008-12-19<br />
密钥指纹 = E95E 1F77 6C4E 33BD 740C&nbsp;&nbsp;19AB EEF9 A67E A394 2296<br />
uid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hyphen Wang (Use for GPG Encrypt) &lt;gpgencrypt@linuxfly.org&gt;<br />
sub&nbsp;&nbsp; 2048g/911E677B 2008-12-19</p>
</div>
</blockquote>
<div class="quote-content"><span style="color: #ff6600"><strong>2.密钥的回收</strong></span></div>
<div class="quote-content">当您的密钥对生成之后，您应该立即做一个公钥回收证书，如果您忘记了您的私钥的口令或者您的私钥丢失或者被盗窃，您可以发布这个证书来声明以前的公钥不再有效。生成回收证书的选项是&#8221;&#8211;gen-revoke&#8221;。</div>
<div class="quote-content">
<blockquote>
<p>gpg &#8211;output revoke.asc &#8211;gen-revoke <span style="color: #3366ff">mykeyID</span></p>
</blockquote>
<p>其中mykey 参数是可以表示的密钥标识，产生的回收证书放在revoke.asc文件里，一旦回收证书被发放，以前的证书就不能再被其他用户访问，因此以前的公钥也就失效了。</p>
<p><span style="color: #ff00ff">PS:如果一旦决定撤销已经上传的公钥，就需要将该密钥的回收证书上传至密钥服务器完成回收工作。</span></p>
<p><strong></strong></p>
<blockquote>
<p>gpg &#8211;keyserver <span style="color: #3366ff">Server Address</span> &#8211;send-keys <span style="color: #3366ff">mykeyID</span></p>
</blockquote>
<p><strong><span style="color: #ff6600">3.密钥的上传</span></strong></p>
<p>当上述工作完成以后，为了让尽可能多的人获取您的公钥，您可以将公钥邮寄出去，或者贴在自己的个人主页上，当然还有一种更好的方法就是上传到全球性的密钥服务器，其他用户可以通过您提供的公钥ID来搜索并获得您的公钥。</p>
<p>通过如下命令可以将你的key发布到服务器上：</p>
</div>
<blockquote>
<div class="quote-content">gpg &#8211;keyserver <span style="color: #3366ff">Server Address</span> &#8211;send-keys <span style="color: #3366ff">mykeyID</span></div>
</blockquote>
<div><span style="color: #ff00ff">PS:当然您也可以定义默认的服务器key server，一般安装好后的默认key server都是subkeys.pgp.net。你也可以通过修改.gnupg/gpg.conf中的keyserver信息来改变你的key server。</span></div>
</div>
<div><strong><span style="color: #ff6600">4.密钥的导出／导入</span></strong></div>
<div><strong><span style="color: #ff6600"><br />
</span></strong></div>
<div>我们通常需要导出公钥和私钥保存起来，当然公钥是可以满世界的泼洒，但是私钥请务必保存好，否则你的密钥对将会永久性的失去威力。</div>
<ul>
    <li>公钥的导出： </li>
</ul>
<div>
<blockquote>
<p>gpg -o <span style="color: #3366ff">keyfilename</span> &#8211;export <span style="color: #3366ff">mykeyID</span></p>
<p>如果没有mykeyID则是备份所有的公钥，<span style="color: #ff0000">-o</span>表示输出到文件keyfilename中，如果加上<span style="color: #ff0000">-a</span>的参数则输出文本格式( ASCII )的信息，否则输出的是二进制格式信息。</p>
</blockquote>
<ul>
    <li>私钥的导出： </li>
</ul>
<blockquote>
<p>gpg -o <span style="color: #3366ff">keyfilename </span>&#8211;export-secret-keys <span style="color: #3366ff">mykeyID</span></p>
<p>如果没有mykeyID则是备份所有的私钥，<span style="color: #ff0000">-o</span>表示输出到文件keyfilename中，如果加上<span style="color: #ff0000">-a</span>的参数则输出文本格式的信息，否则输出的是二进制格式信息。</p>
</blockquote>
<ul>
    <li>密钥的导入： </li>
</ul>
<blockquote>
<p>gpg &#8211;import <span style="color: #3366ff">filename</span></p>
</blockquote>
<p><span style="color: #ff00ff">PS:用户可以使用gpg &#8211;list-keys命令查看是否成功导入了密钥。</span><br />
<strong></strong></p>
<p><strong><span style="color: #ff6600">5.加密解密和数字签名</span></strong></p>
<p>通过上述的密钥生成以及公钥分发后，加密和解密数据变得非常容易，用户可以通过使用该功能来达到安全地在网络上传输自己的隐密数据的目的。</p>
<p>如果用户patterson要给用户liyang发送一个加密文件，则他可以使用liyang的公钥加密这个文件，并且这个文件也只有liyang使用自己的密钥才可以解密查看。下面给出加解密的步骤：</p>
<ul>
    <li>用户patterson使用liyang的公钥加密文件test，使用下面的指令： </li>
</ul>
<blockquote>
<p># gpg -e test</p>
<p>You did not specify a user ID. (you may use &#8220;-r&#8221;)</p>
<p>Enter the user ID. End with an empty line: liyang</p>
<p>Added 1024g/C50E455A 2006-01-02 &#8220;liyang (hello) &lt; liyang@sina.com&gt;&#8221;</p>
</blockquote>
<p>这样，就可以将gpg.conf文件加密成test.gpg，一般用户是无法阅读的</p>
<p><span style="color: #ff00ff">PS:当然你也可以直接指定使用哪个用户的公钥进行加密:</span></p>
<blockquote>
<p>gpg -e -r liyang test&nbsp; (-r 表示指定用户)</p>
<p>还可以加上参数 -a 来输出ASCII编码的文件test.asc(test.gpg是二进制编码的，不可用文本读)</p>
<p>gpg -ea -r liyang test</p>
</blockquote>
<ul>
    <li>用户liyang 使用自己的私钥来解密该文件，如下所示： </li>
</ul>
<blockquote>
<p># gpg -d test.gpg</p>
<p>You need a passphrase to unlock the secret key for</p>
<p>user: &#8220;liyang (hello) &lt; liyang@sina.com&gt;&#8221;</p>
<p>1024-bit ELG-E key, ID C50E455A, created 2006-01-02 (main key ID 378D11AF)</p>
<p>GnuPG提示用户，需要输入生成私钥使用的密码：</p>
<p>Enter passphrase:</p>
<p>gpg: encrypted with 1024-bit ELG-E key, ID C50E455A, created 2006-01-02</p>
<p>&#8220;liyang (hello) &lt; liyang@sina.com&gt;&#8221;</p>
<p>PS:无论加密解密，都可以加上<span style="color: #ff0000">-o</span>参数来指定加密和解密后的输出文件，例如</p>
<p><span style="color: #888888">#gpg <span style="color: #ff0000">-o </span>doc.gpg -er name doc<br />
其中name是选择谁的公钥加密，即谁是文件的接收者。<br />
doc为要加密的文件，即原文件<br />
doc.gpg为命令执行后生成的加密的文件，这里要先指定好文件名</span></p>
</blockquote>
<ul>
    <li>对文件进行签名 </li>
</ul>
<blockquote>
<p><span style="color: #00ccff">1、数字签名</span><br />
命令格式：<br />
#gpg -o doc.sig -s doc<br />
其中doc是原文件，doc.sig包含了原文件和签名，是二进制的。这个命令会要求你输入你的私钥的密码句。<br />
#gpg -o doc.sig -ser name doc<br />
既签名又加密</p>
<p><span style="color: #00ccff">2、文本签名</span><br />
#gpg -o doc.sig &#8211;clearsign doc<br />
这样产生的doc.sig同样包含原文件和签名，其中签名是文本的，而原文件不变。</p>
<p><span style="color: #00ccff">3、分离式签名</span><br />
#gpg -o doc.sig -ab doc<br />
doc.sig仅包括签名，分离式签名的意思是原文件和签名是分开的。<br />
b 表示分离式签名detach-sign</p>
<p><span style="color: #00ccff">4、验证签名</span><br />
#gpg &#8211;verify doc.sig [doc]<br />
验证之前必须导入文件作者的公钥，对于分离式签名，最后还要加上原文件，即后面的doc。</p>
</blockquote>
<ul>
    <li>密匙签名和用户信任(进阶功能) </li>
</ul>
<p>尽管在理论上讲，具备了公匙和私匙就可以实现安全的信息通讯，但是在实际应用中，还必须对公匙进行有效确认。因为，确实存在伪造公匙信息的可能。</p>
<p>由此，在GPG中引入了一个复杂的信任系统，以帮助我们区分哪些密匙是真的，哪些密匙是假的。这个信任系统是基于密匙的，主要包括密匙签名。</p>
<p>当收到熟人的公匙并且GPG告知不存在任何实体可信信息附加于这个公匙后，首要的事情就是对这个密匙进行&#8220;指纹采样&#8221;（fingerprint）。例如，我们对来自mike的公匙进行了导入操作，并且GPG告知我们不存在这个密匙的附加可信信息，这时候，我们首先要做的工作就是对这个新密匙进行&#8220;指纹采样 &#8221;，相关命令及执行情况如下：</p>
<blockquote>
<p>$ gpg &#8211;fingerprint mike@hairnet.orgpub 1024D/4F03BD39 2001-01-15 Mike Socks (I&#8217;m WIRED) Key fingerprint = B121 5431 8DE4 E3A8 4AA7 737D 20BE 0DB8 4F03 BD39sub 1024g/FDBB477D 2001-01-15$</p>
</blockquote>
<p>这样，就从密匙数据中生成了其指纹信息，并且应该是唯一的。然后，我们打电话给mike，确认两件事情。首先，他是否发送给我们了密匙；其次，他的公匙的指纹信息是什么。如果Mike确认了这两件事情，我们就可以确信这个密匙是合法的。接下来，我们对密匙进行签名操作，以表示这个密匙来自Mike而且我们对密匙的信任，相关命令及执行情况如下：</p>
<blockquote>
<p>$ gpg &#8211;sign-key mike@hairnet.orgpub 1024D/4F03BD39 created: 2001-01-15 expires: neversub 1024g/FDBB477D created: 2001-01-15 expires: never(1) Mike Socks (I&#8217;m WIRED) pub 1024D/4F03BD39 created: 2001-01-15 expires: neverFingerprint = B121 5431 8DE4 E3A8 4AA7 737D 20BE 0DB8 4F03 BD39Mike Socks (I&#8217;m WIRED) Are you really sure that you want to sign this keywith your key: Ima User (I&#8217;m just ME) Really sign? yYou need a passphrase to unlock the secret key foruser: Ima User (I&#8217;m just ME) 1024-bit DSA key, ID D9BAC463, created 2001-01-03Enter passphrase:$</p>
</blockquote>
<p>执行到此，使用我们的私匙完成了对Mike的公匙的签名操作，任何持有我们的公匙的人都可以查证签名确实属于我们自己。这个附加到Mike的公匙上的签名信息将随它环游Internet世界，我们使用个人信誉，也就是我们自己的私匙，保证了那个密匙确实属于Mike。这是一个多么感人的充满诚信的故事啊 <img class="wp-smiley" alt=":-)" src="http://www.alexgao.com/wp-includes/images/smilies/icon_smile.gif" /> 现实世界的人们是否应该从这严格的技术标准中反思些什么呢？</p>
<p>还是回到这里。获取附加于一个公匙上的签名信息列表的命令是：</p>
<blockquote>
<p>gpg &#8211;check-sigs mike@hairnet.org</p>
</blockquote>
<p>签名列表越长，密匙的可信度越大。其实，正是签名系统本身提供了密匙查证功能。假设我们接收到一个签名为Mike的密匙，通过Mike的公匙，我们验证出签名确实属于Mike，那么我们就信任了这个密匙。推而广之，我们就可以信任Mike签名的任何密匙。</p>
<p>为了更加稳妥，GPG还引入了另一个附加功能：可信级别（trust level）。使用它，我们可以为我们拥有的任何密匙的所有者指定可信级别。例如，即使我们知道Mike的公匙是可信的，但是事实上我们不能信任Mike在对其他密匙签名时的判断；我们会想，Mike也许只对少数密匙进行了签名，但却没有好好地检查一遍。</p>
<p>设置可信级别的命令及执行情况如下：</p>
<blockquote>
<p>$ gpg &#8211;edit-key mike@hairnet.orgpub 1024D/4F03BD39 created: 2001-01-15 expires: never trust: -/fsub 1024g/FDBB477D created: 2001-01-15 expires: never(1) Mike Socks (I&#8217;m WIRED) Command&gt; trust 1 = Don&#8217;t know 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully s = please show me more information m = back to the main menuYour decision? 2Command&gt; quit$</p>
</blockquote>
<p>在命令编辑环境中执行trust，然后选择级别2（I do NOT trust），这样我们割断了任何信任链，使每个密匙都必须经过Mike的签名。</p>
<p><strong><span style="color: #ff6600">6.删除密钥</span></strong></p>
<p>从私钥钥匙环里删除密钥：</p>
<div class="quote">
<blockquote>
<div class="quote-content"># gpg &#8211;delete-secret-keys hyphenwang@redflag-linux.com<br />
gpg (GnuPG) 1.4.5; Copyright (C) 2006 Free Software Foundation, Inc.<br />
This program comes with ABSOLUTELY NO WARRANTY.<br />
This is free software, and you are welcome to redistribute it<br />
under certain conditions. See the file COPYING for details.
<p>&nbsp;</p>
<p>sec&nbsp;&nbsp;1024D/A3942296 2008-12-19 Hyphen Wang (Use for GPG Encrypt) &lt;gpgencrypt@linuxfly.org&gt;</p>
<p>要从钥匙环里删除这把密钥吗？(y/N)y<br />
这是一把私钥！――真的要删除吗？(y/N)y</p>
</div>
</blockquote></div>
<p>必须先删除私钥，然后才能删除公钥。<br />
从公钥钥匙环里删除密钥：</p>
</div>
<div sizset="135" sizcache="1">
<div class="quote" sizset="135" sizcache="1">
<blockquote>
<div class="quote-content"># gpg &#8211;delete-keys hyphenwang@redflag-linux.com<br />
gpg (GnuPG) 1.4.5; Copyright (C) 2006 Free Software Foundation, Inc.<br />
This program comes with ABSOLUTELY NO WARRANTY.<br />
This is free software, and you are welcome to redistribute it<br />
under certain conditions. See the file COPYING for details.
<p>&nbsp;</p>
<p>sec&nbsp;&nbsp;1024D/A3942296 2008-12-19 Hyphen Wang (Use for GPG Encrypt) &lt;gpgencrypt@linuxfly.org&gt;</p>
<p>要从钥匙环里删除这把密钥吗？(y/N)y</p>
</div>
</blockquote>
<h2 class="quote-content"><span style="color: #3366ff"><strong><strong>三.对称加密:</strong></strong></span></h2>
<p>当然GPG同样具备普通的对称加密功能，这时候就不需要密钥，直接用密码加密即可（注意，这里的密码不一定是你私钥的密码，您大可以随意设定）</p>
<blockquote>
<p>gpg -o doc.gpg -c doc</p>
</blockquote>
<p>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</p>
<h2 class="quote-content"><span style="color: #3366ff"><strong>四.GPG常用参数:</strong></span></h2>
<blockquote>
<div class="quote-content">语法：gpg [选项] [文件名]<br />
签字、检查、加密或解密<br />
默认的操作依输入数据而定</div>
</blockquote>
<p>指令：</p>
<blockquote>
<p>-s, &#8211;sign [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一份签字<br />
&#8211;clearsign [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一份明文签字<br />
-b, &#8211;detach-sign&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一份分离的签字<br />
-e, &#8211;encrypt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加密数据<br />
-c, &#8211;symmetric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 仅使用对称加密<br />
-d, &#8211;decrypt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解密数据(默认)<br />
&#8211;verify&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 验证签字<br />
&#8211;list-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出密钥<br />
&#8211;list-sigs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出密钥和签字<br />
&#8211;check-sigs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出并检查密钥签字<br />
&#8211;fingerprint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出密钥和指纹<br />
-K, &#8211;list-secret-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出私钥<br />
&#8211;gen-key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一副新的密钥对<br />
&#8211;delete-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从公钥钥匙环里删除密钥<br />
&#8211;delete-secret-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从私钥钥匙环里删除密钥<br />
&#8211;sign-key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为某把密钥添加签字<br />
&#8211;lsign-key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为某把密钥添加本地签字<br />
&#8211;edit-key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑某把密钥或为其添加签字<br />
&#8211;gen-revoke&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一份吊销证书<br />
&#8211;export&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导出密钥<br />
&#8211;send-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把密钥导出到某个公钥服务器上<br />
&#8211;recv-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从公钥服务器上导入密钥<br />
&#8211;search-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在公钥服务器上搜寻密钥<br />
&#8211;refresh-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从公钥服务器更新所有的本地密钥<br />
&#8211;import&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导入/合并密钥<br />
&#8211;card-status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打印卡状态<br />
&#8211;card-edit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更改卡上的数据<br />
&#8211;change-pin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更改卡的 PIN<br />
&#8211;update-trustdb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更新信任度数据库<br />
&#8211;print-md 算法 [文件]&nbsp;&nbsp;&nbsp; 使用指定的散列算法打印报文散列值</p>
<p>选项：</p>
<p>-a, &#8211;armor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出经 ASCII 封装<br />
-r, &#8211;recipient 某甲&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为收件者&#8220;某甲&#8221;加密<br />
-u, &#8211;local-user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用这个用户标识来签字或解密<br />
-z N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设定压缩等级为 N (0 表示不压缩)<br />
&#8211;textmode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用标准的文本模式<br />
-o, &#8211;output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定输出文件<br />
-v, &#8211;verbose&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 详细模式<br />
-n, &#8211;dry-run&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不做任何改变<br />
-i, &#8211;interactive&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 覆盖前先询问<br />
&#8211;openpgp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 行为严格遵循 OpenPGP 定义<br />
&#8211;pgp2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成与 PGP 2.x 兼容的报文</p>
</blockquote>
<p>(请参考在线说明以获得所有命令和选项的完整清单)</p>
<p>范例：</p>
<p>-se -r Bob [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为 Bob 这个收件人签字及加密<br />
&#8211;clearsign [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做出明文签字<br />
&#8211;detach-sign [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做出分离式签字<br />
&#8211;list-keys [某甲]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示密钥<br />
&#8211;fingerprint [某甲]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示指纹</p>
<p>———————————————————————————&#8211;</p>
</div>
</div>
 <img src ="http://www.blogjava.net/alancxx/aggbug/348895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alancxx/" target="_blank">蜂鸟</a> 2011-04-23 22:55 <a href="http://www.blogjava.net/alancxx/articles/348895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GPG 简单使用</title><link>http://www.blogjava.net/alancxx/articles/GPG.html</link><dc:creator>蜂鸟</dc:creator><author>蜂鸟</author><pubDate>Sat, 23 Apr 2011 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/alancxx/articles/GPG.html</guid><wfw:comment>http://www.blogjava.net/alancxx/comments/348893.html</wfw:comment><comments>http://www.blogjava.net/alancxx/articles/GPG.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alancxx/comments/commentRss/348893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alancxx/services/trackbacks/348893.html</trackback:ping><description><![CDATA[<div id="art" style="margin: 15px" width="100%">
<h2 class="title" style="color: #000080">The GNU Privacy Guard</h2>
<p>Private和public的钥匙是gpg加密和解密过程的主要部分,所以第一步就是创建为自己创建一对密匙.</p>
<div class="procedure">
<ol type="1">
    <li>
    <p><strong>生成私钥</strong></p>
    <table style="border-right: rgb(153,153,153) 1px solid; border-top: rgb(153,153,153) 1px solid; font-size: 12px; border-left: rgb(153,153,153) 1px solid; width: 80%; border-bottom: rgb(153,153,153) 1px solid" align="center">
        <tbody>
            <tr>
                <td><strong style="color: #ff0000">$gpg --gen-key</strong><br />
                </td>
            </tr>
        </tbody>
    </table>
    <p>你需要回答一些这个命令提出的问题</p>
    <ol type="a">
        <li>
        <p>私钥的种类和size，这里缺省的答案已经足够好了</p>
        <li>
        <p>私钥的有效期，我通常选择不会过期，呵呵</p>
        <li>
        <p>你的真实的姓名和e-mail地址，这些是用来从一大堆钥匙中找到你的钥匙的</p>
        <li>
        <p>关于你的钥匙的comment，可以为空，我一般填一个昵称</p>
        <li>
        <p>钥匙的密码. 千万别忘了，否则所有你加密过的文件都没用了</p>
        </li>
    </ol>
    <li>
    <p><strong>为你的私钥生成一个公钥(文本文件)，这是我的：</strong><a href="http://blogimg.chinaunix.net/blog/upfile2/080129235300.zip" target="_blank"><strong>aubrey.asc.zip</strong></a></p>
    <table style="border-right: rgb(153,153,153) 1px solid; border-top: rgb(153,153,153) 1px solid; font-size: 12px; border-left: rgb(153,153,153) 1px solid; width: 552px; border-bottom: rgb(153,153,153) 1px solid; height: 40px" align="center">
        <tbody>
            <tr>
                <td><strong><span style="color: #ff0000">$ gpg --armor --output public.key --export &lt;your email&gt;<br />
                </span></strong></td>
            </tr>
        </tbody>
    </table>
    <p>你可以分发这个文件了，给你的朋友，或者贴到你的个人网站上， or whatever.</p>
    <li><strong>为自己加密一个文件. 这里--recipient可以是你的全名，也可以是你的邮件地址<br />
    </strong>
    <table style="border-right: rgb(153,153,153) 1px solid; border-top: rgb(153,153,153) 1px solid; font-size: 12px; border-left: rgb(153,153,153) 1px solid; width: 547px; border-bottom: rgb(153,153,153) 1px solid; height: 38px" align="center">
        <tbody>
            <tr>
                <td>
                <pre class="programlisting"><strong><span style="color: #ff0000">#gpg --encrypt --recipient 'Your Name' foo.tx<span style="font-family: 'Courier New',Courier,'宋体'">t</span></span></strong></pre>
                </td>
            </tr>
        </tbody>
    </table>
    <li><strong><span style="font-family: monospace">解</span>密这个文件. 这里不加--output选项的话,解密的内容将被送到屏幕上</strong>
    <table style="border-right: rgb(153,153,153) 1px solid; border-top: rgb(153,153,153) 1px solid; font-size: 12px; border-left: rgb(153,153,153) 1px solid; width: 544px; border-bottom: rgb(153,153,153) 1px solid; height: 33px" align="center">
        <tbody>
            <tr>
                <td>
                <pre class="programlisting"><strong><span style="color: #ff0000">#gpg --output foo.txt --decrypt foo.txt.gpg</span></strong></pre>
                </td>
            </tr>
        </tbody>
    </table>
    <li><strong><span style="font-family: monospace">为</span>别人加密一个文件. 这里首先要import别人的公钥，然后加密。注意这里变化的只是--recipient选项</strong>
    <table style="border-right: rgb(153,153,153) 1px solid; border-top: rgb(153,153,153) 1px solid; font-size: 12px; border-left: rgb(153,153,153) 1px solid; width: 544px; border-bottom: rgb(153,153,153) 1px solid; height: 31px" align="center">
        <tbody>
            <tr>
                <td>
                <pre class="programlisting"><strong style="color: #ff0000"><span style="font-family: 'Courier New',Courier,'宋体'">#gpg </span>--import key.asc<br />
                #gpg --list-keys<br />
                #gpg --encrypt --recipient 'myfriend@his.isp.net' foo.txt</strong><br />
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <li><strong>解密一个从别人那里发来的文件. 这个和本机加密的文件解密没什么区别.<br />
    </strong>
    <table style="border-right: rgb(153,153,153) 1px solid; border-top: rgb(153,153,153) 1px solid; font-size: 12px; border-left: rgb(153,153,153) 1px solid; width: 544px; border-bottom: rgb(153,153,153) 1px solid; height: 38px" align="center">
        <tbody>
            <tr>
                <td>
                <pre class="programlisting"><strong><span style="color: #ff0000"><strong>#gpg --output foo.txt --decrypt foo.txt.gpg</strong></span></strong>          </pre>
                </td>
            </tr>
        </tbody>
    </table>
    </li>
</ol>
</div>
<br />
</div>
 <img src ="http://www.blogjava.net/alancxx/aggbug/348893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alancxx/" target="_blank">蜂鸟</a> 2011-04-23 22:39 <a href="http://www.blogjava.net/alancxx/articles/GPG.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下使用RatProxy</title><link>http://www.blogjava.net/alancxx/articles/ratproxy.html</link><dc:creator>蜂鸟</dc:creator><author>蜂鸟</author><pubDate>Thu, 03 Mar 2011 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/alancxx/articles/ratproxy.html</guid><wfw:comment>http://www.blogjava.net/alancxx/comments/345600.html</wfw:comment><comments>http://www.blogjava.net/alancxx/articles/ratproxy.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alancxx/comments/commentRss/345600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alancxx/services/trackbacks/345600.html</trackback:ping><description><![CDATA[<p style="font-size: 10pt"><strong>Windows下使用RatProxy步骤:<br />
&nbsp;1、安装Cygwin：</strong>下载地址Cygwin(http://www.cygwin.com/)运行setup.exe后&lt;下一步&gt;...到Select Packages，找到Devel节点并展开并选上:<br />
&nbsp;&nbsp;&nbsp;<strong> 1) make <br />
&nbsp;&nbsp;&nbsp; 2) gcc-core<br />
&nbsp;&nbsp;&nbsp; 3) openssl-devel <br />
</strong>&nbsp;&nbsp;&nbsp; 然后在Libs或Net节点找到<strong>openssl</strong>并先上它，继续下一步直至安装完成。&nbsp;&nbsp;&nbsp;&nbsp; <br />
<strong>&nbsp;2、生成RatProxy：</strong>下载RatProxy，随便解压到某一目录，如c:\ratproxy。<br />
&nbsp;&nbsp;&nbsp; 1)&nbsp; 用记事本打开Makefile文件，找到&#8220;CFLAGS = -Wall -O3 -Wno-pointer-sign -D_GNU_SOURCE&#8221;，删除&#8220;-Wno-pointer-sign&#8221;(貌似跟编译器不兼容，需要删掉这个~)，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最后变成这样：<strong>CFLAGS = -Wall -O3 -D_GNU_SOURCE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
</strong>&nbsp;&nbsp;&nbsp; 2) 从http://www.nowrap.de/download/flare06doswin.zip下载flare并解压到ratproxy的flare-dist子目录下&nbsp; <br />
&nbsp;&nbsp;&nbsp; 3) 运行cygwin.bat，切换到c:\ratproxy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong style="color: red">cd &#8220;c:\ratproxy&#8221;</strong>&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 4) 然后运行make，编译完成。 <br />
<strong>&nbsp;3、使用RatProxy：</strong>&nbsp; <br />
&nbsp;&nbsp;&nbsp; 1) 运行命令 $ ./ratproxy -v . -w test.log -d test.com -lfscm&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明：其中-v参数为输出日志文件的目录，-w为日志文件名，-d限定扫描的域名，更多的参数可以通过-h找到说明，或者通过它的在线文档：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://code.google.com/p/ratproxy/wiki/RatproxyDoc">http://code.google.com/p/ratproxy/wiki/RatproxyDoc</a>。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 2) 打开浏览器，并设置代理为127.0.0.1，端口8080(ratproxy默认端口)。<br />
&nbsp;&nbsp;&nbsp; 3) 开始浏览你要检测的网站吧，它会根据你浏览的页面生成相应的日志的。<br />
&nbsp;&nbsp;&nbsp; 4) 通过在cygwin中执行以下命令：<strong style="color: red">$ ./ratproxy-report.sh test.log &gt; test.html <br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者的另一款工具skipfish就比较自动了，可以体验了一下。</p>
<img src ="http://www.blogjava.net/alancxx/aggbug/345600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alancxx/" target="_blank">蜂鸟</a> 2011-03-03 15:52 <a href="http://www.blogjava.net/alancxx/articles/ratproxy.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>电子商务安全与支付技术</title><link>http://www.blogjava.net/alancxx/articles/344131.html</link><dc:creator>蜂鸟</dc:creator><author>蜂鸟</author><pubDate>Sat, 12 Feb 2011 05:34:00 GMT</pubDate><guid>http://www.blogjava.net/alancxx/articles/344131.html</guid><wfw:comment>http://www.blogjava.net/alancxx/comments/344131.html</wfw:comment><comments>http://www.blogjava.net/alancxx/articles/344131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alancxx/comments/commentRss/344131.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alancxx/services/trackbacks/344131.html</trackback:ping><description><![CDATA[<p><strong><span style="font-size: 24pt"><strong style="color: #003366; font-family: 楷体_GB2312">电子商务的安全需求</strong> <br />
</span></strong><br />
信息安全需求、信用安全需求、管理安全需求和法律保障安全需求 <br />
1)信息的保密性；<br />
2)信息的完整性；<br />
3)信息的不可否认性；<br />
4)交易者身份的真实性；<br />
5)系统的可靠性、可用性、可控性 <br />
<br />
<strong style="font-size: 24pt"><span style="font-family: 楷体_GB2312"><strong style="font-size: 24pt; color: #003366; font-family: ">信息的保密性技术</strong> <br style="font-family: " />
<strong style="font-family: "><br style="font-family: " />
</strong></span></strong><strong>1、加密/解密技术</strong> <br />
1) 加密/解密技术是一种用来防止信息泄露的技术。电子商务中的信息在通过Internet传送之前，为了防止信息的内容被他人有意或无意的知晓，需要将它的内容通过一定的方法转变成别人看不懂的信息，这个过程就是加密（Encription）；而将看不懂的信息再转变还原成原始信息的过程称为解密(Decription)。这里，加密之前的信息被称为明文(plaintext)，加密之后的内容称为密文，加密通常要采用一些算法（对应着加密/解密的程序），而这些算法需要用到不同的参数，这些不同的参数称作密钥，密钥空间是所有密钥的集合。<br />
2)&nbsp; 类型<br />
按照历史发展阶段:：手工加密、机械加密、电子机内乱加密、计算机加密 <br />
按照保密程度：理论上保密的加密、实际上保密的加密、不保密的加密三种类型<br />
按照密钥使用方式：对称加密和非对称加密<br />
<br />
&nbsp;<img height="589" alt="" src="http://www.blogjava.net/images/blogjava_net/alancxx/1.JPG" width="535" border="0" /><br />
<strong>&nbsp;i ) 对称加密</strong> <br />
也叫共享密钥加密或机密密钥加密，收发双方拥有相同的单个密钥，这把密钥既可用于加密，也可用于解密，即加密和解密使用的是相同的一把密钥，此密钥又称为对称密钥或会话密钥。<br />
常见的对称加密方法有DES、3DES、AES、BASE64等:<br />
<strong><span style="font-size: 12pt"><strong>DES(Data Encryption Standard)</strong> </span></strong>：<br />
算法输入的是64比特的明文，在64比特密钥的控制下产生64比特的密文；反之输入64比特的密文，输出64比特的明文。64比特 的密钥中含有8个比特的奇偶校验位，所以实际有效密钥长度为56比特 。<br />
<strong>3DES：<br />
</strong>是DES算法扩展其密钥长度的一种方法，可使加密密钥长度扩展到128比特（实际有效位为112比特）或192比特（实际有效位为168比特）。其基本原理是将128比特 的密钥分为64比特的两组，对明文多次进行普通的DES加解密操作，从而增强加密强度。<br />
AES(Advanced Encryption Standard)：AES处理以128bit数据块为单位的对称密钥加密算法，可以用长为128、192和256位的密钥加密。<br />
<strong>Base64 加密（编码）:<br />
</strong>先将要编码的信息内容（明文）以二进制流的形式排成一行，从高位开始，每6位为一个单位进行排列。例如，信息内容为字符流&#8220;ABCD&#8221;，在计算机中以ASCII码进行编码，因此对应的二进制流为：&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;01000001，01000010，01000011，01000100<br />
上述二进制流以6位为单位重新排列，结果为：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;010000，010100，001001，000011，010001，00<br />
由于末尾一组不足6位，在不足六位的后面补零，组成6位，结果为：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;010000，010100，001001，000011，010001，000000<br />
根据符号到数字的映射表，把6位二进制流对应的数值分别转化成相应的数字，重新整理成一个字符流<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/alancxx/2.JPG" border="0" /><br />
规定编码的原始字符流字节数应是3的整数倍，原始字符流&#8220;ABCD&#8221;还需要补足两个字节，总的字节数才能被3整除，为此后面需补上两个&#8220;=&#8221;字符，所以原始字符流&#8220;ABCD&#8221;的最终Base64编码为：<br />
&nbsp;QUJDRA== <br />
<strong>例: </strong>使用Openssl软件包，对文件进行BASE64编码与解码 <br />
openssl enc -base64 -d -in 026h23fbase64.txt&nbsp; -out 026h23fplain.txt <br />
<strong>&nbsp;ii ) 非对称加密</strong> <br />
非对称加密方法中使用一对密钥：公钥(public key)和私钥(private key)组合。用公钥加密的密文只能用私钥解密，反之，用私钥加密的密文只能用公钥解密。在操作过程中，公钥可向外界发布，让其他人知道，私钥则自己保存，只有自己知道。 <br />
<strong>RSA:<br />
</strong>由Ron Rivest,Adi Shamir和Leonard Adleman三人首创，是一种公开密钥加密方法；<br />
它的原理是：先由密钥管理中心产生一对公钥和私钥，称为密钥对。产生方法如下：先产生两个足够大的强质数p、q。可得p与q的乘积为 n=p&#215;q。再由p和q算出另一个数z=(p-1)&#215;(q-1)，然后再选取一个与z互素的奇数b，称b为公开指数；从这个b值可以找出另一个值a，并能满足b&#215;a=1 (mod z)条件。由此而得到的两组数(n，b)和(p，q，a)分别被称为公开密钥和秘密密钥，或简称公钥和私钥。若对明文信息x(0&lt;=x&lt;n)加密，其加密算法是y=E(x)=xb （mod n） ，而解密算法是D(y)=ya （mod n）。<br />
RSA算法基于大整数因子分解这一著名的数学难题<br />
<strong>RSA特点：<br />
</strong>优点：能适应网络的开放性要求，密钥管理简单，并且可方便地实现数字签名和身份认证等功能，是目前电子商务等技术的核心基础。<br />
缺点：算法复杂，加密数据的速度和效率较低，只能对小批量的数据进行加密。<br />
在实际应用中，通常将对称加密算法和非对称加密算法结合使用，利用对称加密算法来进行大容量数据的加密，而采用RSA等非对称加密算法来传递对称加密算法所使用的密钥，通过这种方法可以有效地提高加密的效率并能简化对密钥的管理。 <br />
<strong>例:</strong> 使用Openssl软件，产生一对RSA非对称密钥（公钥与私钥），并分别用它们来对某个文件进行加密和解密。<br />
<span style="color: #ff0000">openssl genrsa -des3 -out myrsaCA.key 1024</span>，将会产生一个RSA私钥，私钥放在myrsaCA.key文件中 ；<br />
用公钥加密的文件，以后需要用私钥来解密（加密模式）：<br />
<span style="color: #ff0000">openssl rsautl -encrypt -in 026h23f.txt -inkey myrsaCA.key -out pub026h23f.enc</span>&nbsp; <br />
<span style="color: #ff0000">openssl rsautl -decrypt -in pub026h23f.enc -inkey myrsaCA.key -out newpub026h23f.txt <br />
</span>用私钥加密的文件，以后需要用公钥来解密（签名模式）：<br />
<span style="color: #ff0000">openssl rsautl -sign -in 026h23f.txt -inkey myrsaCA.key -out pri026h23f.enc <br />
openssl rsautl -verify -in pri026h23f.enc -inkey myrsaCA.key -out newpri026h23f.txt<br />
&nbsp;<br />
</span><strong style="font-size: 24pt"><span style="color: #003366; font-family: 楷体_GB2312"><strong style="font-size: 24pt; font-family: ">防火墙技术</strong> <br style="font-family: " />
<br style="font-family: " />
</span></strong>1、实现保密的另外一种方法是进行存取访问控制，对敏感数据的访问实行身份验证，具备合法身份的允许其访问，不合法身份的禁止其访问，放火墙技术正是为实现这一目的而产生的。 <br />
2、&#8220;防火墙&#8221;是一种形象的说法, 其实它是一种由计算机硬件和软件的组合, 使互联网与内部网之间建立起一个安全网关( scurity gateway), 从而保护内部网免受非法用户的侵入，它其实就是一个把互联网与内部网（通常这局域网或城域网）隔开的屏障 <br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/alancxx/3.JPG" border="0" /><br />
<strong>类型<br />
1)包过滤型：<br />
</strong>包过滤型防火墙可以动态检查通过防火墙的TCP/IP报文头中的报文类型、源IP地址、目标IP地址、源端口号等信息，与预先保存在防火墙中的清单进行对照，按预定的安全策略决定哪些报文可以通过、哪些报文不可以通过。<br />
<strong>2)应用网关型：<br />
</strong>使用代理技术，在内部网与外部网之间建立一个单独的子网，该子网有一个代理主机，通过路由器和网关分别与内、外网连接，代理主机对外部和内部用户的网络服务请求进行认证，对于合法用户的服务请求，代理主机则连接内部网与外部网，自己作为通信的中介，外部用户只能获得经过代理的内部网服务，从而保护内部网络资源不受侵害。 <br />
<br />
<strong style="font-size: 24pt"><span style="color: #003366; font-family: 楷体_GB2312"><strong style="font-size: 24pt; font-family: ">数据完整性技术<br style="font-family: " />
</strong><br style="font-family: " />
</span></strong>要保证数据的完整性，技术上可以采用信息摘要（数字指纹）的方法或者采用数字签名的方法；<br />
<strong>数字摘要：<br />
</strong>采用单向Hash函数（如SHA，MD5等）对要传送的信息内容进行某种变换运算，得到固定长度的摘要信息<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/alancxx/4.JPG" border="0" /><br />
<strong>例:</strong> 使用Openssl软件，对某个文件产生数字摘要 。<br />
openssl&nbsp; dgst -md5&nbsp; -out&nbsp; 026h23f.md5&nbsp; 026h23f.txt<br />
<br />
<strong style="font-size: 24pt"><span style="font-family: 楷体_GB2312"><strong style="font-size: 24pt; font-family: "><span style="color: #003366"><strong style="font-size: 24pt"><span style="font-family: 楷体_GB2312"><strong style="font-size: 24pt; font-family: ">不可否认技术</strong> <br style="font-family: " />
</span></strong></span></strong><br style="font-family: " />
</span></strong>要达到不可否认的目的，可以采用数字签名和数字时间戳等技术 ；<br />
<strong>数字签名<br />
</strong><img alt="" src="http://www.blogjava.net/images/blogjava_net/alancxx/5.JPG" border="0" /><br />
<strong>例:</strong> 使用Openssl软件，对某个文件产生的数字摘要进行签名，并验证签名。<br />
<span style="color: #ff0000">openssl&nbsp; dgst -md5&nbsp; -out&nbsp; 026h23f.sign&nbsp; -sign&nbsp; 026h23f.key&nbsp;&nbsp; 026h23f.txt <br />
openssl&nbsp; dgst -md5&nbsp; -signature&nbsp; 026h23f.sign&nbsp; -prverify&nbsp; 026h23f.key&nbsp;&nbsp; 026h23f.txt <br />
</span><strong>数字时间戳</strong> <br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/alancxx/6.JPG" border="0" /><br />
<br />
<strong style="font-size: 24pt"><span style="color: #003366; font-family: 楷体_GB2312"><strong style="font-size: 24pt; font-family: ">身份认证技术<br style="font-family: " />
</strong><br style="font-family: " />
</span></strong>需要借助于数字证书的技术，设立安全认证中心，制定一系列的安全协议等来实现。<br />
<strong>1) 数字证书<br />
</strong>数字证书（Digital Certificate）是一种权威性的电子文档，提供了一种在Internet上验证身份的方式，其作用类似于司机的驾驶执照或日常生活中的身份证。它是利用数字签名技术由一个权威机构—CA证书认证(Certificate Authority)中心签发。 <br />
数字证书概念最早由MIT的Kohnfelder于1978年在他的本科毕业论文中提出，内容是通过数字签名来保护命名的证书（名字／密钥对），从而可将公钥分散存放和访问，克服将公钥集中存放到一个数据库中而带来的访问性能问题，因此，数字证书除了可用于网上证明交易者的身份，还有另外一个作用，可以利用它来分发交易者的公钥。<br />
<strong>2) 数字证书颁发过程<br />
</strong>用户向注册中心RA提出申请，注册中心首先为用户产生密钥对，然后生成一个称为csr（数字证书请求）的文件，内含公钥及部分用户身份信息；认证中心CA收到RA的csr文件后，将执行一些必要的核实步骤，以确信请求是真实的，然后进行签名，生成数字证书。这样该证书内包含有用户的个人信息和他的公钥信息，同时还附有认证中心的签名信息。 <br />
<strong>数字证书类型<br />
</strong>按用途：个人数字证书、服务器数字证书、代码签名证书；<br />
按格式：X.509、 PGP、 SDSI/SPKI、 X9.59(AADS)、 AC等类型的证书；<br />
按协议：SSL证书（服务于银行对企业或企业对企业的电子商务活动）、SET证书(服务于持卡消费、网上购物)等。<br />
<strong>X.509数字证书的数据结构 <br />
</strong><img alt="" src="http://www.blogjava.net/images/blogjava_net/alancxx/7.JPG" border="0" /><br />
<strong>3) 认证中心</strong> <br />
认证中心CA（Certificate Authority），作为电子交易中受信任的第三方，负责为电子商务环境中各个实体颁发数字证书，以证明各实体身份的真实性，并负责在交易中检验和管理证书 。<br />
<strong>CA认证中心的功能主要有：</strong>证书发放、证书更新、证书撤销和证书验证。<br />
具体为：<br />
接收验证用户数字证书的申请。<br />
确定是否接受用户数字证书的申请，即证书的审批。<br />
向申请者颁发（或拒绝颁发）数字证书。<br />
接收、处理用户的数字证书更新请求。<br />
接收用户数字证书的查询、撤销。<br />
产生和发布证书的有效期。<br />
数字证书的归档。<br />
密钥归档。<br />
历史数据归档。<br />
VeriSign 是最大的公共 CA ，中国数字认证网、中国商务在线 <br />
<strong>4) 数字证书的申请与应用 <br />
</strong>首先在认证中心的网站上下载并安装认证中心的根证书（所谓根证书，是指认证中心自己为自己颁发的数字证书）；然后填写相关的申请表格，提交相关材料，提出申请，认证中心收到申请后，将为用户生成一个临时的证书，并将证书的序列号返回给用户；接下来，认证中心对用户身份进行仔细核查，核查通过后将为用户颁发由自己签过名的正式数字证书，用户得到此证书后就可以进行譬如对电子邮件进行加密等操作了 。<br />
<strong>例:</strong> 利用Openssl软件，为用户颁发数字证书 <br />
<br />
<strong><span style="font-size: 24pt"><strong style="color: #003366; font-family: 楷体_GB2312">安全协议</strong></span> <br />
<br />
常用的安全协议:</strong>安全套接层协议、安全电子交易协议、安全超文本传输协议、安全多媒体Internet邮件扩展协议等 。<br />
安全套接层协议（SSL，Secure Sockets Layer） <br />
SSL安全协议最初是由Netscape Communication公司设计开发；<br />
SSL安全协议主要提供三方面的服务：<br />
一是用户和服务器的合法性认证；<br />
二是加密数据以隐藏被传送的数据；<br />
三是保护数据的完整性。<br />
<strong>安全套接层协议的通信过程 ：<br />
</strong>接通阶段：客户通过网络向服务商打招呼，服务商回应；&nbsp;&nbsp; <br />
密码交换阶段：客户与服务器之间交换双方认可的密码，一般选用RSA密码算法，也有的选用Diffie-Hellmanf和Fortezza-KEA密码算法；&nbsp;&nbsp; <br />
会谈密码阶段：客户与服务商间产生彼此交谈的会谈密码；&nbsp;&nbsp; <br />
检验阶段：检验服务商取得的密码；&nbsp;&nbsp; <br />
客户认证阶段：验证客户的可信度；&nbsp;&nbsp; <br />
&#8230;&#8230;加密资料传送&#8230;&#8230;<br />
结束阶段，客户与服务商之间相互交换结束的信息<br />
<strong>安全套接层协议的缺点 ：<br />
i ) </strong>SSL协议运行的基点是商家对客户信息保密的承诺。但在上述流程中我们也可以注意到，SSL协议有利于商家而不利于客户。客户的信息首先传到商家，商家阅读后再传至银行，这样，客户资料的安全性便受到威胁。<br />
商家认证客户是必要的，但整个过程中，缺少了客户对商家的认证。在电子商务的开始阶段，由于参与电子商务的公司大都是一些大公司，信誉较高，这个问题没有引起人们的重视。随着电子商务参与的厂商迅速增加，对厂商的认证问题越来越突出，SSL协议的缺点完全暴露出来。<br />
安全电子交易协议（SET，Secure Electronic Transaction） <br />
<strong>ii )</strong> 为了克服SSL安全协议的缺点，满足电子交易持续不断地增加的安全要求，为了达到交易安全及合乎成本效益的市场要求，VISA国际组织及其它公司如Master Card、Micro Soft、IBM等共同制定了安全电子交易协议。这是一个为在线交易而设立的一个开放的、以电子货币为基础的电子付款系统规范，它采用公钥密码体制和X.509数字证书标准，主要应用于BtoC模式中保障支付信息的安全性； <br />
SET在保留对客户信用卡认证的前提下，又增加了对商家身份的认证 （双重签名）；<br />
SET协议比SSL协议复杂 。<br />
安全电子交易协议要达到的目标<br />
保证电子商务参与者信息的相互隔离。客户的资料加密或打包后边过商家到达银行，但是商家不能看到客户的账户和密码信息；&nbsp;&nbsp; <br />
保证信息在因特网上安全传输，防止数据被黑客或被内部人员窃取；&nbsp;&nbsp; <br />
解决多方认证问题，不仅要对消费者的信用卡认证，而且要对在线商店的信誉程度认证，同时还有消费者、在线商店与银行间的认证；&nbsp;&nbsp; <br />
保证了网上交易的实时性，使所有的支付过程都是在线的；&nbsp;&nbsp; <br />
规范协议和消息格式，促使不同厂家开发的软件具有兼容性和互操作功能，并且可以运行在不同的硬件和操作系统平台上。&nbsp;&nbsp;&nbsp;<br />
<strong>SET安全协议的工作原理主要包括以下7个步骤：</strong>&nbsp;&nbsp; <br />
消费者利用已有的计算机通过因特网选定物品，并下电子订单；&nbsp;&nbsp; <br />
通过电子商务服务器与网上商场联系，网上商场做出应答，告诉消费者的订单的相关情况；&nbsp;&nbsp; <br />
消费者选择付款方式，确认订单，签发付款指令（此时SET介入）；&nbsp;&nbsp; <br />
在SET中，消费者必须对定单和付款指令进行数字签名，同时利用双重签名技术保证商家看不到消费者的账号信息；&nbsp;&nbsp; <br />
在线商店接受定单后，向消费者所在银行请求支付认可，信息通过支付网关到收单银行，再到电子货币发行公司确认，批准交易后，返回确认信息给在线商店；&nbsp;&nbsp; <br />
在线商店发送定单确认信息给消费者，消费者端软件可记录交易日志，以备将来查询；&nbsp;&nbsp; <br />
在线商店发送货物或提供服务，并通知收单银行将钱从消费者的账号转移到商店账号，或通知发卡银行请求支付。<br />
<strong style="font-size: 24pt"><br />
<span style="color: #003366; font-family: 楷体_GB2312">其他安全协议<br style="font-family: " />
</span></strong><br />
安全超文本传输协议，即S-HTTP：基于SSL，通过密钥加密技术，保障了Web站点上信息的安全，为Web文档提供完整性、鉴别、不可抵赖和机密性等安全措施。支持S-HTTP协议的网站URL以shttp://标识开始。<br />
安全多媒体Internet邮件扩展协议（S/MIME）：用于安全地传输电子邮件&nbsp; <br />
<br />
<strong style="font-size: 24pt; color: #003366; font-family: 楷体_GB2312">PKI技术</strong> <br />
<br />
PKI体系结构采用证书来管理公钥，通过第三方的可信机构CA，把用户的公钥和用户的其他标识信息（如名称、e-mail、身份证号等）捆绑在一起，在Internet网上验证用户的身份；同时，在PKI体系结构中，把公钥密码和对称密码结合起来，以实现密钥的自动管理，保证网上数据的机密性、完整性。 <br />
广义上，所有提供公钥加密和数字签名服务的系统，都可叫做PKI系统 。<br />
狭义上，符合PKCS(公开钥密码标准，public-Key cryptography Standard)的系统。典型、完整、有效的PKI应用系统至少应具有以下部分： 公钥密码证书管理、黑名单的发布和管理、密钥的备份和恢复、自动更新密钥、自动管理历史密钥、支持交叉认证。 <br />
<br />
<strong style="font-size: 24pt; color: #00ccff; font-family: 楷体_GB2312">思考:<br />
</strong><br />
电子商务的安全需求有哪些？为保障安全，各采用什么技术？<br />
什么是信息安全？其安全保障体系有哪几方面？<br />
数据完整、不可否认的含义是什么？<br />
现代加密技术的种类有哪些？请用Openssl软件对某个文件进行加密。<br />
什么是对称加密？什么是非对称加密？常见的对称加密与非对称加密算法有哪几种？<br />
对称加密和非对称加密的优缺点各是什么？<br />
什么是数字签名?数字签名的作用是什么？写出数字签名的过程。<br />
什么是数字证书？数字证书的颁发一般有哪些过程？<br />
数字证书的作用是什么？CA的作用是什么？试用Openssl给某个用户颁发一份证书。<br />
Openssl命令中与加密有关的命令有哪些？与证书生成有关的命令有哪些？<br />
常见的安全协议有哪些？试比较SSL协议和SET协议。<br />
SSL协议有那些缺点？<br />
上网申请一份数字证书，并利用此证书给某人发一封签名的电子邮件。</p>
<img src ="http://www.blogjava.net/alancxx/aggbug/344131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alancxx/" target="_blank">蜂鸟</a> 2011-02-12 13:34 <a href="http://www.blogjava.net/alancxx/articles/344131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>openssl使用手册</title><link>http://www.blogjava.net/alancxx/articles/344111.html</link><dc:creator>蜂鸟</dc:creator><author>蜂鸟</author><pubDate>Sat, 12 Feb 2011 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/alancxx/articles/344111.html</guid><wfw:comment>http://www.blogjava.net/alancxx/comments/344111.html</wfw:comment><comments>http://www.blogjava.net/alancxx/articles/344111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alancxx/comments/commentRss/344111.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alancxx/services/trackbacks/344111.html</trackback:ping><description><![CDATA[
openSSL有两种运行模式：交互模式和批处理模式。
直接输入openssl回车进入交互模式，输入带命令选项的openssl进入批处理模式。

(1) 配置文件

OpenSSL的默认配置文件位置不是很固定，可以用openssl ca命令得知。
你也可以指定自己的配置文件。
当前只有三个OpenSSL命令会使用这个配置文件：ca, req, x509。有望未来版本会有更多命令使用配置文件。

(2)消息摘要算法

支持的算法包括：MD2, MD4, MD5, MDC2, SHA1(有时候叫做DSS1), RIPEMD-160。SHA1和RIPEMD-160产生160位哈西值,其他的产生128位。除非出于兼容性考虑，否则推荐使用SHA1或者RIPEMD-160。

除了RIPEMD-160需要用rmd160命令外，其他的算法都可用dgst命令来执行。

OpenSSL对于SHA1的处理有点奇怪，有时候必须把它称作DSS1来引用。

消息摘要算法除了可计算哈西值，还可用于签名和验证签名。签名的时候，对于DSA生成的私匙必须要和DSS1(即SHA1)搭配。而对于RSA生成的私匙，任何消息摘要算法都可使用。
#############################################################
# 消息摘要算法应用例子

# 用SHA1算法计算文件file.txt的哈西值，输出到stdout
$ openssl dgst -sha1 file.txt

# 用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt
$ openssl sha1 -out digest.txt file.txt

# 用DSS1(SHA1)算法为文件file.txt签名,输出到文件dsasign.bin
# 签名的private key必须为DSA算法产生的，保存在文件dsakey.pem中
$ openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt

# 用dss1算法验证file.txt的数字签名dsasign.bin，
# 验证的private key为DSA算法产生的文件dsakey.pem
$ openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt

# 用sha1算法为文件file.txt签名,输出到文件rsasign.bin
# 签名的private key为RSA算法产生的文件rsaprivate.pem
$ openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt

# 用sha1算法验证file.txt的数字签名rsasign.bin，
# 验证的public key为RSA算法生成的rsapublic.pem
$ openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt
(3) 对称密码

OpenSSL支持的对称密码包括Blowfish, CAST5, DES, 3DES(Triple DES), IDEA, RC2, RC4以及RC5。OpenSSL 0.9.7还新增了AES的支持。很多对称密码支持不同的模式，包括CBC, CFB, ECB以及OFB。对于每一种密码，默认的模式总是CBC。需要特别指出的是，尽量避免使用ECB模式，要想安全地使用它难以置信地困难。

enc命令用来访问对称密码，此外还可以用密码的名字作为命令来访问。除了加解密，base64可作为命令或者enc命令选项对数据进行base64编码/解码。

当你指定口令后，命令行工具会把口令和一个8字节的salt(随机生成的)进行组合，然后计算MD5 hash值。这个hash值被切分成两部分：加密钥匙(key)和初始化向量(initialization vector)。当然加密钥匙和初始化向量也可以手工指定，但是不推荐那样，因为容易出错。
#############################################################
# 对称加密应用例子

# 用DES3算法的CBC模式加密文件plaintext.doc，
# 加密结果输出到文件ciphertext.bin
$ openssl enc -des3 -salt -in plaintext.doc -out ciphertext.bin

# 用DES3算法的OFB模式解密文件ciphertext.bin，
# 提供的口令为trousers，输出到文件plaintext.doc
# 注意：因为模式不同，该命令不能对以上的文件进行解密
$ openssl enc -des-ede3-ofb -d -in ciphertext.bin -out plaintext.doc -pass pass:trousers

# 用Blowfish的CFB模式加密plaintext.doc，口令从环境变量PASSWORD中取
# 输出到文件ciphertext.bin
$ openssl bf-cfb -salt -in plaintext.doc -out ciphertext.bin -pass env:PASSWORD

# 给文件ciphertext.bin用base64编码，输出到文件base64.txt
$ openssl base64 -in ciphertext.bin -out base64.txt

# 用RC5算法的CBC模式加密文件plaintext.doc
# 输出到文件ciphertext.bin，
# salt、key和初始化向量(iv)在命令行指定
$ openssl rc5 -in plaintext.doc -out ciphertext.bin -S C62CB1D49F158ADC -iv E9EDACA1BD7090C6 -K
89D4B1678D604FAA3DBFFD030A314B29
(4)公匙密码

4.1 Diffie-Hellman

被用来做钥匙协商(key agreement)，具有保密(secrecy)功能，但是不具有加密(encryption)或者认证(authentication)功能，因此在进行协商前需用别的方式对另一方进行认证。

首先，Diffie-Hellman创建一套双方都认可的参数集，包括一个随机的素数和生成因子(generator value，通常是2或者5)。基于这个参数集，双方都计算出一个公钥匙和私钥匙，公钥匙交给对方，对方的公钥匙和自己的私钥匙用来计算共享的钥匙。

OpenSSL 0.9.5 提供了dhparam命令用来生成参数集，但是生成公钥匙和私钥匙的命令dh和gendh已不推荐使用。未来版本可能会加上这个功能。
#############################################################
# Diffie-Hellman应用例子

# 使用生成因子2和随机的1024-bit的素数产生D0ffie-Hellman参数
# 输出保存到文件dhparam.pem
$ openssl dhparam -out dhparam.pem -2 1024

# 从dhparam.pem中读取Diffie-Hell参数，以C代码的形式
# 输出到stdout
$ openssl dhparam -in dhparam.pem -noout -C
4.2 数字签名算法(Digital Signature Algorithm, DSA)

主要用来做认证，不能用来加密(encryption)或者保密(secrecy)，因此它通常和Diffie-Hellman配合使用。在进行钥匙协商前先用DSA进行认证(authentication)。

有三个命令可用来完成DSA算法提供的功能。
dsaparam命令生成和检查DSA参数，还可生成DSA私钥匙。
gendsa命令用来为一套DSA参数生成私钥匙，这把私钥匙可明文保存，也可指定加密选项加密保存。可采用DES，3DES，或者IDEA进行加密。
dsa命令用来从DSA的私钥匙中生成公钥匙，还可以为私钥匙加解密，或者改变私钥匙加密的口令。
#############################################################
# DSA应用例子

# 生成1024位DSA参数集，并输出到文件dsaparam.pem
$ openssl dsaparam -out dsaparam.pem 1024

# 使用参数文件dsaparam.pem生成DSA私钥匙，
# 采用3DES加密后输出到文件dsaprivatekey.pem
$ openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem

# 使用私钥匙dsaprivatekey.pem生成公钥匙，
# 输出到dsapublickey.pem
$ openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem

# 从dsaprivatekey.pem中读取私钥匙，解密并输入新口令进行加密，
# 然后写回文件dsaprivatekey.pem
$ openssl dsa -in dsaprivatekey.pem -out dsaprivatekey.pem -des3 -passin
4.3 RSA

RSA得名于它的三位创建者：Ron Rivest, Adi Shamir, Leonard Adleman。
目前之所以如此流行，是因为它集保密、认证、加密的功能于一体。

不像Diffie-Hellman和DSA，RSA算法不需要生成参数文件，这在很大程度上简化了操作。

有三个命令可用来完成RSA提供的功能。
genrsa命令生成新的RSA私匙，推荐的私匙长度为1024位，不建议低于该值或者高于2048位。
缺省情况下私匙不被加密，但是可用DES、3DES或者IDEA加密。
rsa命令可用来添加、修改、删除私匙的加密保护，也可用来从私匙中生成RSA公匙，或者用来显示私匙或公匙信息。
rsautl命令提供RSA加密和签名功能。但是不推荐用它来加密大块数据，或者给大块数据签名，因为这种算法的速度较来慢。通常用它给对称密
匙加密，然后通过enc命令用对称密匙对大块数据加密。
#############################################################
# RSA应用例子

# 产生1024位RSA私匙，用3DES加密它，口令为trousers，
# 输出到文件rsaprivatekey.pem
$ openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024

# 从文件rsaprivatekey.pem读取私匙，用口令trousers解密，
# 生成的公钥匙输出到文件rsapublickey.pem
$ openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem

# 用公钥匙rsapublickey.pem加密文件plain.txt，
# 输出到文件cipher.txt
$ openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt

# 使用私钥匙rsaprivatekey.pem解密密文cipher.txt，
# 输出到文件plain.txt
$ openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt

# 用私钥匙rsaprivatekey.pem给文件plain.txt签名，
# 输出到文件signature.bin
$ openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin

# 用公钥匙rsapublickey.pem验证签名signature.bin，
# 输出到文件plain.txt
$ openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain.txt
(5) S/MIME[Secure Multipurpose Internet Mail Exchange]

S/MIME应用于安全邮件交换，可用来认证和加密，是PGP的竞争对手。与PGP不同的是，它需要一套公匙体系建立信任关系，而PGP只需直接从 某个地方获取对方的公匙就可以。然而正因为这样，它的扩展性比PGP要好。另一方面，S/MIME可以对多人群发安全消息，而PGP则不能。

命令smime可用来加解密、签名、验证S/MIME v2消息(对S/MIME v3的支持有限而且很可能不工作)。对于没有内置S/MIME支持的应用来说，可通过smime来处理进来(incoming)和出去(outgoing)的消息。
#############################################################
# RSA应用例子

# 从X.509证书文件cert.pem中获取公钥匙，
# 用3DES加密mail.txt
# 输出到文件mail.enc
$ openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem

# 从X.509证书文件cert.pem中获取接收人的公钥匙，
# 用私钥匙key.pem解密S/MIME消息mail.enc，
# 结果输出到文件mail.txt
$ openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt

# cert.pem为X.509证书文件，用私匙key,pem为mail.txt签名，
# 证书被包含在S/MIME消息中，输出到文件mail.sgn
$ openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn

# 验证S/MIME消息mail.sgn，输出到文件mail.txt
# 签名者的证书应该作为S/MIME消息的一部分包含在mail.sgn中
$ openssl smime -verify -in mail.sgn -out mail.txt
(6) 口令和口令输入(passphase)

OpenSSL口令选项名称不是很一致，通常为passin和passout。可以指定各种各样的口令输入来源，不同的来源所承担的风险取决于你的接受能力。

stdin
这种方式不同于缺省方式，它允许重定向标准输入，而缺省方式下是直接从真实的终端设备(TTY)读入口令的。

pass:
直接在命令行指定口令为password。不推荐这样使用。

env:
从环境变量中获取口令，比pass方式安全了些，但是进程环境仍可能被别有用心的进程读到。

file:
从文件中获取，注意保护好文件的安全性。

fd:
从文件描述符中读取。通常情况是父进程启动OpenSSL命令行工具，由于OpenSSL继承了父进程的文件描述符，因此可以从文件描述符中读取口令。

(7) 重置伪随机数生成器(Seeding the Pseudorandom Number Generator)

对于OpenSSL，正确地重置PRNG(Pseudo Random Number Generator)很重要。
命令行工具会试图重置PRNG，当然这不是万无一失的。如果错误发生，命令行工具会生成一条警告，这意味着生成的随机数是可预料的，这时就应该采用一种更可靠的重置机制而不能是默认的。

在Windows系统，重置PRNG的来源很多，比如屏幕内容。在Unix系统，通常通过设备/dev/urandom来重置PRNG。从0.9.7开始，OpenSSL还试图通过连接EGD套接字来重置PRNG。

除了基本的重置来源，命令行工具还会查找包含随机数据的文件。假如环境变量RANDFILE被设置，它的值就可以用来重置PRNG。如果没有设置，则HOME目录下的.rnd文件将会使用。

OpenSSL还提供了一个命令rand用来指定重置来源文件。来源文件之间以操作系统的文件分割字符隔开。对于Unix系统，如果来源文件是EGD套接字，则会从EGD服务器获取随机数。

EGD服务器是用Perl写成的收集重置来源的daemon，可运行在装了Perl的基于Unix的系统，见http://egd.sourceforge.net。如果没有/dev/random或者/dev/urandom，EGD是一个不错的候选。

EGD不能运行在Windows系统中。对于Windows环境，推荐使用EGADS(Entropy Gathering And Distribution System)。它可运行在Unix和Windows系统中，见http://www.securesw.com/egads。

(本文参考O&#8217;Reilly-Network Security with OpenSSL)




OPENSSL SUPPORTED CIPHERS:

 base64             Base 64
 bf-cbc             Blowfish in CBC mode
 bf                 Alias for bf-cbc
 bf-cfb             Blowfish in CFB mode
 bf-ecb             Blowfish in ECB mode
 bf-ofb             Blowfish in OFB mode
 cast-cbc           CAST in CBC mode
 cast               Alias for cast-cbc
 cast5-cbc          CAST5 in CBC mode
 cast5-cfb          CAST5 in CFB mode
 cast5-ecb          CAST5 in ECB mode
 cast5-ofb          CAST5 in OFB mode
 des-cbc            DES in CBC mode
 des                Alias for des-cbc
 des-cfb            DES in CBC mode
 des-ofb            DES in OFB mode
 des-ecb            DES in ECB mode
 des-ede-cbc        Two key triple DES EDE in CBC mode
 des-ede            Two key triple DES EDE in ECB mode
 des-ede-cfb        Two key triple DES EDE in CFB mode
 des-ede-ofb        Two key triple DES EDE in OFB mode
 des-ede3-cbc       Three key triple DES EDE in CBC mode
 des-ede3           Three key triple DES EDE in ECB mode
 des3               Alias for des-ede3-cbc
 des-ede3-cfb       Three key triple DES EDE CFB mode
 des-ede3-ofb       Three key triple DES EDE in OFB mode
 desx               DESX algorithm.
 gost89             GOST 28147-89 in CFB mode (provided by ccgost engine)
 gost89-cnt        `GOST 28147-89 in CNT mode (provided by ccgost engine)
 idea-cbc           IDEA algorithm in CBC mode
 idea               same as idea-cbc
 idea-cfb           IDEA in CFB mode
 idea-ecb           IDEA in ECB mode
 idea-ofb           IDEA in OFB mode
 rc2-cbc            128 bit RC2 in CBC mode
 rc2                Alias for rc2-cbc
 rc2-cfb            128 bit RC2 in CFB mode
 rc2-ecb            128 bit RC2 in ECB mode
 rc2-ofb            128 bit RC2 in OFB mode
 rc2-64-cbc         64 bit RC2 in CBC mode
 rc2-40-cbc         40 bit RC2 in CBC mode
 rc4                128 bit RC4
 rc4-64             64 bit RC4
 rc4-40             40 bit RC4
 rc5-cbc            RC5 cipher in CBC mode
 rc5                Alias for rc5-cbc
 rc5-cfb            RC5 cipher in CFB mode
 rc5-ecb            RC5 cipher in ECB mode
 rc5-ofb            RC5 cipher in OFB mode
 aes-[128|192|256]-cbc  128/192/256 bit AES in CBC mode
 aes-[128|192|256]      Alias for aes-[128|192|256]-cbc
 aes-[128|192|256]-cfb  128/192/256 bit AES in 128 bit CFB mode
 aes-[128|192|256]-cfb1 128/192/256 bit AES in 1 bit CFB mode
 aes-[128|192|256]-cfb8 128/192/256 bit AES in 8 bit CFB mode
 aes-[128|192|256]-ecb  128/192/256 bit AES in ECB mode
 aes-[128|192|256]-ofb  128/192/256 bit AES in OFB mode

<img src ="http://www.blogjava.net/alancxx/aggbug/344111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alancxx/" target="_blank">蜂鸟</a> 2011-02-12 10:28 <a href="http://www.blogjava.net/alancxx/articles/344111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>