<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>Mr.Sun</title>
<link>http://blogger.org.cn/blog/blog.asp?name=sunxiaojun</link>
<description>小骏的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[关于J2EE里实现MVC]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sunxiaojun&amp;id=12415</link>
<author>sunxiaojun</author>
<pubDate>2006/3/9 21:05:16</pubDate>
<description><![CDATA[<P>J2EE里实现MVC应该算是J2EE入门级的一个基本技术吧.</P>
<P>所谓MVC也就是MODEL-VIEW-CONTROL模型.按照这个模型的思路去做的基于WEB的程序会容易管理.众多好处我就不多说了,关键还是看程序实现.</P>
<P>第一次做MVC其实是参照了strusts的思路,所有的请求都是以.do结尾,当服务端接受到请求之后解析用户的请求,并且让模型做相应的处理,最后发派一个视图给用户.</P>
<P>今天先写这么多了,第1次来,呵呵,下次继续.</P>]]></description>
</item><item>
<title><![CDATA[关于用C实现大数字的运算]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sunxiaojun&amp;id=12414</link>
<author>sunxiaojun</author>
<pubDate>2006/3/9 20:29:27</pubDate>
<description><![CDATA[<P>用标准C语言,计算机能帮你算的最大的数字也就限于2的32次方.超出了这个范围,就会溢出了.但是密码算法里很多算法,如著名的RSA,就要求要计算2的1024次方甚至更大的数量级的数字.而且,解决了这个问题也可以对计算机的理解有帮助.</P>
<P>首先,先看一下加法.</P>
<P>有两个思路可以参考:</P>
<P>如果有两个占用8个字节的内存单元要进行加法运算,也就是可以表示成2个int型元素组成的数组要进行加法运算,如果按照数组元素进行运算的话,那么低位的进行运算之后溢出了,那怎么办,关键就在于如何得知溢出.如果每次进行的运算不是2的32次方,而是小于2的32次方,那么溢出之后就可以知道.所以,我们只需要利用两个int型的临时空间,每次分别将要进行加法运算的两个大数字放进去24位,为什么要放24位,放31位不是更节省吗?但是31位不方便运算.所以一次就放3个字节进去.然后进行计算机提供的加法运算,之后来判断2个有效位为24位的数字进行运算的结果的第25位,如果该位为1,则表示运算溢出,否则无溢出.这种方法一般般,不好也不坏.呵呵.</P>
<P>&nbsp;</P>
<P>另外一种方法就比较容易理解.</P>
<P>首先有一条原则就是:两个数字进行加法运算,结果无论如何也比其中任意一个数字要大.如果刚才的条件不成立,则表示溢出.</P>
<P>这样就可以按照数组元素依次进行运算了,只是每次运算完都要判断以便进位.</P>
<P>减法,乘法,除法就不多说了.</P>
<P>除了加减乘除,还有几个比较重要的运算.比如模幂运算.比如:计算A的B次方模M的结果.其中,A,B,M均为2的1024次方这样数量级的数字.</P>
<P>如果硬是要用加减乘除来计算,那么算到什么时候(反正是很远之后了,我也没具体算过).那么用什么办法来解决呢.</P>
<P>首先,考虑一个问题,如果我们要用一张张的纸叠加起来叠到月球上去,那么似乎这个问题是不可能的,但是如果我们用一张纸对折对折再对折,30多次之后就可以到月球了,呵呵,就是这个思路.</P>
<P>将无限化为有限,将指数级化为对数级.</P>
<P>我们知道,A的2次方=A的1次方*A的1次方.A的4次方=A的2次方*A的2次方.</P>
<P>还有,A的N次方模M,计算进行时可以在当结果大于M的时候就先取模.</P>
<P>OK,前期工作就做到这里,现在开始正式的计算.</P>
<P>我们先把A的1次方.2次方.4.8......直到LOG以2为底B的对数次方模M的结果存储起来,然后将B视为2进制数.</P>
<P>比如:B的二进制形式为:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; 0&nbsp;&nbsp; 0&nbsp;&nbsp; 0&nbsp;&nbsp; 1&nbsp;&nbsp; 0&nbsp;&nbsp; 0&nbsp;&nbsp; 0&nbsp;&nbsp; 10001000</P>
<P>A的1,2,4,8次方的中间结果:a&nbsp;&nbsp;&nbsp; b&nbsp;&nbsp;&nbsp; c&nbsp;&nbsp; d&nbsp;&nbsp; ....</P>
<P>然后当B的二进制形式中出现1的时候,找出中间结果中相对应的一个结果,遍历B的二进制形式,将出现1的时候相对应的中间结果相乘然后模M,就可以得到最终结果.</P>
<P>其实能看到这里也挺不容易了,呵呵,这个问题我也只能表达成这样了,如果有问题,可以参考代码.</P>
<P>&nbsp;</P>
<P>写了好多,手累...</P>
<P>&nbsp;</P>
<P>不说什么了,贴代码:</P>
<P>注:由于个人原因,代码写到一半尚为完成.</P>
<P>以下先是大数字进行加减乘法的实现.</P>
<P>&nbsp;</P>
<P>#include &lt;stdio.h&gt;<BR>#include &lt;stdlib.h&gt;<BR>typedef unsigned int BigInt;//定义unsigned int型为BigInt型</P>
<P>unsigned int Length(BigInt *input)//求一个BigInt型所占的空间长度<BR>{<BR>&nbsp;int i=0;<BR>&nbsp;while(input[i]!=-1)<BR>&nbsp;{<BR>&nbsp;&nbsp;i++;<BR>&nbsp;}<BR>&nbsp;return i;<BR>}</P>
<P>bool NewInt(BigInt **input,unsigned int n)//为一个BigInt型分配空间<BR>{<BR>&nbsp;if(((*input)=(BigInt*)malloc(n*sizeof(BigInt)+1))!=NULL){<BR>&nbsp;&nbsp;for(int i=0;i&lt;n;i++)<BR>&nbsp;&nbsp;&nbsp;(*input)[i]=0;<BR>&nbsp;&nbsp;(*input)[n]=-1;<BR>&nbsp;&nbsp;return true;<BR>&nbsp;}<BR>&nbsp;return false;<BR>}</P>
<P>void Print(BigInt *input)//打印一个BigInt型<BR>{<BR>&nbsp;int i;<BR>&nbsp;for(i=Length(input)-1;i&gt;=0;i--){<BR>&nbsp;&nbsp;if(input[i]&lt;16)<BR>&nbsp;&nbsp;&nbsp;printf("0");<BR>&nbsp;&nbsp;printf("%x",input[i]);<BR>&nbsp;}<BR>&nbsp;printf("\n");<BR>}</P>
<P>unsigned int Max(BigInt *part1,BigInt *part2)//计算两个BigInt型中较长一个的长度<BR>{<BR>&nbsp;if(Length(part1)&gt;=Length(part2))<BR>&nbsp;&nbsp;return Length(part1);<BR>&nbsp;else<BR>&nbsp;&nbsp;return Length(part2);<BR>}</P>
<P>unsigned int Min(BigInt *part1,BigInt *part2)//计算两个BigInt型中较短一个的长度<BR>{<BR>&nbsp;if(Length(part1)&gt;=Length(part2))<BR>&nbsp;&nbsp;return Length(part2);<BR>&nbsp;else<BR>&nbsp;&nbsp;return Length(part1);<BR>}</P>
<P>void Add(BigInt *result,BigInt *part1,BigInt *part2)//加法,长的是part1,短的是part2<BR>{<BR>&nbsp;int sum;<BR>&nbsp;int flag=0;<BR>&nbsp;int i;<BR>&nbsp;for(i=0;i&lt;Min(part1,part2);i++){<BR>&nbsp;&nbsp;sum=part1[i]+part2[i]+flag;<BR>&nbsp;&nbsp;result[i]=sum&amp;0xFF;<BR>&nbsp;&nbsp;flag=(sum&gt;&gt;8);<BR>&nbsp;&nbsp;sum=0;<BR>&nbsp;}<BR>&nbsp;for(i=Min(part1,part2);i&lt;Max(part1,part2);i++){<BR>&nbsp;&nbsp;sum=part1[i]+flag;<BR>&nbsp;&nbsp;result[i]=sum&amp;0xFF;<BR>&nbsp;&nbsp;flag=(sum&gt;&gt;8);<BR>&nbsp;&nbsp;sum=0;<BR>&nbsp;}<BR>&nbsp;result[Max(part1,part2)]=flag;<BR>}</P>
<P>void Sub(BigInt *result,BigInt *part1,BigInt *part2)//减法,长的是part1,短的是part2<BR>{<BR>&nbsp;int flag=0;<BR>&nbsp;int i;<BR>&nbsp;for(i=0;i&lt;Min(part1,part2);i++){<BR>&nbsp;&nbsp;if((part1[i]-part2[i]-flag)&lt;=part1[i]){<BR>&nbsp;&nbsp;&nbsp;result[i]=part1[i]-part2[i]-flag;<BR>&nbsp;&nbsp;&nbsp;flag=0;<BR>&nbsp;&nbsp;}else{<BR>&nbsp;&nbsp;&nbsp;result[i]=256+part1[i]-part2[i]-flag;<BR>&nbsp;&nbsp;&nbsp;flag=1;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;for(i=Min(part1,part2);i&lt;Max(part1,part2);i++){<BR>&nbsp;&nbsp;if((part1[i]-flag)&lt;=part1[i]){<BR>&nbsp;&nbsp;&nbsp;result[i]=part1[i]-flag;<BR>&nbsp;&nbsp;&nbsp;flag=0;<BR>&nbsp;&nbsp;}else{<BR>&nbsp;&nbsp;&nbsp;result[i]=256+part1[i]-flag;<BR>&nbsp;&nbsp;&nbsp;flag=1;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}</P>
<P>void Mult(BigInt *result,BigInt *part1,BigInt *part2)//乘法<BR>{<BR>&nbsp;unsigned int a=0;<BR>&nbsp;unsigned int b=0;<BR>&nbsp;unsigned int c=0;<BR>&nbsp;unsigned int mult=0;<BR>&nbsp;int i;<BR>&nbsp;int j;<BR>&nbsp;int k;<BR>&nbsp;BigInt *temp;<BR>&nbsp;while(!NewInt(&amp;temp,Length(part1)+Length(part2)))<BR>&nbsp;&nbsp;;<BR>&nbsp;for(i=0;i&lt;Length(part1);i++){<BR>&nbsp;&nbsp;for(j=0;j&lt;Length(part2);j++){<BR>&nbsp;&nbsp;&nbsp;mult=result[i+j]+part1[j]*part2[i]+c;<BR>&nbsp;&nbsp;&nbsp;a=(mult&gt;&gt;8);<BR>&nbsp;&nbsp;&nbsp;b=(mult&amp;0xFF);<BR>&nbsp;&nbsp;&nbsp;c=a;<BR>&nbsp;&nbsp;&nbsp;temp[i+j]=b;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;c=0;<BR>&nbsp;&nbsp;temp[i+j]=a;<BR>&nbsp;&nbsp;for(k=0;k&lt;Length(temp);k++)<BR>&nbsp;&nbsp;&nbsp;result[k]=temp[k];<BR>&nbsp;}<BR>}</P>
<P>int Compare(BigInt *part1,BigInt *part2)//part1和part2作比较,part1大返回1,part2大返回2,相等返回0<BR>{<BR>&nbsp;if(Length(part1)&gt;Length(part2))<BR>&nbsp;&nbsp;return 1;<BR>&nbsp;if(Length(part1)&lt;Length(part2))<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;BigInt *temp;<BR>&nbsp;while(!NewInt(&amp;temp,Length(part1)))<BR>&nbsp;&nbsp;;<BR>&nbsp;Sub(temp,part1,part2);<BR>&nbsp;int j=0;<BR>&nbsp;for(int i=0;i&lt;Length(temp);i++){<BR>&nbsp;&nbsp;if(temp[i]!=0)<BR>&nbsp;&nbsp;&nbsp;j=1;<BR>&nbsp;}<BR>&nbsp;if(j==0)<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;if(part1[Length(part1)-1]&gt;temp[Length(temp)-1])<BR>&nbsp;&nbsp;return 2;<BR>&nbsp;else<BR>&nbsp;&nbsp;return 1;<BR>}</P>
<P>void Squ(BigInt *result,BigInt *part1)//平方<BR>{<BR>}</P>
<P>void Add1(BigInt *part1)//自加1<BR>{<BR>&nbsp;unsigned int flag;<BR>&nbsp;unsigned int sum;<BR>&nbsp;sum=part1[0]+1;<BR>&nbsp;flag=(sum&gt;&gt;8);<BR>&nbsp;part1[0]=sum&amp;0xFF;<BR>&nbsp;for(int i=1;i&lt;Length(part1);i++){<BR>&nbsp;&nbsp;sum=flag+part1[i];<BR>&nbsp;&nbsp;part1[i]=sum&amp;0xFF;<BR>&nbsp;&nbsp;flag=(sum&gt;&gt;8);<BR>&nbsp;}<BR>}</P>
<P>void Sub1(BigInt *part1)//自减1<BR>{<BR>&nbsp;unsigned int flag=0;<BR>&nbsp;unsigned int sub;<BR>&nbsp;sub=part1[0]-1;<BR>&nbsp;if(sub&gt;part1[0]){<BR>&nbsp;&nbsp;part1[0]=256+part1[0]-1;<BR>&nbsp;&nbsp;flag=1;<BR>&nbsp;}else{<BR>&nbsp;&nbsp;part1[0]=part1[0]-1;<BR>&nbsp;&nbsp;flag=0;<BR>&nbsp;}<BR>&nbsp;for(int i=1;i&lt;Length(part1);i++){<BR>&nbsp;&nbsp;sub=part1[i]-flag;<BR>&nbsp;&nbsp;if(sub&gt;part1[i]){<BR>&nbsp;&nbsp;&nbsp;part1[i]=256+part1[i]-flag;<BR>&nbsp;&nbsp;&nbsp;flag=1;<BR>&nbsp;&nbsp;}else{<BR>&nbsp;&nbsp;&nbsp;part1[i]=part1[i]-flag;<BR>&nbsp;&nbsp;&nbsp;flag=0;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}</P>
<P>void Zero(BigInt *input)//清零<BR>{<BR>&nbsp;for(int i=0;i&lt;Length(input);i++){<BR>&nbsp;&nbsp;input[i]=0;<BR>&nbsp;}<BR>}</P>
<P>void Copy(BigInt *output,BigInt *input)//复制,从高位开始,input较短,output较长<BR>{<BR>&nbsp;for(int i=0;i&lt;Length(input);i++)<BR>&nbsp;&nbsp;output[i+Length(input)]=input[i];<BR>}</P>
<P>void Copy1(BigInt *output,BigInt *input)//复制,从高位开始,input较长,output较短<BR>{<BR>&nbsp;for(int i=0;i&lt;Length(output);i++)<BR>&nbsp;&nbsp;output[i]=input[i+Length(output)];<BR>}</P>
<P>对于模幂没有基于大数字写,只是基于INT型来写了一个DEMO.以后会尽快补上.呵呵.</P>
<P>int Pow(int a,int b,int p)//a的b次方,并且是在模p上<BR>{<BR>&nbsp;unsigned int temp1[32];//a的2进制表示<BR>&nbsp;unsigned int temp2[32];//b的2进制表示<BR>&nbsp;unsigned int result1[32];//a的（2的0-31）次方模p的结果<BR>&nbsp;unsigned int final=0;<BR>&nbsp;if(b==0)<BR>&nbsp;&nbsp;return 1;<BR>&nbsp;for(int i=0;i&lt;32;i++){<BR>&nbsp;&nbsp;temp1[i]=0;<BR>&nbsp;&nbsp;temp2[i]=0;<BR>&nbsp;&nbsp;result1[i]=0;<BR>&nbsp;}<BR>&nbsp;for(int i=0;i&lt;32;i++){<BR>&nbsp;&nbsp;temp1[i]=getBit(i,a);<BR>&nbsp;&nbsp;temp2[i]=getBit(i,b);<BR>&nbsp;}<BR>&nbsp;result1[0]=a%p;<BR>&nbsp;for(int i=0;i&lt;31;i++){<BR>&nbsp;&nbsp;result1[i+1]=Squ(result1[i],p);<BR>&nbsp;}<BR>&nbsp;final=result1[FindFirstNotZero(temp2)]%p;<BR>&nbsp;for(int i=FindFirstNotZero(temp2)+1;i&lt;32;i++){<BR>&nbsp;&nbsp;if(temp2[i]==0)<BR>&nbsp;&nbsp;&nbsp;;<BR>&nbsp;&nbsp;else{<BR>&nbsp;&nbsp;&nbsp;final=Mult(final,result1[i],p)%p;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;return final;<BR>}</P>]]></description>
</item><item>
<title><![CDATA[RC5密码算法]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sunxiaojun&amp;id=12413</link>
<author>sunxiaojun</author>
<pubDate>2006/3/9 20:26:40</pubDate>
<description><![CDATA[<P>写完RC4,也该写写RC5了,呵呵.</P>
<P>我其实是写完这些密码算法实现之后很久才把这些程序贴上来的,很多东西也记不起来了,只贴程序了.</P>
<P>&nbsp;</P>
<P>#include &lt;stdio.h&gt;<BR>#include &lt;string.h&gt;<BR>#include &lt;math.h&gt;<BR>//此程序为RC5加密算法的实现--参数32/12/16<BR>int is_Sourcepathright(char *source_path);<BR>int is_Destpathright(char *dest_path);<BR>int Check(int argc,char **argv);<BR>int Crypt(char *sourcepath,char *destpath,char *key);<BR>int Decrypt(char *sourcepath,char *destpath,char *key);</P>
<P>int main(int argc,char **argv)<BR>{<BR>&nbsp;if (Check(argc,argv)==0){<BR>&nbsp;&nbsp;return -1;<BR>&nbsp;}<BR>&nbsp;if (argv[4][0]=='e'||argv[4][0]=='E'){<BR>&nbsp;&nbsp;if(Crypt(argv[1],argv[2],argv[3]))<BR>&nbsp;&nbsp;&nbsp;return 1;<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;return -1;<BR>&nbsp;}<BR>&nbsp;if (argv[4][0]=='d'||argv[4][0]=='D'){<BR>&nbsp;&nbsp;if(Decrypt(argv[1],argv[2],argv[3]))<BR>&nbsp;&nbsp;&nbsp;return 1;<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;return -1;<BR>&nbsp;}<BR>&nbsp;return -1;<BR>}</P>
<P>int is_Sourcepathright(char *source_path)<BR>{<BR>&nbsp;FILE *fp;<BR>&nbsp;if ((fp=fopen(source_path,"rb"))==NULL){<BR>&nbsp;&nbsp;printf("您所输入的文件不存在.");<BR>&nbsp;&nbsp;fclose(fp);<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;else{<BR>&nbsp;&nbsp;fclose(fp);<BR>&nbsp;&nbsp;return 1;<BR>&nbsp;}<BR>}</P>
<P>int is_Destpathright(char *dest_path)<BR>{<BR>&nbsp;FILE *fp;<BR>&nbsp;if ((fp=fopen(dest_path,"wb"))==NULL){<BR>&nbsp;&nbsp;printf("输入的路径不正确.");<BR>&nbsp;&nbsp;fclose(fp);<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;else{<BR>&nbsp;&nbsp;fclose(fp);<BR>&nbsp;&nbsp;return 1;<BR>&nbsp;}<BR>}</P>
<P>int is_InputKeyRight(char *inputkey)<BR>{<BR>&nbsp;if(strlen(inputkey)==16)<BR>&nbsp;&nbsp;return 1;<BR>&nbsp;else<BR>&nbsp;&nbsp;return 0;<BR>}</P>
<P>int Check(int argc,char **argv)<BR>{<BR>&nbsp;if(argc!=5){<BR>&nbsp;&nbsp;printf("命令长度有错误。\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(is_Sourcepathright(argv[1])==0){<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(is_Destpathright(argv[2])==0){<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(is_InputKeyRight(argv[3])==0){<BR>&nbsp;&nbsp;printf("输入的密钥不正确。\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(strlen(argv[4])&gt;1){<BR>&nbsp;&nbsp;printf("错误的加解密类型。\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(argv[4][0]!='e'&amp;&amp;argv[4][0]!='E'&amp;&amp;argv[4][0]!='d'&amp;&amp;argv[4][0]!='D'){<BR>&nbsp;&nbsp;printf("错误的加解密类型。\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;return 1;<BR>}</P>
<P>int ls(unsigned int input,int nbit)<BR>{<BR>&nbsp;unsigned int temp;<BR>&nbsp;temp=input;<BR>&nbsp;if(nbit%32==0)<BR>&nbsp;&nbsp;return input;<BR>&nbsp;nbit=nbit%32;<BR>&nbsp;input&lt;&lt;=nbit;<BR>&nbsp;temp&gt;&gt;=(32-nbit);<BR>&nbsp;return input+temp;<BR>}</P>
<P>int rs(unsigned int input,int nbit)<BR>{<BR>&nbsp;unsigned int temp;<BR>&nbsp;temp=input;<BR>&nbsp;if(nbit%32==0)<BR>&nbsp;&nbsp;return input;<BR>&nbsp;nbit=nbit%32;<BR>&nbsp;input&gt;&gt;=nbit;<BR>&nbsp;temp&lt;&lt;=(32-nbit);<BR>&nbsp;return input+temp;<BR>}</P>
<P>void GenerateSubKey(unsigned int *sk,char *key)<BR>{<BR>&nbsp;int i,j,x,y;<BR>&nbsp;int l[4]={0};<BR>&nbsp;int times;<BR>&nbsp;sk[0]=0xB7E15163;<BR>&nbsp;for(i=1;i&lt;=25;i++)<BR>&nbsp;&nbsp;sk[i]=(sk[i-1]+0x9E3779B9);<BR>&nbsp;for(i=0;i&lt;4;i++){<BR>&nbsp;&nbsp;l[i]+=key[0+i*4];<BR>&nbsp;&nbsp;l[i]&lt;&lt;=8;<BR>&nbsp;&nbsp;l[i]+=key[1+i*4];<BR>&nbsp;&nbsp;l[i]&lt;&lt;=8;<BR>&nbsp;&nbsp;l[i]+=key[2+i*4];<BR>&nbsp;&nbsp;l[i]&lt;&lt;=8;<BR>&nbsp;&nbsp;l[i]+=key[3+i*4];<BR>&nbsp;}<BR>&nbsp;i=j=x=y=0;<BR>&nbsp;for(times=0;times&lt;78;times++){<BR>&nbsp;&nbsp;sk[i]=ls((sk[i]+x+y),3);<BR>&nbsp;&nbsp;x=sk[i];<BR>&nbsp;&nbsp;i=(i+1)%26;<BR>&nbsp;&nbsp;l[j]=ls((l[j]+x+y),x+y);<BR>&nbsp;&nbsp;y=l[j];<BR>&nbsp;&nbsp;j=(j+1)%4;<BR>&nbsp;}<BR>}</P>
<P>void rc5crypt(unsigned char *buf,unsigned char *output,int *sk)<BR>{<BR>&nbsp;int i;<BR>&nbsp;unsigned int a=0,b=0;<BR>&nbsp;unsigned int left0=0,left1=0,right0=0,right1=0;</P>
<P>&nbsp;a+=buf[0];<BR>&nbsp;a&lt;&lt;=8;<BR>&nbsp;a+=buf[1];<BR>&nbsp;a&lt;&lt;=8;<BR>&nbsp;a+=buf[2];<BR>&nbsp;a&lt;&lt;=8;<BR>&nbsp;a+=buf[3];</P>
<P>&nbsp;b+=buf[4];<BR>&nbsp;b&lt;&lt;=8;<BR>&nbsp;b+=buf[5];<BR>&nbsp;b&lt;&lt;=8;<BR>&nbsp;b+=buf[6];<BR>&nbsp;b&lt;&lt;=8;<BR>&nbsp;b+=buf[7];<BR>&nbsp;left0=a+sk[0];<BR>&nbsp;right0=b+sk[1];<BR>&nbsp;for(i=1;i&lt;=12;i++){<BR>&nbsp;&nbsp;left1=(ls(left0^right0,right0)+sk[2*i]);<BR>&nbsp;&nbsp;right1=(ls(right0^left1,left1)+sk[2*i+1]);<BR>&nbsp;&nbsp;left0=left1;<BR>&nbsp;&nbsp;right0=right1;<BR>&nbsp;}<BR>&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;&nbsp;output[i]=0;<BR>&nbsp;output[0]=(left0&gt;&gt;24)&amp;0xFF;<BR>&nbsp;output[1]=(left0&gt;&gt;16)&amp;0xFF;<BR>&nbsp;output[2]=(left0&gt;&gt;8)&amp;0xFF;<BR>&nbsp;output[3]=(left0&gt;&gt;0)&amp;0xFF;</P>
<P>&nbsp;output[4]=(right0&gt;&gt;24)&amp;0xFF;<BR>&nbsp;output[5]=(right0&gt;&gt;16)&amp;0xFF;<BR>&nbsp;output[6]=(right0&gt;&gt;8)&amp;0xFF;<BR>&nbsp;output[7]=(right0&gt;&gt;0)&amp;0xFF;</P>
<P>}</P>
<P>void rc5decrypt(unsigned char *buf,unsigned char *output,int *sk)<BR>{<BR>&nbsp;unsigned int left0=0,left1=0,right0=0,right1=0;<BR>&nbsp;unsigned int a=0,b=0;<BR>&nbsp;int i;</P>
<P>&nbsp;&nbsp;left1=buf[0];<BR>&nbsp;&nbsp;left1&lt;&lt;=8;<BR>&nbsp;&nbsp;left1+=buf[1];<BR>&nbsp;&nbsp;left1&lt;&lt;=8;<BR>&nbsp;&nbsp;left1+=buf[2];<BR>&nbsp;&nbsp;left1&lt;&lt;=8;<BR>&nbsp;&nbsp;left1+=buf[3];</P>
<P>&nbsp;&nbsp;right1+=buf[4];<BR>&nbsp;&nbsp;right1&lt;&lt;=8;<BR>&nbsp;&nbsp;right1+=buf[5];<BR>&nbsp;&nbsp;right1&lt;&lt;=8;<BR>&nbsp;&nbsp;right1+=buf[6];<BR>&nbsp;&nbsp;right1&lt;&lt;=8;<BR>&nbsp;&nbsp;right1+=buf[7];</P>
<P>&nbsp;&nbsp;for(i=12;i&gt;=1;i--){<BR>&nbsp;&nbsp;&nbsp;right0=(rs(right1-sk[2*i+1],left1)^left1);<BR>&nbsp;&nbsp;&nbsp;left0=(rs(left1-sk[2*i],right0)^right0);<BR>&nbsp;&nbsp;&nbsp;left1=left0;<BR>&nbsp;&nbsp;&nbsp;right1=right0;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;b=right0-sk[1];<BR>&nbsp;&nbsp;a=left0-sk[0];</P>
<P>&nbsp;&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;&nbsp;&nbsp;output[i]=0;</P>
<P>&nbsp;&nbsp;output[0]=(a&gt;&gt;24)&amp;0xFF;<BR>&nbsp;&nbsp;output[1]=(a&gt;&gt;16)&amp;0xFF;<BR>&nbsp;&nbsp;output[2]=(a&gt;&gt;8)&amp;0xFF;<BR>&nbsp;&nbsp;output[3]=(a&gt;&gt;0)&amp;0xFF;</P>
<P>&nbsp;&nbsp;output[4]=(b&gt;&gt;24)&amp;0xFF;<BR>&nbsp;&nbsp;output[5]=(b&gt;&gt;16)&amp;0xFF;<BR>&nbsp;&nbsp;output[6]=(b&gt;&gt;8)&amp;0xFF;<BR>&nbsp;&nbsp;output[7]=(b&gt;&gt;0)&amp;0xFF;<BR>}</P>
<P>int Crypt(char *sourcepath,char *destpath,char *key)<BR>{<BR>&nbsp;unsigned int sk[26]={0};<BR>&nbsp;GenerateSubKey(sk,key);<BR>&nbsp;FILE *fsource;<BR>&nbsp;FILE *fdest;<BR>&nbsp;int i;<BR>&nbsp;int filesize=0;<BR>&nbsp;int crypttimes=0;<BR>&nbsp;unsigned char buf[8]={0};<BR>&nbsp;unsigned char output[8]={0};<BR>&nbsp;fsource=fopen(sourcepath,"rb");<BR>&nbsp;fdest=fopen(destpath,"wb");<BR>&nbsp;fseek(fsource,0,2);<BR>&nbsp;filesize=ftell(fsource);<BR>&nbsp;rewind(fsource);<BR>&nbsp;crypttimes=filesize/8;<BR>&nbsp;while(crypttimes&gt;0){<BR>&nbsp;&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;&nbsp;&nbsp;buf[i]=fgetc(fsource);<BR>&nbsp;&nbsp;rc5crypt(buf,output,sk);<BR>&nbsp;&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;&nbsp;&nbsp;fputc(output[i],fdest);<BR>&nbsp;&nbsp;crypttimes--;<BR>&nbsp;}<BR>&nbsp;if(filesize%8!=0){<BR>&nbsp;&nbsp;for(i=0;i&lt;filesize%8;i++)<BR>&nbsp;&nbsp;&nbsp;buf[i]=fgetc(fsource);<BR>&nbsp;&nbsp;for(i=filesize%8;i&lt;8;i++)<BR>&nbsp;&nbsp;&nbsp;buf[i]=0;<BR>&nbsp;&nbsp;rc5crypt(buf,output,sk);<BR>&nbsp;&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;&nbsp;&nbsp;fputc(output[i],fdest);<BR>&nbsp;}<BR>&nbsp;fputc(filesize%8,fdest);<BR>&nbsp;fclose(fsource);<BR>&nbsp;fclose(fdest);</P>
<P>&nbsp;return 1;<BR>}</P>
<P>int Decrypt(char *sourcepath,char *destpath,char *key)<BR>{<BR>&nbsp;unsigned int sk[26]={0};<BR>&nbsp;GenerateSubKey(sk,key);<BR>&nbsp;FILE *fsource;<BR>&nbsp;FILE *fdest;<BR>&nbsp;int crypttimes,filesize;<BR>&nbsp;int i;<BR>&nbsp;int flag;<BR>&nbsp;unsigned char buf[8]={0};<BR>&nbsp;unsigned char output[8]={0};</P>
<P>&nbsp;fsource=fopen(sourcepath,"rb");<BR>&nbsp;fdest=fopen(destpath,"wb");<BR>&nbsp;fseek(fsource,0,2);<BR>&nbsp;filesize=ftell(fsource);<BR>&nbsp;rewind(fsource);<BR>&nbsp;crypttimes=filesize/8;<BR>&nbsp;fseek(fsource,filesize-1,0);<BR>&nbsp;flag=fgetc(fsource);<BR>&nbsp;rewind(fsource);<BR>&nbsp;while(crypttimes&gt;1){<BR>&nbsp;&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;&nbsp;&nbsp;buf[i]=fgetc(fsource);<BR>&nbsp;&nbsp;rc5decrypt(buf,output,sk);<BR>&nbsp;&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;&nbsp;&nbsp;fputc(output[i],fdest);<BR>&nbsp;&nbsp;crypttimes--;<BR>&nbsp;}<BR>&nbsp;if(flag==0){<BR>&nbsp;&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;&nbsp;&nbsp;buf[i]=fgetc(fsource);<BR>&nbsp;&nbsp;rc5decrypt(buf,output,sk);<BR>&nbsp;&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;&nbsp;&nbsp;fputc(output[i],fdest);<BR>&nbsp;}<BR>&nbsp;else{<BR>&nbsp;&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;&nbsp;&nbsp;buf[i]=fgetc(fsource);<BR>&nbsp;&nbsp;rc5decrypt(buf,output,sk);<BR>&nbsp;&nbsp;for(i=0;i&lt;flag;i++)<BR>&nbsp;&nbsp;&nbsp;fputc(output[i],fdest);<BR>&nbsp;}<BR>&nbsp;fclose(fsource);<BR>&nbsp;fclose(fdest);</P>
<P>&nbsp;return 1;<BR>}<BR></P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[RC4流密码算法]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sunxiaojun&amp;id=12412</link>
<author>sunxiaojun</author>
<pubDate>2006/3/9 20:19:59</pubDate>
<description><![CDATA[
<P>RC4流密码算法应该说还是不错的.呵呵.</P>
<P>首先,流密码比块密码要方便,不存在加密文件前后文件大小不一致的情况.至少看起来比较正常.哈哈.</P>
<P>RC4算法的优点也非常明显,速度很快.</P>
<P>也是用C语言实现.</P>
<P>&nbsp;</P>
<P>#include &lt;stdio.h&gt;<BR>#include &lt;string.h&gt;</P>
<P>//此程序为RC4流密码算法的实现<BR>int is_Sourcepathright(char *source_path);<BR>int is_Destpathright(char *dest_path);<BR>int Check(int argc,char **argv);<BR>int Crypt(char *sourcepath,char *destpath,char *key);<BR>int Decrypt(char *sourcepath,char *destpath,char *key);</P>
<P>int main(int argc,char **argv)<BR>{<BR>&nbsp;if (Check(argc,argv)==0){<BR>&nbsp;&nbsp;return -1;<BR>&nbsp;}<BR>&nbsp;if (argv[4][0]=='e'||argv[4][0]=='E'){<BR>&nbsp;&nbsp;if(Crypt(argv[1],argv[2],argv[3]))<BR>&nbsp;&nbsp;&nbsp;return 1;<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;return -1;<BR>&nbsp;}<BR>&nbsp;if (argv[4][0]=='d'||argv[4][0]=='D'){<BR>&nbsp;&nbsp;if(Crypt(argv[1],argv[2],argv[3]))<BR>&nbsp;&nbsp;&nbsp;return 1;<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;return -1;<BR>&nbsp;}<BR>&nbsp;return -1;<BR>}</P>
<P>int is_Sourcepathright(char *source_path)<BR>{<BR>&nbsp;FILE *fp;<BR>&nbsp;if ((fp=fopen(source_path,"rb"))==NULL){<BR>&nbsp;&nbsp;printf("您所输入的文件不存在.");<BR>&nbsp;&nbsp;fclose(fp);<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;else{<BR>&nbsp;&nbsp;fclose(fp);<BR>&nbsp;&nbsp;return 1;<BR>&nbsp;}<BR>}</P>
<P>int is_Destpathright(char *dest_path)<BR>{<BR>&nbsp;FILE *fp;<BR>&nbsp;if ((fp=fopen(dest_path,"wb"))==NULL){<BR>&nbsp;&nbsp;printf("输入的路径不正确.");<BR>&nbsp;&nbsp;fclose(fp);<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;else{<BR>&nbsp;&nbsp;fclose(fp);<BR>&nbsp;&nbsp;return 1;<BR>&nbsp;}<BR>}</P>
<P>int is_InputKeyRight(char *inputkey)<BR>{<BR>&nbsp;if(strlen(inputkey)&lt;=256&amp;&amp;strlen(inputkey)&gt;0)<BR>&nbsp;&nbsp;return 1;<BR>&nbsp;else<BR>&nbsp;&nbsp;return 0;<BR>}</P>
<P>int Check(int argc,char **argv)<BR>{<BR>&nbsp;if(argc!=5){<BR>&nbsp;&nbsp;printf("命令长度有错误。\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(is_Sourcepathright(argv[1])==0){<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(is_Destpathright(argv[2])==0){<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(is_InputKeyRight(argv[3])==0){<BR>&nbsp;&nbsp;printf("输入的密钥不正确。\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(strlen(argv[4])&gt;1){<BR>&nbsp;&nbsp;printf("错误的加解密类型。\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(argv[4][0]!='e'&amp;&amp;argv[4][0]!='E'&amp;&amp;argv[4][0]!='d'&amp;&amp;argv[4][0]!='D'){<BR>&nbsp;&nbsp;printf("错误的加解密类型。\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;return 1;<BR>}</P>
<P>void InitS(unsigned char *s)<BR>{<BR>&nbsp;int i;<BR>&nbsp;for(i=0;i&lt;256;i++)<BR>&nbsp;&nbsp;s[i]=i;<BR>}</P>
<P>void InitT(unsigned char *t,char *inputkey)<BR>{<BR>&nbsp;int i;<BR>&nbsp;for(i=0;i&lt;256;i++)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;t[i]=inputkey[i%strlen(inputkey)];<BR>&nbsp;&nbsp;}<BR>}</P>
<P>void Swap(unsigned char *s,int first,int last)<BR>{<BR>&nbsp;unsigned char temp;<BR>&nbsp;temp=s[first];<BR>&nbsp;s[first]=s[last];<BR>&nbsp;s[last]=temp;<BR>}</P>
<P>void InitPofS(unsigned char *s,unsigned char *t)<BR>{<BR>&nbsp;int i;<BR>&nbsp;int j=0;<BR>&nbsp;for(i=0;i&lt;256;i++)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;j=(j+s[i]+t[i])%256;<BR>&nbsp;&nbsp;&nbsp;Swap(s,i,j);<BR>&nbsp;&nbsp;}<BR>}</P>
<P>int Crypt(char *sourcepath,char *destpath,char *key)<BR>{<BR>&nbsp;unsigned char s[256]={0};<BR>&nbsp;unsigned char t[256]={0};<BR>&nbsp;int buf;<BR>&nbsp;FILE *fsource;<BR>&nbsp;FILE *fdest;<BR>&nbsp;int i=0;<BR>&nbsp;int j=0;<BR>&nbsp;int k=0;<BR>&nbsp;int temp;</P>
<P>&nbsp;InitS(s);<BR>&nbsp;InitT(t,key);<BR>&nbsp;InitPofS(s,t);<BR>&nbsp;fsource=fopen(sourcepath,"rb");<BR>&nbsp;fdest=fopen(destpath,"wb");<BR>&nbsp;buf=fgetc(fsource);<BR>&nbsp;while(buf!=EOF){<BR>&nbsp;&nbsp;i=(i+1)%256;<BR>&nbsp;&nbsp;j=(j+s[i])%256;<BR>&nbsp;&nbsp;Swap(s,i,j);<BR>&nbsp;&nbsp;temp=(s[i]+s[j])%256;<BR>&nbsp;&nbsp;k=s[temp];<BR>&nbsp;&nbsp;fputc(k^buf,fdest);<BR>&nbsp;&nbsp;buf=fgetc(fsource);<BR>&nbsp;}<BR>&nbsp;return 1;<BR>}</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[DES密码算法]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sunxiaojun&amp;id=12411</link>
<author>sunxiaojun</author>
<pubDate>2006/3/9 19:58:36</pubDate>
<description><![CDATA[<P>这次贴个实用点的,DES密码算法.该密码算法应该说还是比较安全的.作为一般的个人使用相信没有什么大的问题.</P>
<P>只是由于对C语言以及算法的理解有限,该DES算法程序实现的加密解密效率较低,加密文本文件尚感觉不到,如果用来加密多媒体文件等较大的文件,就会觉得像老牛拉车了.</P>
<P>DES密码算法是一种块加密算法,也就是一次加密一定大小的块.标准DES一次加密64个bit,也就是8个字节.我实现的时候是使用unsigned char&nbsp;[8]这样的数组作为缓冲区,也即数组中的每一个bit都用到了,如果用unsigned char [64]这样的数组作为缓冲取,也就是数组中的每一个元素只代表一个 bit.这样会造成内存的浪费.</P>
<P>在做的时候还遇到了另外一个问题,因为DES是块加密算法,所以如果一个文件的大小不能整除8字节的时候,就会无法加密解密剩下的几个不足8字节的文件,当时考虑的方法是:计算文件大小能否被8byte整除,无论能与不能,都为其添加数个字节使其能被8整除,然后多加一个byte的数据用来保存刚才添加字节的数量.比如:文件为9byte,程序就为其添加7byte,然后再添加1byte,最后这1byte的值为7.</P>
<P>运行参数为:程序名&nbsp;&nbsp;&nbsp;&nbsp; 希望加密的文件路径&nbsp;&nbsp;&nbsp;&nbsp; 保存加密后的文件路径&nbsp;&nbsp;&nbsp;&nbsp; 密钥&nbsp;&nbsp;&nbsp;&nbsp; E/D(E为加密,D为解密)</P>
<P>&nbsp;</P>
<P>#include &lt;stdio.h&gt;<BR>#include &lt;string.h&gt;<BR>//此DES算法为CBC--密码分组链接模式<BR>//此DES算法的加解密效率约为56K每秒。<BR>int Crypt(char *sourcepath,char *destpath,char *inputkey,char *inputiv);<BR>int Decrypt(char *sourcepath,char *destpath,char *inputkey,char *inputiv);<BR>int is_InputKeyRight(char *inputkey);<BR>int Check(int argc,char **argv);<BR>int is_Sourcepathright(char *source_path);<BR>int is_Destpathright(char *dest_path);<BR>void IP(unsigned char *output,unsigned char *input);<BR>void IP1(unsigned char *output,unsigned char *input);<BR>unsigned char getbit(int n,unsigned char ch);<BR>int EP(unsigned char *EPplaintext,unsigned char *plaintext);<BR>int F(unsigned char *r,unsigned char *k,unsigned char *output);<BR>void P(unsigned char *output,unsigned char *input);<BR>void FK(unsigned char *l,unsigned char *r,unsigned char *sk,unsigned char *output);<BR>int PC1(unsigned char *cd,unsigned char *input);<BR>int PC2(unsigned char *output,unsigned char *input);<BR>int LS1(unsigned char *input);<BR>void GenerateSubkey(char sk[16][6],char *inputkey);<BR>void des(unsigned char *output,unsigned char *plaintext,unsigned char sk[16][6],int flag);</P>
<P>int main(int argc,char **argv)<BR>{<BR>&nbsp;if (Check(argc,argv)==0){<BR>&nbsp;&nbsp;return -1;<BR>&nbsp;}<BR>&nbsp;if (argv[5][0]=='e'||argv[5][0]=='E'){<BR>&nbsp;&nbsp;if(Crypt(argv[1],argv[2],argv[3],argv[4]))<BR>&nbsp;&nbsp;&nbsp;return 1;<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;return -1;<BR>&nbsp;}<BR>&nbsp;if (argv[5][0]=='d'||argv[5][0]=='D'){<BR>&nbsp;&nbsp;if(Decrypt(argv[1],argv[2],argv[3],argv[4]))<BR>&nbsp;&nbsp;&nbsp;return 1;<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;return -1;<BR>&nbsp;}<BR>&nbsp;return -1;<BR>}</P>
<P>unsigned char getbit(int n,unsigned char ch)//0-8均可作为n的传递值<BR>{<BR>&nbsp;if(n==0)<BR>&nbsp;&nbsp;n=8;<BR>&nbsp;if(((ch&gt;&gt;(8-n))&amp;1)==1)<BR>&nbsp;&nbsp;return 1;<BR>&nbsp;else<BR>&nbsp;&nbsp;return 0;<BR>}</P>
<P>void IP(unsigned char *output,unsigned char *input)//output[8]<BR>{<BR>&nbsp;unsigned char IPmap[]={<BR>&nbsp;&nbsp;58,50,42,34,26,18,10,2,<BR>&nbsp;&nbsp;60,52,44,36,28,20,12,4,<BR>&nbsp;&nbsp;62,54,46,38,30,22,14,6,<BR>&nbsp;&nbsp;64,56,48,40,32,24,16,8,<BR>&nbsp;&nbsp;57,49,41,33,25,17,9,1,<BR>&nbsp;&nbsp;59,51,43,35,27,19,11,3,<BR>&nbsp;&nbsp;61,53,45,37,29,21,13,5,<BR>&nbsp;&nbsp;63,55,47,39,31,23,15,7<BR>&nbsp;};<BR>&nbsp;int i=0;<BR>&nbsp;int j=0;<BR>&nbsp;int k=7;<BR>&nbsp;for(i=0;i&lt;8;i++){<BR>&nbsp;&nbsp;for(j=0;j&lt;8;j++){<BR>&nbsp;&nbsp;&nbsp;output[i]=output[i]+getbit(IPmap[j+i*8]%8,input[(IPmap[j+i*8]-1)/8]);<BR>&nbsp;&nbsp;&nbsp;if(k&gt;0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;output[i]=output[i]&lt;&lt;1;<BR>&nbsp;&nbsp;&nbsp;k--;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;k=7;<BR>&nbsp;}<BR>}</P>
<P>void IP1(unsigned char *output,unsigned char *input)<BR>{<BR>&nbsp;unsigned char IP1map[]={<BR>&nbsp;&nbsp;40,8,48,16,56,24,64,32,<BR>&nbsp;&nbsp;39,7,47,15,55,23,63,31,<BR>&nbsp;&nbsp;38,6,46,14,54,22,62,30,<BR>&nbsp;&nbsp;37,5,45,13,53,21,61,29,<BR>&nbsp;&nbsp;36,4,44,12,52,20,60,28,<BR>&nbsp;&nbsp;35,3,43,11,51,19,59,27,<BR>&nbsp;&nbsp;34,2,42,10,50,18,58,26,<BR>&nbsp;&nbsp;33,1,41,9,49,17,57,25<BR>&nbsp;};<BR>&nbsp;int i;<BR>&nbsp;int j;<BR>&nbsp;int k=7;<BR>&nbsp;for(i=0;i&lt;8;i++){<BR>&nbsp;&nbsp;for(j=0;j&lt;8;j++){<BR>&nbsp;&nbsp;&nbsp;output[i]=output[i]+getbit(IP1map[j+i*8]%8,input[(IP1map[j+i*8]-1)/8]);<BR>&nbsp;&nbsp;&nbsp;if(k&gt;0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;output[i]=output[i]&lt;&lt;1;<BR>&nbsp;&nbsp;&nbsp;k--;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;k=7;<BR>&nbsp;}<BR>}</P>
<P>int EP(unsigned char *EPplaintext,unsigned char *plaintext)<BR>{<BR>&nbsp;unsigned char EPmap[]={<BR>&nbsp;&nbsp;32,1,2,3,4,5,<BR>&nbsp;&nbsp;4,5,6,7,8,9,<BR>&nbsp;&nbsp;8,9,10,11,12,13,<BR>&nbsp;&nbsp;12,13,14,15,16,17,<BR>&nbsp;&nbsp;16,17,18,19,20,21,<BR>&nbsp;&nbsp;20,21,22,23,24,25,<BR>&nbsp;&nbsp;24,25,26,27,28,29,<BR>&nbsp;&nbsp;28,29,30,31,32,1<BR>&nbsp;};<BR>&nbsp;int i;<BR>&nbsp;int j;<BR>&nbsp;int k=7;<BR>&nbsp;for(i=0;i&lt;6;i++){<BR>&nbsp;&nbsp;for(j=0;j&lt;8;j++){<BR>&nbsp;&nbsp;&nbsp;EPplaintext[i]=EPplaintext[i]+getbit(EPmap[j+i*8]%8,plaintext[(EPmap[j+i*8]-1)/8]);<BR>&nbsp;&nbsp;&nbsp;if(k&gt;0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;EPplaintext[i]=EPplaintext[i]&lt;&lt;1;<BR>&nbsp;&nbsp;&nbsp;k--;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;k=7;<BR>&nbsp;}<BR>&nbsp;return 1;<BR>}</P>
<P>int F(unsigned char *r,unsigned char *k,unsigned char *output)<BR>{<BR>&nbsp;unsigned char s1[4][16]={<BR>&nbsp;&nbsp;{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},<BR>&nbsp;&nbsp;{0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},<BR>&nbsp;&nbsp;{4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},<BR>&nbsp;&nbsp;{15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}<BR>&nbsp;};<BR>&nbsp;unsigned char s2[4][16]={<BR>&nbsp;&nbsp;{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},<BR>&nbsp;&nbsp;{3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},<BR>&nbsp;&nbsp;{0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},<BR>&nbsp;&nbsp;{13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}<BR>&nbsp;};<BR>&nbsp;unsigned char s3[4][16]={<BR>&nbsp;&nbsp;{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},<BR>&nbsp;&nbsp;{13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},<BR>&nbsp;&nbsp;{13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},<BR>&nbsp;&nbsp;{1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}<BR>&nbsp;};<BR>&nbsp;unsigned char s4[4][16]={<BR>&nbsp;&nbsp;{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},<BR>&nbsp;&nbsp;{13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},<BR>&nbsp;&nbsp;{10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},<BR>&nbsp;&nbsp;{3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}<BR>&nbsp;};<BR>&nbsp;unsigned char s5[4][16]={<BR>&nbsp;&nbsp;{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},<BR>&nbsp;&nbsp;{14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},<BR>&nbsp;&nbsp;{4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},<BR>&nbsp;&nbsp;{11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}<BR>&nbsp;};<BR>&nbsp;unsigned char s6[4][16]={<BR>&nbsp;&nbsp;{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},<BR>&nbsp;&nbsp;{10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},<BR>&nbsp;&nbsp;{9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},<BR>&nbsp;&nbsp;{4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}<BR>&nbsp;};<BR>&nbsp;unsigned char s7[4][16]={<BR>&nbsp;&nbsp;{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},<BR>&nbsp;&nbsp;{13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},<BR>&nbsp;&nbsp;{1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},<BR>&nbsp;&nbsp;{6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}<BR>&nbsp;};<BR>&nbsp;unsigned char s8[4][16]={<BR>&nbsp;&nbsp;{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},<BR>&nbsp;&nbsp;{1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},<BR>&nbsp;&nbsp;{7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},<BR>&nbsp;&nbsp;{2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}<BR>&nbsp;};<BR>&nbsp;unsigned char temp[6];<BR>&nbsp;unsigned char temp1[8]={0};<BR>&nbsp;int i;<BR>&nbsp;unsigned char x[8]={0};<BR>&nbsp;unsigned char y[8]={0};<BR>&nbsp;unsigned char EPplaintext[6];<BR>&nbsp;unsigned char output1[4]={0};</P>
<P>&nbsp;EP(EPplaintext,r);<BR>&nbsp;for(i=0;i&lt;6;i++)<BR>&nbsp;&nbsp;temp[i]^=k[i];</P>
<P>&nbsp;temp1[0]=(temp[0]&gt;&gt;2);</P>
<P>&nbsp;temp1[1]=(temp[0]&amp;3);<BR>&nbsp;temp1[1]&lt;&lt;=2;<BR>&nbsp;temp1[1]=temp1[1]+(temp[1]&gt;&gt;4);</P>
<P>&nbsp;temp1[2]=(temp[1]&amp;15);<BR>&nbsp;temp1[2]&lt;&lt;=4;<BR>&nbsp;temp1[2]=temp1[2]+(temp[2]&gt;&gt;6);</P>
<P>&nbsp;temp1[3]=(temp[2]&amp;63);</P>
<P>&nbsp;temp1[4]=(temp[3]&gt;&gt;2);</P>
<P>&nbsp;temp1[5]=(temp[3]&amp;3);<BR>&nbsp;temp1[5]&lt;&lt;=2;<BR>&nbsp;temp1[5]=temp1[5]+(temp[4]&gt;&gt;4);</P>
<P>&nbsp;temp1[6]=(temp[4]&amp;15);<BR>&nbsp;temp1[6]&lt;&lt;=4;<BR>&nbsp;temp1[6]=temp1[6]+(temp[5]&gt;&gt;6);</P>
<P>&nbsp;temp1[7]=(temp[5]&amp;63);</P>
<P>&nbsp;for(i=0;i&lt;8;i++){<BR>&nbsp;&nbsp;x[i]+=getbit(3,temp1[i]);<BR>&nbsp;&nbsp;x[i]&lt;&lt;=1;<BR>&nbsp;&nbsp;x[i]+=getbit(8,temp1[i]);<BR>&nbsp;&nbsp;y[i]+=getbit(4,temp1[i]);<BR>&nbsp;&nbsp;y[i]&lt;&lt;=1;<BR>&nbsp;&nbsp;y[i]+=getbit(5,temp1[i]);<BR>&nbsp;&nbsp;y[i]&lt;&lt;=1;<BR>&nbsp;&nbsp;y[i]+=getbit(6,temp1[i]);<BR>&nbsp;&nbsp;y[i]&lt;&lt;=1;<BR>&nbsp;&nbsp;y[i]+=getbit(7,temp1[i]);<BR>&nbsp;}</P>
<P>&nbsp;output1[0]+=s1[x[0]][y[0]];<BR>&nbsp;output1[0]&lt;&lt;=4;<BR>&nbsp;output1[0]+=s2[x[1]][y[1]];</P>
<P>&nbsp;output1[1]+=s3[x[2]][y[2]];<BR>&nbsp;output1[1]&lt;&lt;=4;<BR>&nbsp;output1[1]+=s4[x[3]][y[3]];</P>
<P>&nbsp;output1[2]+=s5[x[4]][y[4]];<BR>&nbsp;output1[2]&lt;&lt;=4;<BR>&nbsp;output1[2]+=s6[x[5]][y[5]];</P>
<P>&nbsp;output1[3]+=s7[x[6]][y[6]];<BR>&nbsp;output1[3]&lt;&lt;=4;<BR>&nbsp;output1[3]+=s8[x[7]][y[7]];</P>
<P>&nbsp;P(output,output1);<BR>&nbsp;return 1;<BR>}</P>
<P>void P(unsigned char *output,unsigned char *input)<BR>{<BR>&nbsp;unsigned char map1[]={<BR>&nbsp;&nbsp;16,7,20,21,29,12,28,17,<BR>&nbsp;&nbsp;1,15,23,26,5,18,31,10,<BR>&nbsp;&nbsp;2,8,24,14,32,27,3,9,<BR>&nbsp;&nbsp;19,13,30,6,22,11,4,25<BR>&nbsp;};<BR>&nbsp;int i;<BR>&nbsp;int j;<BR>&nbsp;int k=7;</P>
<P>&nbsp;for(i=0;i&lt;4;i++){<BR>&nbsp;&nbsp;for(j=0;j&lt;8;j++){<BR>&nbsp;&nbsp;&nbsp;output[i]=output[i]+getbit(map1[j+i*8]%8,input[(map1[j+i*8]-1)/8]);<BR>&nbsp;&nbsp;&nbsp;if(k&gt;0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;output[i]=output[i]&lt;&lt;1;<BR>&nbsp;&nbsp;&nbsp;k--;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;k=7;<BR>&nbsp;}<BR>}</P>
<P>void FK(unsigned char *l,unsigned char *r,unsigned char *sk,unsigned char *output)<BR>{<BR>&nbsp;int i;<BR>&nbsp;unsigned char result[4]={0};<BR>&nbsp;F(r,sk,result);<BR>&nbsp;for(i=0;i&lt;4;i++)<BR>&nbsp;&nbsp;result[i]^=l[i];<BR>&nbsp;for(i=0;i&lt;4;i++)<BR>&nbsp;&nbsp;output[i]=r[i];<BR>&nbsp;for(i=4;i&lt;8;i++)<BR>&nbsp;&nbsp;output[i]=result[i-4];<BR>}</P>
<P>int PC1(unsigned char *cd,unsigned char *input)<BR>{<BR>&nbsp;unsigned char map1[]={<BR>&nbsp;&nbsp;57,49,41,33,25,17,9,<BR>&nbsp;&nbsp;1,58,50,42,34,26,18,<BR>&nbsp;&nbsp;10,2,59,51,43,35,27,<BR>&nbsp;&nbsp;19,11,3,60,52,44,36,<BR>&nbsp;&nbsp;63,55,47,39,31,23,15,<BR>&nbsp;&nbsp;7,62,54,46,38,30,22,<BR>&nbsp;&nbsp;14,6,61,53,45,37,29,<BR>&nbsp;&nbsp;21,13,5,28,20,12,4<BR>&nbsp;};<BR>&nbsp;int i;<BR>&nbsp;int j;<BR>&nbsp;int k=7;<BR>&nbsp;for(i=0;i&lt;7;i++){<BR>&nbsp;&nbsp;for(j=0;j&lt;8;j++){<BR>&nbsp;&nbsp;&nbsp;cd[i]=cd[i]+getbit(map1[j+i*8]%8,input[(map1[j+i*8]-1)/8]);<BR>&nbsp;&nbsp;&nbsp;if(k&gt;0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;cd[i]=cd[i]&lt;&lt;1;<BR>&nbsp;&nbsp;&nbsp;k--;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;k=7;<BR>&nbsp;}<BR>&nbsp;return 1;<BR>}</P>
<P>int PC2(unsigned char *output,unsigned char *input)<BR>{<BR>&nbsp;unsigned char map1[]={<BR>&nbsp;&nbsp;14,17,11,24,1,5,3,28,<BR>&nbsp;&nbsp;15,6,21,10,23,19,12,4,<BR>&nbsp;&nbsp;26,8,16,7,27,20,13,2,<BR>&nbsp;&nbsp;41,52,31,37,47,55,30,40,<BR>&nbsp;&nbsp;51,45,33,48,44,49,39,56,<BR>&nbsp;&nbsp;34,53,46,42,50,36,29,32<BR>&nbsp;};<BR>&nbsp;int i;<BR>&nbsp;int j;<BR>&nbsp;int k=7;<BR>&nbsp;for(i=0;i&lt;6;i++){<BR>&nbsp;&nbsp;for(j=0;j&lt;8;j++){<BR>&nbsp;&nbsp;&nbsp;output[i]=output[i]+getbit(map1[j+i*8]%8,input[(map1[j+i*8]-1)/8]);<BR>&nbsp;&nbsp;&nbsp;if(k&gt;0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;output[i]=output[i]&lt;&lt;1;<BR>&nbsp;&nbsp;&nbsp;k--;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;k=7;<BR>&nbsp;}<BR>&nbsp;return 1;<BR>}</P>
<P>int LS1(unsigned char *input)<BR>{<BR>&nbsp;int i[4]={0};<BR>&nbsp;int j[4]={0};<BR>&nbsp;unsigned char temp=0;<BR>&nbsp;unsigned char temp1=0;<BR>&nbsp;if(getbit(1,input[0])==1)i[0]=1;<BR>&nbsp;if(getbit(1,input[1])==1)i[1]=1;<BR>&nbsp;if(getbit(1,input[2])==1)i[2]=1;<BR>&nbsp;if(getbit(1,input[3])==1)i[3]=1;<BR>&nbsp;input[0]&lt;&lt;=1;<BR>&nbsp;input[1]&lt;&lt;=1;<BR>&nbsp;input[2]&lt;&lt;=1;<BR>&nbsp;input[0]+=i[1];<BR>&nbsp;input[1]+=i[2];<BR>&nbsp;input[2]+=i[3];</P>
<P>&nbsp;if(getbit(5,input[3])==1)j[0]=1;<BR>&nbsp;if(getbit(1,input[4])==1)j[1]=1;<BR>&nbsp;if(getbit(1,input[5])==1)j[2]=1;<BR>&nbsp;if(getbit(1,input[6])==1)j[3]=1;<BR>&nbsp;input[4]&lt;&lt;=1;<BR>&nbsp;input[5]&lt;&lt;=1;<BR>&nbsp;input[6]&lt;&lt;=1;<BR>&nbsp;input[4]+=j[2];<BR>&nbsp;input[5]+=j[3];<BR>&nbsp;input[6]+=j[0];</P>
<P>&nbsp;temp=input[3];<BR>&nbsp;temp1=input[3];<BR>&nbsp;temp&lt;&lt;=1;<BR>&nbsp;temp&gt;&gt;=5;<BR>&nbsp;temp&lt;&lt;=1;<BR>&nbsp;if(i[0]==1)<BR>&nbsp;&nbsp;temp+=1;<BR>&nbsp;temp&lt;&lt;=4;</P>
<P>&nbsp;temp1&lt;&lt;=1;<BR>&nbsp;if(j[1]==1)<BR>&nbsp;&nbsp;temp1=temp1+1;<BR>&nbsp;temp1&amp;=15;</P>
<P>&nbsp;input[3]=temp+temp1;<BR>&nbsp;return 1;<BR>}</P>
<P>int is_InputKeyRight(char *inputkey)//输入的密钥只能为8位的字符串<BR>{<BR>&nbsp;if(strlen(inputkey)!=8)<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;return 1;<BR>}</P>
<P>void GenerateSubkey(char sk[16][6],char *inputkey)<BR>{<BR>&nbsp;int i;<BR>&nbsp;unsigned char destkey[7]={0};<BR>&nbsp;unsigned char lstime[]={<BR>&nbsp;&nbsp;1,1,2,2,2,2,2,2,<BR>&nbsp;&nbsp;1,2,2,2,2,2,2,1<BR>&nbsp;};</P>
<P>&nbsp;PC1(destkey,inputkey);<BR>&nbsp;for(i=0;i&lt;16;i++){<BR>&nbsp;&nbsp;LS1(destkey);<BR>&nbsp;&nbsp;if(lstime[i]==2)<BR>&nbsp;&nbsp;&nbsp;LS1(destkey);<BR>&nbsp;&nbsp;PC2(sk[i],destkey);<BR>&nbsp;}<BR>}</P>
<P>void des(unsigned char *output,unsigned char *plaintext,unsigned char sk[16][6],int flag)//flag==0crypt;flag==1decrypt<BR>{<BR>&nbsp;unsigned char step1[8]={0};<BR>&nbsp;unsigned char step2[8]={0};<BR>&nbsp;unsigned char stepr[4]={0};<BR>&nbsp;unsigned char stepl[4]={0};<BR>&nbsp;unsigned char temp[4];<BR>&nbsp;int i;<BR>&nbsp;int j;<BR>&nbsp;IP(step1,plaintext);<BR>&nbsp;for(i=0;i&lt;4;i++)<BR>&nbsp;&nbsp;stepl[i]=step1[i];<BR>&nbsp;for(i=0;i&lt;4;i++)<BR>&nbsp;&nbsp;stepr[i]=step1[i+4];<BR>&nbsp;if (flag==0){<BR>&nbsp;&nbsp;for(j=0;j&lt;16;j++){<BR>&nbsp;&nbsp;&nbsp;FK(stepl,stepr,sk[j],step2);<BR>&nbsp;&nbsp;&nbsp;for(i=0;i&lt;4;i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;stepl[i]=step2[i];<BR>&nbsp;&nbsp;&nbsp;for(i=0;i&lt;4;i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;stepr[i]=step2[i+4];<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;else{<BR>&nbsp;&nbsp;for(j=0;j&lt;16;j++){<BR>&nbsp;&nbsp;FK(stepl,stepr,sk[15-j],step2);<BR>&nbsp;&nbsp;for(i=0;i&lt;4;i++)<BR>&nbsp;&nbsp;&nbsp;stepl[i]=step2[i];<BR>&nbsp;&nbsp;for(i=0;i&lt;4;i++)<BR>&nbsp;&nbsp;&nbsp;stepr[i]=step2[i+4];<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;for(i=0;i&lt;4;i++)<BR>&nbsp;&nbsp;temp[i]=step2[i];<BR>&nbsp;for(i=0;i&lt;4;i++)<BR>&nbsp;&nbsp;step2[i]=step2[i+4];<BR>&nbsp;for(i=0;i&lt;4;i++)<BR>&nbsp;&nbsp;step2[i+4]=temp[i];<BR>&nbsp;IP1(output,step2);<BR>}</P>
<P>void arrayxor(unsigned char *dest,unsigned char *input)<BR>{<BR>&nbsp;int i;<BR>&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;&nbsp;dest[i]=input[i]^dest[i];<BR>}</P>
<P>int Crypt(char *sourcepath,char *destpath,char *inputkey,char *inputiv)<BR>{<BR>&nbsp;unsigned char plaintext[8]={0};<BR>&nbsp;unsigned char sk[16][6]={0};<BR>&nbsp;unsigned char output[8]={0};<BR>&nbsp;unsigned char temp[8]={0};<BR>&nbsp;int i;<BR>&nbsp;int j;<BR>&nbsp;int filesize;<BR>&nbsp;int crypttimes;<BR>&nbsp;FILE *fsource;<BR>&nbsp;FILE *fdest;</P>
<P>&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;&nbsp;temp[i]=inputiv[i];<BR>&nbsp;GenerateSubkey(sk,inputkey);<BR>&nbsp;fsource=fopen(sourcepath,"rb");<BR>&nbsp;fdest=fopen(destpath,"wb");<BR>&nbsp;fseek(fsource,0,2);<BR>&nbsp;filesize=ftell(fsource);<BR>&nbsp;rewind(fsource);<BR>&nbsp;crypttimes=filesize/8;</P>
<P>&nbsp;while(crypttimes&gt;0){<BR>&nbsp;&nbsp;fread(plaintext,8,1,fsource);<BR>&nbsp;&nbsp;arrayxor(plaintext,temp);<BR>&nbsp;&nbsp;des(output,plaintext,sk,0);<BR>&nbsp;&nbsp;fwrite(output,8,1,fdest);<BR>&nbsp;&nbsp;crypttimes--;<BR>&nbsp;&nbsp;for(i=0;i&lt;8;i++){<BR>&nbsp;&nbsp;&nbsp;temp[i]=output[i];<BR>&nbsp;&nbsp;&nbsp;output[i]=0;<BR>&nbsp;&nbsp;}<BR>&nbsp;}</P>
<P>&nbsp;if(filesize%8!=0){<BR>&nbsp;&nbsp;fread(plaintext,filesize%8,1,fsource);<BR>&nbsp;&nbsp;for(i=0;i&lt;8-(filesize%8);i++){<BR>&nbsp;&nbsp;&nbsp;plaintext[filesize%8+i]=255;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;arrayxor(plaintext,temp);<BR>&nbsp;&nbsp;des(output,plaintext,sk,0);<BR>&nbsp;&nbsp;fwrite(output,8,1,fdest);<BR>&nbsp;}<BR>&nbsp;i=filesize%8;<BR>&nbsp;fputc(i,fdest);<BR>&nbsp;fclose(fsource);<BR>&nbsp;fclose(fdest);</P>
<P>&nbsp;return 1;<BR>}</P>
<P>int Decrypt(char *sourcepath,char *destpath,char *inputkey,char *inputiv)<BR>{<BR>&nbsp;unsigned char plaintext[8]={0};<BR>&nbsp;unsigned char sk[16][6]={0};<BR>&nbsp;unsigned char output[8]={0};<BR>&nbsp;unsigned char temp[8]={0};<BR>&nbsp;int i;<BR>&nbsp;int filesize;<BR>&nbsp;int crypttimes;<BR>&nbsp;FILE *fsource;<BR>&nbsp;FILE *fdest;<BR>&nbsp;int flag;</P>
<P>&nbsp;for(i=0;i&lt;8;i++)<BR>&nbsp;&nbsp;temp[i]=inputiv[i];<BR>&nbsp;GenerateSubkey(sk,inputkey);<BR>&nbsp;fsource=fopen(sourcepath,"rb");<BR>&nbsp;fdest=fopen(destpath,"wb");<BR>&nbsp;fseek(fsource,0,2);<BR>&nbsp;filesize=ftell(fsource);<BR>&nbsp;rewind(fsource);<BR>&nbsp;crypttimes=filesize/8;<BR>&nbsp;fseek(fsource,filesize-1,0);<BR>&nbsp;flag=fgetc(fsource);<BR>&nbsp;rewind(fsource);</P>
<P>&nbsp;while(crypttimes&gt;1){<BR>&nbsp;&nbsp;fread(plaintext,8,1,fsource);<BR>&nbsp;&nbsp;des(output,plaintext,sk,1);<BR>&nbsp;&nbsp;arrayxor(output,temp);<BR>&nbsp;&nbsp;fwrite(output,8,1,fdest);<BR>&nbsp;&nbsp;crypttimes--;<BR>&nbsp;&nbsp;for(i=0;i&lt;8;i++){<BR>&nbsp;&nbsp;&nbsp;temp[i]=plaintext[i];<BR>&nbsp;&nbsp;&nbsp;output[i]=0;<BR>&nbsp;&nbsp;}<BR>&nbsp;}</P>
<P>&nbsp;if(flag!=0){<BR>&nbsp;&nbsp;fread(plaintext,8,1,fsource);<BR>&nbsp;&nbsp;des(output,plaintext,sk,1);<BR>&nbsp;&nbsp;arrayxor(output,temp);<BR>&nbsp;&nbsp;fwrite(output,flag,1,fdest);<BR>&nbsp;}<BR>&nbsp;fclose(fsource);<BR>&nbsp;fclose(fdest);<BR>&nbsp;return 1;<BR>}</P>
<P>int Check(int argc,char **argv)<BR>{<BR>&nbsp;if(argc!=6){<BR>&nbsp;&nbsp;printf("命令长度有错误。\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(is_Sourcepathright(argv[1])==0){<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(is_Destpathright(argv[2])==0){<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(is_InputKeyRight(argv[3])==0){<BR>&nbsp;&nbsp;printf("输入的密钥不正确。\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(is_InputKeyRight(argv[4])==0){<BR>&nbsp;&nbsp;printf("输入的矢量不正确。\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(strlen(argv[5])&gt;1){<BR>&nbsp;&nbsp;printf("错误的加解密类型。\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;if(argv[5][0]!='e'&amp;&amp;argv[5][0]!='E'&amp;&amp;argv[5][0]!='d'&amp;&amp;argv[5][0]!='D'){<BR>&nbsp;&nbsp;printf("错误的加解密类型。\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;return 1;<BR>}</P>
<P>int is_Sourcepathright(char *source_path)<BR>{<BR>&nbsp;FILE *fp;<BR>&nbsp;if ((fp=fopen(source_path,"rb"))==NULL){<BR>&nbsp;&nbsp;printf("您所输入的文件不存在.");<BR>&nbsp;&nbsp;fclose(fp);<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;else{<BR>&nbsp;&nbsp;fclose(fp);<BR>&nbsp;&nbsp;return 1;<BR>&nbsp;}<BR>}</P>
<P>int is_Destpathright(char *dest_path)<BR>{<BR>&nbsp;FILE *fp;<BR>&nbsp;if ((fp=fopen(dest_path,"wb"))==NULL){<BR>&nbsp;&nbsp;printf("输入的路径不正确.");<BR>&nbsp;&nbsp;fclose(fp);<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;else{<BR>&nbsp;&nbsp;fclose(fp);<BR>&nbsp;&nbsp;return 1;<BR>&nbsp;}<BR>}</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[还算经典]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sunxiaojun&amp;id=12410</link>
<author>sunxiaojun</author>
<pubDate>2006/3/9 19:49:08</pubDate>
<description><![CDATA[放弃不该放弃的是无能&nbsp;放弃该放弃的是无奈&nbsp; <BR>不放弃该放弃的是无知&nbsp;不放弃不该放弃的执着&nbsp; <BR>人生就是5%的痛苦&nbsp;和5%的精彩&nbsp;剩下的就是90%的平淡&nbsp; <BR>而人就是受着5%的精彩的诱惑而忍受着5%的痛苦&nbsp; <BR>生活在90%的平淡中&nbsp; <BR><BR>人居然得不到自己喜欢的&nbsp; <BR>就只好去喜欢&nbsp; <BR>自己所能得到的了！！&nbsp; <BR><BR>恶劣的性格&nbsp;总是在幸运的时候表现出来！！&nbsp; <BR>良好的品格&nbsp;总是在厄运&nbsp;灾难的时候表现出来！！&nbsp; <BR>古语有云：幸福就是要学会克制欲望！如果对什么都看不顺眼&nbsp;那你觉得疲劳的绝对不仅仅是你的眼睛而已！！&nbsp;]]></description>
</item><item>
<title><![CDATA[左右人生的13条金科玉律 [转]]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sunxiaojun&amp;id=12409</link>
<author>sunxiaojun</author>
<pubDate>2006/3/9 19:49:08</pubDate>
<description><![CDATA[<P>1、墨非定律：如果坏事有可能发生，不管这种可能性多么小，它总会发生， <BR>并引起最大可能的损失。 </P>
<P>2、二八法则：二八法则主张：以一个小的诱因、投入或努力，通常可以产生大 <BR>的结果、产出或报酬。就字面意义来看，这法则是说，你所完成的工作里80% <BR>的成果，来自于你所付出的20%。 </P>
<P>3、马太效应：穷的越穷，富的越富，用时髦的话说就是这是一个赢家通吃的社会。 </P>
<P>4、手表定理：有一只表的人知道现在几点了，有两只表的人则无法确定。 </P>
<P>5、“不值得”定律：不值得做的事，就不值得做好。 </P>
<P>6、彼得原理：在一个等级组织中，雇员趋向于晋升到其不称职的地位。 </P>
<P>7、零和游戏：游戏者有赢有输，但整个游戏的总成绩永远为零。 </P>
<P>8、华盛顿合作规律：一个人敷衍了事；两个人互相推诿；三个人则永无成事之日。 </P>
<P>9、酒与污水定律：如果把一匙酒倒进一桶污水，你得到的是一桶污水；如果你把一匙 <BR>污水倒进一桶酒，你得到的还是一桶污水。 </P>
<P>10、水桶定律：一只水桶能装多少水，完全取决与它最短的那块木板。 </P>
<P>11、蘑菇管理原则：对于初出茅芦者管理原则如下：将其置于阴暗角落，浇上大粪，任 <BR>其自生自灭。 </P>
<P>12、钱的问题：当某人告诉你：“不是钱，而是原则问题”时，十有八九是钱的问题。 </P>
<P>13、奥卡姆剃刀：如无必要，勿增实体。简单与复杂定律：把事情变复杂很简单，把事 <BR>情变简单很复杂。 </P>
<P>&nbsp;</P>
<P>&nbsp;</P>]]></description>
</item>
</channel>
</rss>