<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[SecurID 卡的原理实现的动态口令认证,RSA SecurID 动态密码令牌 RSA，俗称：token卡，IT男标配。使用TC采用RSA算法制作C语言代码，RSA发布iPhone版应用 - SecurID软件令牌。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Sat, 03 Mar 2012 07:12:27 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	163为它的游戏用户推出了动态口令卡。售价才10元。这让我非常的诧异。首先，我觉得这几乎是无懈可击的密保技术。其次，RSA的 SecurID卡在国内在几百RMB一个。而163的这东西，实在是便宜……<br/><br/>RSA 令牌 SID700 RSA SecurID<br/><br/>以前一直对这东西的原理很好奇。今天翻了些文档，略微整理如下：<br/><br/>1、密码：<br/>登陆密码＝f(静态密码,动态密码)。<br/>静态密码就是用户自己设置的一个密码。<br/>动态密码是通过卡动态生成的密码。<br/>f是一个简单函数。例如不进位的加法、字符串拼接。<br/>用户的静态密码最好是不要通过电脑键盘输入不通过网络传输的，所以很不推荐采用字符串拼接的方式。<br/><br/>2、构成<br/>一个8位的处理器，一个时钟，一个LCD显示屏，一块电池。可能还会有一个键盘。<br/>外壳的设计目标：一旦打开外壳，那么立即清空内存数据。<br/>内部的设计目标：存储一个种子文件。然后按文件中的数据和当前时间拼起来进行AES，然后hash成6-8位的数字，显示在LCD上。<br/><br/>如果有键盘，那么用户可以通过键盘输入一串数字（用户的静态密码）。卡把这串数字（静态密码）与卡实际生成的数字（动态密码）用一种公开的算法(前面所说的那个f)进行组合，然后显示出来。通常采用的是不进位的加法。因此这个部件不是我们所需要关心的部分。<br/><br/>理论上来讲，如果知道种子、如果知道时间、如果知道生成器内部所采用的算法，那么我们就可以自行的算出这个动态密码。既然RSA公司敢发布软件版的生成器，那么就意味着它不怕这个算法被知道。事实上这个算法被hacker们公开已经是10年前的事情了。一个俄国hacker在发布自己的软件模拟器后留下这样一段话：<br/>“RSA公司的伙计们:<br/>如果你需要人帮助你设计安全的加密算法和协议，告诉我们，我们将会帮助你做出来。俄罗斯人并不都是熊。我们的国际象棋比你们下的好，记住！”<br/><br/>但是难点在于从卡中取走种子文件。就目前而言，是不可能通过它产生的随机序列反推回去得到它的种子文件的。<br/><br/>在网上看到了另一种类似方案：<br/>1、用户输入一个用户名，发送给服务器<br/>2、服务器返回一个随机数，记做C<br/>3、用户使用自己的密码unlock动态口令卡<br/>4、用户输入C。动态口令卡计算f(C,time,seed),然后显示出来<br/>5、用户把口令卡的结果发送给服务器6<br/>6、用户锁住口令卡<br/><br/>将DKEY动态密码结合PAM认证方案，在PAM静态密码认证基础之上，增加一层宁盾动态密码（该密码是由硬件令牌产生，每隔60秒变化一次，密码一次使用有效）认证，用以提升Linux/Unix服务器安全。<br/>网址：http://ndkey.com/zh/dkey_for_linux.html<br/>Linux Pam认证：http://www.chineselinuxuniversity.net/articles/35383.shtml<br/>Tencent 也有类似的产品：http://item.taobao.com/item.htm?spm=a230r.1.10.156.Stwlht&amp;id=15704549799&amp;_u=119u1sf4e9<br/>淘宝一堆这样的产品：http://s.taobao.com/search?q=%C1%EE%C5%C6%CB%F8&amp;initiative_id=staobaoz_20121201<br/>RSA SecurID Software Token：<br/>http://m.163.com/android/software/31teqh.html<br/><br/><br/>使用TC采用RSA算法制作C语言代码：http://wenwen.soso.com/z/q188326537.htm<br/>——————————————————————————————————————————<br/>rsa编程1<br/>要求输入p,q,e<br/>输出d<br/>算法描述为求逆元的方法<br/><textarea name="code" class="C" rows="15" cols="100">
晕，这么有难度的，连分都不给啊！
补充：
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;time.h&gt;
#include &quot;vlong.h&quot;
#include &quot;rsa.h&quot;
//生成大奇数及 e m 
void MakePrime(long Level)
&#123;
 private_key pkey;
 char prand[2][128],vername[5],tc;
 DWORD i,j,nn, nCount;
 vlong *tmp[4];
 FILE *fp;
 
 srand((unsigned)time(NULL));
 if(Level == &#039;1&#039;) //生成512位
&nbsp;&nbsp;nCount = 32;
 else if(Level == &#039;2&#039;) //生成1024位
&nbsp;&nbsp;nCount = 64;
 else&nbsp;&nbsp;//生成256位
&nbsp;&nbsp;nCount = 16;
 
 for(i=0; i&lt;2; i++)
 &#123;
&nbsp;&nbsp;for(j=0; j&lt;nCount; j++)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp; tc = (char)(0x41+rand()%0xAF);
&nbsp;&nbsp; prand[i][j] = tc;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;prand[i][j]=0;
 &#125;
 
 pkey.create(prand[0], prand[1]); //计算生成两个大奇数 p, q
 
 tmp[0] = &amp;pkey.p;
 tmp[1] = &amp;pkey.q;
 tmp[2] = &amp;pkey.e;
 tmp[3] = &amp;pkey.m;
 strcpy(vername, &quot;pqem&quot;);
 
 fp =&nbsp;&nbsp;fopen(&quot;RSAVar.txt&quot;, &quot;w&quot;);
 for(j=0; j&lt;4; j++)
 &#123;
&nbsp;&nbsp;nn=tmp[j]-&gt;value-&gt;n;
&nbsp;&nbsp;fprintf(fp, &quot;[%c]&#92;nLen = %d&#92;n&quot;, vername[j], nn);
&nbsp;&nbsp;for(i=0; i&lt;nn; i++)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp; fprintf(fp,&quot;%c[%ld] = 0X%08lX;&#92;n&quot;, vername[j],i,&nbsp;&nbsp;tmp[j]-&gt;value-&gt;a[i]);
&nbsp;&nbsp;&#125;
 &#125;
 fclose(fp);
&#125;
//以下p,q,e,m可由 本程序的 参数 p0生成，可任意改变
#define VL 8
// p, q 仅在加密程序中用
DWORD p[VL/2]&nbsp;&nbsp; = &#123;0Xb2ab9d39, 0X8e53d98d, 0X77dd8ec1,0X995283d6&#125;;
DWORD q[VL/2]&nbsp;&nbsp; = &#123;0Xc7e37a29, 0X7fb7c168, 0Xea61d2a3,0Xcaab6cd8&#125;;
// e, m 在加解密程序中都要
DWORD e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;0X00010001;
DWORD m[VL] = &#123;0X1ef45821,0X71a30c63,0Xe3a16b86,0Xce0e1e51
&nbsp;&nbsp;&nbsp;&nbsp; ,0X462d92c1,0X4ac42393,0X04749e17,0X7961c756&#125;;
//加密
void Encrypt()
&#123;
 // 准备p.q.m.e
 private_key pkey;&nbsp;&nbsp;&nbsp;&nbsp;//私匙类，数据保密
 pkey.p.load(p,VL/2);
 pkey.q.load(q,VL/2);
 pkey.e = e;
 pkey.m.load(m, VL);
 
 DWORD a[VL];
 //准备要加密的数，这里，只对两个DWORD值加密，卡号和计算机标识符
 //读入卡号和标识符框中的当前值
 memset(a,0,VL*sizeof(DWORD));
 printf(&quot;Please Input CardNo &amp; PCID (Fmt %%X-%%X):&#92;n&quot;);
 scanf(&quot;%lX-%lX&quot;,&amp;a[0], &amp;a[1]);
 vlong m; 
 m.load(a, 2); //这样 m 中就保存有要加密的数
 
 //计算加密后的数c
 vlong c = pkey.decrypt(m);
 c.store(a, VL);
//以下只是对 VL == 8的情况的处理
 //由于pkey中的成员m，是一小于8个DWORD值的数，加密后的 c &lt; pkey.m
 //所以，a[7]的高位总为0， 以防a[6],a[7]过多的高位为0，对a[7]变换处理一下
 a[7] ^= (a[1]+a[2]+a[3]+a[4]);
 a[6] ^= (a[0]+a[5]);
 //加密后的结果就是 a[0]-a[7]
 FILE *fp =&nbsp;&nbsp;fopen(&quot;nwnb.txt&quot;, &quot;w&quot;);
 if(fp != NULL)
 &#123;
 fprintf(fp,&quot;%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX&#92;n&quot;, 
&nbsp;&nbsp;a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
 fclose(fp);
 &#125;
 printf(&quot;Encrypt Data:&#92;n&quot;);
 printf(&quot;%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX&#92;n&quot;, 
&nbsp;&nbsp;a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
&#125;
void Decrypt()
&#123;
 //准备 [m] [e], 解密只用到 m,e
 public_key pkey;&nbsp;&nbsp;&nbsp;&nbsp; //公匙类，数据公开
 pkey.e = e;
 pkey.m.load(m, VL);
 DWORD a[VL];
 
 //读入加密后的VL个DWORD值到a可
 memset(a,0,VL*sizeof(long));
 FILE *fp =&nbsp;&nbsp;fopen(&quot;nwnb.txt&quot;, &quot;r&quot;);
 if(fp != NULL)
 &#123;
 fscanf(fp,&quot;%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX&#92;n&quot;, 
&nbsp;&nbsp;&amp;a[0], &amp;a[1], &amp;a[2], &amp;a[3], &amp;a[4], &amp;a[5], &amp;a[6], &amp;a[7]);
 fclose(fp);
 &#125;
 //还原a[6],a[7]
 a[7] ^= (a[1]+a[2]+a[3]+a[4]);
 a[6] ^= (a[0]+a[5]);
 //加密的数据保存到m中
 vlong m;
 m.load(a,8);
 
 //计算加密前的数据，保存在c中
 vlong c = pkey.encrypt(m);
 memset(a,0,8*sizeof(long));
 c.store(a,2); 
 // a[0], a[1]就是加密前的数据
 printf(&quot;Decrypt Data:&#92;n&quot;);
 printf(&quot;%08lX-%08lX&#92;n&quot;, a[0], a[1]);
&#125;
void Help()
&#123;
printf(&quot;欢迎访问乱站 -- http://com.6to23.com/ &#92;n&quot;);
 printf(&quot;By: Seraph Chutium&nbsp;&nbsp;2001.7.21 &#92;n&quot;);
 printf(&quot;Usage:&nbsp;&nbsp;Work&nbsp;&nbsp;P0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;准备256位的加解密&#92;n&quot;);
 printf(&quot;Usage:&nbsp;&nbsp;Work&nbsp;&nbsp;P1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;准备512位的加解密&#92;n&quot;);
 printf(&quot;Usage:&nbsp;&nbsp;Work&nbsp;&nbsp;P2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;准备1024位的加解密&#92;n&quot;);
 printf(&quot;Usage:&nbsp;&nbsp;Work&nbsp;&nbsp;E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加密&#92;n&quot;);
 printf(&quot;Usage:&nbsp;&nbsp;Work&nbsp;&nbsp;D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解密&#92;n&quot;);
&#125;
void main(int nArg, char **sArg)
&#123;
 if(nArg &lt; 2)
 &#123;
&nbsp;&nbsp;Help();
&nbsp;&nbsp;return;
 &#125;
 
 if(sArg[1][0] == &#039;P&#039; &#124;&#124; sArg[1][0] == &#039;p&#039;)
 &#123;
&nbsp;&nbsp;MakePrime(sArg[1][1]);
&nbsp;&nbsp;return;
 &#125;
 else if(sArg[1][0] == &#039;E&#039; &#124;&#124; sArg[1][0] == &#039;e&#039;)
&nbsp;&nbsp;Encrypt();
 else if(sArg[1][0] == &#039;D&#039; &#124;&#124; sArg[1][0] == &#039;d&#039;)
&nbsp;&nbsp;Decrypt();
 else
&nbsp;&nbsp;Help();
&#125;
</textarea>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] SecurID 卡的原理实现的动态口令认证,RSA SecurID 动态密码令牌 RSA，俗称：token卡，IT男标配。使用TC采用RSA算法制作C语言代码，RSA发布iPhone版应用 - SecurID软件令牌。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>