Jelline 发表于 2011-12-22 08:54

密码传情之密码机制

<p style="margin-bottom: 0cm"><span class="Apple-style-span" style="font-size: large;"><b><font class="Apple-style-span" face="黑体">摘要:</font></b></span></p><p style="margin-bottom: 0cm"><span class="Apple-style-span" style="font-size: large;">  本文结合代码讲述了中兴捧月杯密码传情中的密码策略,包括密码策略约束条件分析、密码策略设计、5种编码介绍,最后附源代码。</span></p><p style="margin-bottom: 0cm"><span class="Apple-style-span" style="font-size: 13.8889px; "><span class="Apple-style-span" style="font-size: large;"><br></span></span></p><p style="margin-bottom: 0cm"><span class="Apple-style-span" style="font-size: 13.8889px; "><span class="Apple-style-span" style="font-size: large;">  参加了中兴通讯第三届</span><font face="DejaVu Serif, serif"><span class="Apple-style-span" style="font-size: large;">"</span></font><span class="Apple-style-span" style="font-size: large;">中兴捧月</span><font face="DejaVu Serif, serif"><span class="Apple-style-span" style="font-size: large;">"</span></font><span class="Apple-style-span" style="font-size: large;">杯校园程序设计大赛,后来因项目原因,小组讨论一致决定放弃这个比赛。我主要负责密码策略分析与实现,原本可以在没提交作品之前整理上来,结果去了趟长沙,回来忙了一段时间的项目。直到现在才整理:-(</span></span></p><p style="margin-bottom: 0cm"><span class="Apple-style-span" style="font-size: large; "><b><font class="Apple-style-span" face="黑体">一、题目理解</font></b></span></p><p style="margin-bottom: 0cm"><span class="Apple-style-span" style="font-size: large;">&nbsp;&nbsp; &nbsp;题目下载,点这里</span><a href=".http://blog.chinaunix.net/attachment/attach/91/12/80/039112803eba7f9f9c5257d052e71d48016d805b8.doc" target="_blank" target="_blank"><span class="Apple-style-span" style="font-size: large;"><img border="0" align="absmiddle" src="/blog/image/attachicons/msoffice.gif">&nbsp;中兴捧月_密码传情_题目.doc </span></a><span class="Apple-style-span" style="font-size: large;">&nbsp;&nbsp;整个题目旨在编写一款聊天软件,并对数据加解密。题目涉及到编解码要求,主要有两句:</span></p><p style="margin-bottom: 0cm"><span class="Apple-style-span" style="font-size: large;">(1)&nbsp;</span><span class="Apple-style-span" style="line-height: 25px; "><span class="Apple-style-span" style="font-size: large;">编码与解码的每一步结果,将可以调试输出</span></span></p>

<p style="margin-bottom: 0cm"><span class="Apple-style-span" style="font-size: large;">(2)</span><span class="Apple-style-span" style="line-height: 25px; "><span class="Apple-style-span" style="font-size: large;">设计中需要分析策略中各种编码方法的约束条件。最大策略设计为不超过</span><font face="DejaVu Serif, serif"><span class="Apple-style-span" style="font-size: large;">8</span></font><span class="Apple-style-span" style="font-size: large;">次编码,</span></span><span class="Apple-style-span" style="font-size: large;">加密</span><span class="Apple-style-span" style="line-height: 25px; "><span class="Apple-style-span" style="font-size: large;">最后两步必须为手机编码和摩尔斯编码</span></span></p><p style="margin-bottom: 0cm"><span class="Apple-style-span" style="line-height: 30px; "><span class="Apple-style-span" style="font-size: large;">&nbsp;&nbsp; &nbsp;做完之后,回过头来发现其实挺简单的,因为编码/解码仅仅涉及到字符串一一映射,主要是对字符串的一些操作:-)</span></span></p><span class="Apple-style-span" style="font-size: large;">

</span><p style="margin-bottom: 0cm"><span class="Apple-style-span" style="font-size: large;"><b>2.1 每一步编解码可调试输出</b></span></p><p style="margin-bottom: 0cm"><span class="Apple-style-span" style="font-size: large;">&nbsp;&nbsp; &nbsp;这句话我的理解是,每一步编码/解码需要单独实现。而不能通过分析几种编码内在联系,一次性完成几步编码过程。比如加密策略采取</span><span class="Apple-style-span" style="line-height: 25px; "><span class="Apple-style-span" style="font-size: large;">倒序、栅栏、</span><font face="DejaVu Serif, serif"><span class="Apple-style-span" style="font-size: large;">QWE</span></font><span class="Apple-style-span" style="font-size: large;">、栅栏、</span><font face="DejaVu Serif, serif"><span class="Apple-style-span" style="font-size: large;">QWE</span></font><span class="Apple-style-span" style="font-size: large;">、手机、摩尔斯,可以分析这几步编码内在关系(因为是一一对应),得到更简单的映射关系,这就使得每一步编解码无法调试输出。</span></span></p><p style="margin-bottom: 0cm"><span class="Apple-style-span" style="line-height: 30px; "><span class="Apple-style-span" style="font-size: large;"><b>2.2 策略约束条件</b></span></span></p><p style="margin-bottom: 0cm"><span class="Apple-style-span" style="line-height: 43px; "><span class="Apple-style-span" style="font-size: large;">&nbsp;&nbsp; &nbsp;纵观这5种编解码,所涉及到字符串可分为三类:字母(a~z)、数学(0~9)、由*-组成的字符串(记为:*-)。具体转化如下(以加密为例,解密类似,箭头反向即可):</span></span></p><p style="margin-bottom: 0cm"><font class="Apple-style-span" color="#333333"><span class="Apple-style-span" style="line-height: 43px; "><span class="Apple-style-span" style="font-size: large;"></span></span></font></p><font class="Apple-style-span" color="#333333"><p style="text-align: center;margin-bottom: 0cm; "></p><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li style="text-align: center;"><span class="Apple-style-span" style="font-size: large;">字母、数字、*-<b>—倒叙—&gt;</b> 字母、数字、*-</span></li><li style="text-align: center;"><span class="Apple-style-span" style="font-size: large;">
字母、数字、*-<b>—栅栏—&gt;</b> 字母、数字、*-</span></li><li style="text-align: center;"><span class="Apple-style-span" style="font-size: large;">
字母<b>—QWE—&gt;</b> 字母</span></li><li style="text-align: center;"><span class="Apple-style-span" style="font-size: large;">
字母<b>—手机—&gt;</b> 数字</span></li><li style="text-align: center;"><span class="Apple-style-span" style="font-size: large;">
数字 <b>—Morse—&gt;</b> *-</span></li></ol></div><p></p><p style="text-align: left;margin-bottom: 0cm; "><span class="Apple-style-span" style="font-size: large;"><font class="Apple-style-span" color="#000000">&nbsp;&nbsp; &nbsp;转化为状态转化图如下:(花絮,我最开始想到的是用图论建模,行不通,后来考虑到有状态转换,于是作成状态转换图)</font></span></p></font><p></p><p style="margin-bottom: 0cm"><span class="Apple-style-span" style="font-size: 14.1667px; "><a href="http://blog.chinaunix.net/attachment/201108/12/9112803_13131554929D9g.jpg" target="_blank" target="_blank"><img src="http://blog.chinaunix.net/attachment/201108/12/9112803_13131554929D9g.jpg" .load="imgResize(this, 650);" border="0" ;=""></a></span></p><div><br></div><div><br></div><div><span class="Apple-style-span" style="font-size: 14.1667px; "><span class="Apple-style-span" style="font-size: large;">上图是用visio软件作的,下载源文件点这里</span><a href=".http://blog.chinaunix.net/attachment/attach/91/12/80/039112803c797868c38a04a31cdb8feee9e3c0044.rar" target="_blank" target="_blank"><img border="0" align="absmiddle" src="/blog/image/attachicons/rar.gif">&nbsp;状态转换图.rar&nbsp;</a></span><span class="Apple-style-span" style="font-size: 14.1667px; ">&nbsp;</span></div><div><span class="Apple-style-span" style="font-size: 14.1667px; "><br></span></div><div><span class="Apple-style-span" style="font-size: large;"><font class="Apple-style-span" face="黑体"><b>二、总体设计</b></font></span></div><div><span class="Apple-style-span" style="font-size: large;"><b>2.1 加密策略</b></span></div><div><span class="Apple-style-span" style="font-size: large;">&nbsp;&nbsp; &nbsp;因为加密过程最后两步已指定为手机和摩尔斯,再由上图1的状态转换可以得出,前面的策略只能在倒叙、栅栏、QWE进行排列(选择手机码或者摩尔斯码就回不去了,当然也可以只采用这两种编码)。</span></div><div><span class="Apple-style-span" style="font-size: large;">&nbsp;&nbsp; &nbsp;我的思路,是在客户端做六个下拉框(因为题目要求最多只能8次编码,减去指定2种),每个下拉框有:倒叙、栅栏、QWE、不选。如此,我从客户端获得编码字符串代号,比如rfq,即表示编码过程为倒叙、栅栏、QWE、手机、摩尔斯。加密策略部分源代码如下:</span></div><div><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;"><span style="color:#FF9900;">//Encryption</span><br></span></li><li>
<span style="color:#FF9900;">//policy 最后两步是手机编码、Morse码,policy无须包括cm</span><br></li><li>
<span style="color:#0000FF;">int</span> encryption<span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>dst<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>src<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span><span style="color:#FF0000;">policy</span><span style="color:#0000CC;">,</span> <span style="color:#0000FF;">int</span> rows<span style="color:#0000CC;">)</span><br></li><li>
<span style="color:#0000CC;">{</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">char</span> c_cf<span style="color:#0000CC;">;</span> <span style="color:#FF9900;">//code function</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>middleStr <span style="color:#0000CC;">=</span> <span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span><span style="color:#0000CC;">)</span>malloc<span style="color:#0000CC;">(</span>sizeof<span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">*</span>BUFFERSIZE<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">while</span> <span style="color:#0000CC;">(</span><span style="color:#0000CC;">(</span>c_cf<span style="color:#0000CC;">=</span><span style="color:#0000CC;">*</span><span style="color:#FF0000;">policy</span><span style="color:#0000CC;">+</span><span style="color:#0000CC;">+</span><span style="color:#0000CC;">)</span> <span style="color:#0000CC;">!</span><span style="color:#0000CC;">=</span> <span style="color:#FF00FF;">'\0'</span><span style="color:#0000CC;">)</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000CC;">{</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy<span style="color:#0000CC;">(</span>middleStr<span style="color:#0000CC;">,</span> dst<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">switch</span><span style="color:#0000CC;">(</span>c_cf<span style="color:#0000CC;">)</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000CC;">{</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">case</span> <span style="color:#FF00FF;">'r'</span><span style="color:#0000CC;">:</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cf_reverse<span style="color:#0000CC;">(</span>dst<span style="color:#0000CC;">,</span>middleStr<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">break</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">case</span> <span style="color:#FF00FF;">'f'</span><span style="color:#0000CC;">:</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cf_fence<span style="color:#0000CC;">(</span>dst<span style="color:#0000CC;">,</span> middleStr<span style="color:#0000CC;">,</span> rows<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">break</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">case</span> <span style="color:#FF00FF;">'q'</span><span style="color:#0000CC;">:</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cf_qwe<span style="color:#0000CC;">(</span>dst<span style="color:#0000CC;">,</span> middleStr<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">break</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">default</span><span style="color:#0000CC;">:</span><br></li><li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <font class="Apple-style-span" color="#0000FF">break</font><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000CC;">}</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000CC;">}</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#FF9900;">//cellphone &amp; morse coding are default at the end of policy</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;strcpy<span style="color:#0000CC;">(</span>middleStr<span style="color:#0000CC;">,</span> dst<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;cf_cellphone<span style="color:#0000CC;">(</span>dst<span style="color:#0000CC;">,</span> middleStr<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;strcpy<span style="color:#0000CC;">(</span>middleStr<span style="color:#0000CC;">,</span> dst<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;cf_morse<span style="color:#0000CC;">(</span>dst<span style="color:#0000CC;">,</span> middleStr<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;free<span style="color:#0000CC;">(</span>middleStr<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">return</span> OK<span style="color:#0000CC;">;</span><br></li><li>
<span style="color:#0000CC;">}</span></li></ol></div></div><div><span class="Apple-style-span" style="font-size: large; "><b>2.2 解密策略</b></span></div><div><span class="Apple-style-span" style="font-size: large;">与加密策略思路分析是一样的,解密策略部分代码如下:</span></div><div><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;"><span style="color:#FF9900;">//Decryption 输入解码的顺序的字符串</span><br></span></li><li>
<span style="color:#FF9900;">//解码前两步默认是Morse、手机,policy无须包括mc</span><br></li><li>
<span style="color:#0000FF;">int</span> decryption<span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>dst<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>src<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span><span style="color:#FF0000;">policy</span><span style="color:#0000CC;">,</span> <span style="color:#0000FF;">int</span> rows<span style="color:#0000CC;">)</span><br></li><li>
<span style="color:#0000CC;">{</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">char</span> c_cf<span style="color:#0000CC;">;</span> <span style="color:#FF9900;">//code function</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>middleStr <span style="color:#0000CC;">=</span> <span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span><span style="color:#0000CC;">)</span>malloc<span style="color:#0000CC;">(</span>sizeof<span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">*</span>BUFFERSIZE<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#FF9900;">//cellphone &amp; morse decoding are default at the begin of policy</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;dcf_morse<span style="color:#0000CC;">(</span>dst<span style="color:#0000CC;">,</span> src<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;strcpy<span style="color:#0000CC;">(</span>middleStr<span style="color:#0000CC;">,</span> dst<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;dcf_cellphone<span style="color:#0000CC;">(</span>dst<span style="color:#0000CC;">,</span> middleStr<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">while</span> <span style="color:#0000CC;">(</span><span style="color:#0000CC;">(</span>c_cf<span style="color:#0000CC;">=</span><span style="color:#0000CC;">*</span><span style="color:#FF0000;">policy</span><span style="color:#0000CC;">+</span><span style="color:#0000CC;">+</span><span style="color:#0000CC;">)</span> <span style="color:#0000CC;">!</span><span style="color:#0000CC;">=</span> <span style="color:#FF00FF;">'\0'</span><span style="color:#0000CC;">)</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000CC;">{</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy<span style="color:#0000CC;">(</span>middleStr<span style="color:#0000CC;">,</span> dst<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">switch</span><span style="color:#0000CC;">(</span>c_cf<span style="color:#0000CC;">)</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000CC;">{</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">case</span> <span style="color:#FF00FF;">'r'</span><span style="color:#0000CC;">:</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cf_reverse<span style="color:#0000CC;">(</span>dst<span style="color:#0000CC;">,</span>middleStr<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">break</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">case</span> <span style="color:#FF00FF;">'f'</span><span style="color:#0000CC;">:</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcf_fence<span style="color:#0000CC;">(</span>dst<span style="color:#0000CC;">,</span> middleStr<span style="color:#0000CC;">,</span> rows<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">break</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">case</span> <span style="color:#FF00FF;">'q'</span><span style="color:#0000CC;">:</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcf_qwe<span style="color:#0000CC;">(</span>dst<span style="color:#0000CC;">,</span> middleStr<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">break</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">default</span><span style="color:#0000CC;">:</span><br></li><li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-style-span" style="font-size: 11.8056px; "><span style="color: rgb(0, 0, 255); ">break</span><span style="color: rgb(0, 0, 204); ">;</span></span></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000CC;">}</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000CC;">}</span><br></li><li>
<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;free<span style="color:#0000CC;">(</span>middleStr<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">return</span> OK<span style="color:#0000CC;">;</span><br></li><li>
<span style="color:#0000CC;">}</span></li></ol></div></div><div><span class="Apple-style-span" style="font-size: large;"><b>2.3 测试结果</b></span></div><div><span class="Apple-style-span" style="font-size: large;">&nbsp;&nbsp; &nbsp;以题目给出的“iloveyoutoo”作为验证,以“zhongxingpengyue”作为测试例子,采用加密策略为rfqcm,即倒叙、栅栏、QWE、手机、摩尔斯,结果如下:</span></div><div><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li>***zhongxingpengyue test based on rfqcm encryption policy***</li><li>
zhongxingpengyue </li><li>
___***_____******___***__***__****_**___***__***__**___**___***__***__****_***______***______****______***_______****____*******_____****___****_*_____*****____</li><li><br></li><li>
***zhongxingpengyue test based on rfqcm decryption policy test***</li><li>
___***_____******___***__***__****_**___***__***__**___**___***__***__****_***______***______****______***_______****____*******_____****___****_*_____*****____</li><li>
zhongxingpengyue</li></ol></div></div><div><br></div><div><span class="Apple-style-span" style="font-size: large;"><b><font class="Apple-style-span" face="黑体">三、编解码</font></b></span></div><div><span class="Apple-style-span" style="font-size: large;">&nbsp;&nbsp; &nbsp;这部分主要介绍各个编码的加/解密,本来是想结合源代码,无奈的是工程目录下code_function.c文件损坏(其他文件正常,我现在都不知道为什么会这样),加之,我没有备份。事实上也不难,主要涉及到字符串的操作。code_function.c主要实现下列函数:</span></div><div><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;"><span style="color:#FF9900;">/********外部函数*******/</span><br></span></li><li>
extern <span style="color:#0000FF;">int</span> cf_reverse<span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>dst<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">const</span> <span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>src<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span>            <span style="color:#FF9900;">//字符串倒序</span><br></li><li>
extern <span style="color:#0000FF;">int</span> cf_fence<span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>dst<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">const</span> <span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>src<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">int</span> rows<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span>      <span style="color:#FF9900;">//栅栏密码 把明文分成N组,而后将每组第i个字符连接 </span><br></li><li>
extern <span style="color:#0000FF;">int</span> dcf_fence<span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>dst<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">const</span> <span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>src<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">int</span> rows<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span>   <span style="color:#FF9900;">//栅栏密码 将密方分成N行,按列取第i个字符</span><br></li><li>
extern <span style="color:#0000FF;">int</span> cf_qwe<span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>dst<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">const</span> <span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>src<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span>                  <span style="color:#FF9900;">//QWE键盘密码qwe_c --&gt; qwe_dc eg.a--&gt;q</span><br></li><li>
extern <span style="color:#0000FF;">int</span> dcf_qwe<span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>dst<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">const</span> <span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>src<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span>               <span style="color:#FF9900;">//QWE键盘密码 qwe_dc --&gt; qwe_c eg.q--&gt;e</span><br></li><li>
extern <span style="color:#0000FF;">int</span> cf_cellphone<span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>dst<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">const</span> <span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>src<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span>            <span style="color:#FF9900;">//手机按键码表 字符--&gt;数学 eg.g--&gt;41</span><br></li><li>
extern <span style="color:#0000FF;">int</span> dcf_cellphone<span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>dst<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">const</span> <span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>src<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span>         <span style="color:#FF9900;">//手机按键码表 数字--&gt;字符 eg.41--&gt;g</span><br></li><li>
extern <span style="color:#0000FF;">int</span> cf_morse<span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>dst<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">const</span> <span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>src<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span>                <span style="color:#FF9900;">//MORSE码字符类型数字--&gt;Morse码</span><br></li><li>
extern <span style="color:#0000FF;">int</span> dcf_morse<span style="color:#0000CC;">(</span><span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>dst<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">const</span> <span style="color:#0000FF;">char</span> <span style="color:#0000CC;">*</span>src<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><span class="Apple-style-span" style="color: rgb(255, 153, 0); font-size: 11.8056px; ">//MORSE码 Morse码--&gt;</span><span class="Apple-style-span" style="color: rgb(255, 153, 0); font-size: 11.8056px; ">字符类型数字</span></li></ol></div></div><div><span class="Apple-style-span" style="font-size: large;"><b><font class="Apple-style-span" face="宋体">3.1 倒叙</font></b></span></div><div><span class="Apple-style-span" style="font-size: large;"><b><font class="Apple-style-span" face="宋体">3.2 栅栏码</font></b></span></div><div><font class="Apple-style-span" face="宋体"><span class="Apple-style-span" style="font-size: large;">&nbsp;&nbsp; &nbsp;加密过程,可以这么理解,将明文划分成m个一组(称m排栅栏),得到n组,排列成二维数组m*n,按列存取该数组即得到密文。</span></font></div><div><font class="Apple-style-span" face="宋体"><span class="Apple-style-span" style="font-size: large;">&nbsp;&nbsp; &nbsp;解密过程类似,将密文</span></font><span class="Apple-style-span" style="font-size: large; font-family: 宋体; ">分成m个一组(称m排栅栏),得到n组,排列成二维数组m*n,按列存取该数组即得到明文。</span></div><div><span class="Apple-style-span" style="font-size: large;"><b><font class="Apple-style-span" face="宋体">3.3 QWE码</font></b></span></div><div><span class="Apple-style-span" style="font-size: large;">QWE码也叫键盘编码,其对应关系如下:</span></div><div><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;">Q W E R T Y U I O P A S D F G H J K L Z X C V B N M &nbsp; &nbsp;&nbsp;<span style="color:#FF9900;">/*QWE码*/</span><br></span></li><li>
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z &nbsp; &nbsp; <span style="color:#FF9900;">/*字母表*/</span></li></ol></div></div><div><span class="Apple-style-span" style="font-size: large;"><b>3.4 手机编码</b></span></div><div><div><span class="Apple-style-span" style="font-size: large;">&nbsp;&nbsp; &nbsp;如下图所示,2~9分别对应于字母表若干字母,比如5对应字母jkl。想一下你发短信是如何输入字母k的,切换到字母输入模式,按两下5键,即输入字母k。手机编码就是这样的,51表示按一下5键得到字母k,52表示按两下5键得到字母k,53表示按三下5键得到字母l。其他的类推,从而得到手机编码与字母的映射表。</span></div></div><div style="text-align: center;"><a href="http://blog.chinaunix.net/attachment/201108/19/9112803_1313753836YXD9.jpg" target="_blank" target="_blank"><img src="http://blog.chinaunix.net/attachment/201108/19/9112803_1313753836YXD9.jpg" .load="imgResize(this, 650);" border="0" ;=""></a></div><div style="text-align: center;">图2 手机键盘</div><div><span class="Apple-style-span" style="font-size: large;"><b>3.5 摩尔斯编码</b></span></div><div><span class="Apple-style-span" style="font-size: large;">Morse码,0~9每个数字对应一个由5个*或者-组成的字符串,直接看常量定义:</span></div><div><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;">#define MORSE_CODE_0 <span style="color:#FF00FF;">"_____"</span><br></span></li><li>
#define MORSE_CODE_1 <span style="color:#FF00FF;">"*____"</span><br></li><li>
#define MORSE_CODE_2 <span style="color:#FF00FF;">"**___"</span><br></li><li>
#define MORSE_CODE_3 <span style="color:#FF00FF;">"***__"</span><br></li><li>
#define MORSE_CODE_4 <span style="color:#FF00FF;">"****_"</span><br></li><li>
#define MORSE_CODE_5 <span style="color:#FF00FF;">"*****"</span><br></li><li>
#define MORSE_CODE_6 <span style="color:#FF00FF;">"_****"</span><br></li><li>
#define MORSE_CODE_7 <span style="color:#FF00FF;">"__***"</span><br></li><li>
#define MORSE_CODE_8 <span style="color:#FF00FF;">"___**"</span><br></li><li>
#define MORSE_CODE_9 <span style="color:#FF00FF;">"____*"</span></li></ol></div></div><div><span class="Apple-style-span" style="font-size: large;"><font class="Apple-style-span" size="6"><span class="Apple-style-span" style="font-size: 20px;"><br></span></font></span></div><div><span class="Apple-style-span" style="font-size: large;"><b><font class="Apple-style-span" face="黑体">四、源代码</font></b></span></div><div><span class="Apple-style-span" style="font-size: large;">我是在Ubuntu 9.10下开发的,源代码</span><a href=".http://blog.chinaunix.net/attachment/attach/91/12/80/0391128037f787d5ed659b28dbdac0f8cde552f28.rar" target="_blank" target="_blank"><img border="0" align="absmiddle" src="/blog/image/attachicons/rar.gif">&nbsp;ztepc_passwdPolicy_jelline.rar </a><span class="Apple-style-span" style="font-size: large;">,但存在如下问题:</span></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><span class="Apple-style-span" style="font-size: large;">(1) 里面一个文件code_funtion.c损坏了,几乎是乱码(但不影响总体阅读)</span></div><div><span class="Apple-style-span" style="font-size: large;">(2) 只能处理小写字符</span></div><div><span class="Apple-style-span" style="font-size: large;">(3) 测试不充分,还有不少BUG</span></div></blockquote><div><span class="Apple-style-span" style="font-size: large;"><br></span></div><div><span class="Apple-style-span" style="font-size: large;"><br></span></div><div><span class="Apple-style-span" style="font-size: large;">解压后文件列表如下:</span></div><div><div><span class="Apple-style-span" style="font-size: large;">文件列表:</span></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div><span class="Apple-style-span" style="font-size: large; ">code_function.c &nbsp;-----------------5种编码加解密实现(无奈,该文件损坏)</span></div></div></blockquote><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><span class="Apple-style-span" style="font-size: large;"><div>code_function.h &nbsp;-----------------定义了一些常量,对于于code_function.c</div></span><span class="Apple-style-span" style="font-size: large;"><div>code_function_test ---------------单步加解密测试用例可执行文件</div></span><span class="Apple-style-span" style="font-size: large;"><div>code_function_test.c -------------单步加解密测试用例实现</div></span><span class="Apple-style-span" style="font-size: large;"><div>code_function_test_result --------单步加解密测试用例测试结果</div></span><span class="Apple-style-span" style="font-size: large;"><div>Makefile -------------------------makefile文件</div></span><span class="Apple-style-span" style="font-size: large;"><div>passwdPolicy.c -------------------密码组合策略实现</div></span><span class="Apple-style-span" style="font-size: large;"><div>passwdPolicy.h -------------------密码组合策略头文件</div></span><span class="Apple-style-span" style="font-size: large;"><div>passwdPolicy_test ----------------密码组合策略测试用例可执行文件</div></span><span class="Apple-style-span" style="font-size: large;"><div>passwdPolicy_test.c --------------密码组合策略测试用例实现</div></span><span class="Apple-style-span" style="font-size: large;"><div>passwdPolicy_test_result ---------密码组合策略测试用例测试结果</div></span></blockquote><span class="Apple-style-span" style="font-size: large;"><div><br></div><div><br></div><div>参考资料:</div><div> 图片来源北方IT网</div></span>
页: [1]
查看完整版本: 密码传情之密码机制