高手们!抢分啦!帮我看看程序!

minijazz 2002-05-28 01:56:02
有一C程序,关于传统密码的数字签名,但有问题,运行结果总是33333333。希望大家帮我改改,并并并写出还原程序(千万不要看掉了啊)。
本方法是以字符串X作为输入数据,利用制标函数F,产生识别标记Y=F(X)。Y由八进制数字组成的字符串。
制标函数的构造要点:
(1)将输入的字符串X分为若干块:M1,M2,M3,……Mt,每块为24bit,若Mt不足24bit,则空缺部分补0;
(2)i=1,取第i块(Mi)送给q;
(3)以4bit为单位将q划分为q1,q2,……q6,根据S盒,依次对每个qi(i=1,2,……,6)进行置换,得到
ni(4bit),最后连成n(24bit);
(4)将n与Mi(若i=t,则取M1)进行按位异或运算后,作为新的q值,i=i+1;
(5)重复(3)(4),直到i=t+1为止;
(6)根据X中各位的取值,对q进行一系列交换;
(7)最后,将交换后所得的q按顺序以3bit为一组输出8个八进制数字串。
#include <alloc.h>
char mask [8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
char sbox [6][16]={{15,3,6,13,8,4,5,14,1,10,12,0,2,9,11,7},
{6,10,11,0,1,13,8,3,12,7,5,9,15,4,2,14},
{1,13,12,7,6,10,15,4,11,0,2,14,8,3,5,9},
{3,8,14,2,0,11,9,5,13,1,4,15,10,6,7,12},
{4,15,9,5,7,12,14,2,10,6,3,8,13,1,0,11},
{9,2,4,8,10,1,3,15,7,11,14,5,0,12,13,6}};
void exchange(char *u,int x,int y)
{char mask1,mask2;
int bytex,bytey,bitx,bity;
bitx=x%8;bytex=x/8;bity=y%8;bytey=y/8;
mask1=mask[bitx]&*(u+bytex);
mask2=mask[bity]&*(u+bytey);
if((mask1&&mask2)||(mask1==0)&&(mask2==0))return;
if(mask1){*(u+bytex)&=~mask1;*(u+bytey)|=mask[bity];}
else{*(u+bytey)&=~mask2;*(u+bytex)|=mask[bitx];}
}
void P(char *m,char *u,int s)
{char ch,*mi;
int i,j,x,y;
void exchange();
for(i=0;i<s;i++)
{ch=*(m+i/8);
if(ch&mask[i%8]){x=i%12+1;y=x+12;}
else {x=i%6+1;y=x+6;}
exchange(u,x,y);
}
}
void G(char *q,char *ni,int i)
{int j;char ch;
for(j=0;j<6;j++)
{ch=*(q+j/2);
if(j%2)ch&=0x0f;
else ch>>=4;
ch=sbox[(i+j)%6][ch];
if (j%2==0) ch<<=4;
*(ni+j/2)|=ch;}
}
void Y(char *v)
{int i,j;
char ch,c,cc=0,*s;
for(s=v,i=0;i<3;i++,s++)
{ch=*s;
for(j=0;j<8;j++)
{c=ch&mask[j]?1:0; /*cc<<1*/;cc+=c;
if((i*8+j+1)%3==0) {printf("%o",cc);cc=0;}
}
}
printf("\n");
}
main()
{char x[64],*m,*mi;
char q[3],u[3],n[3]={0,0,0};
int s,t,i,j;
scanf("%s",x);
s=strlen(x);t=s%3?s/3+1:s/3;m=malloc(t*3);
for(i=0;i<s;i++)*(m+i)=*(x+i);
for(i=0;i<t*3;i++)
*(m+i)=0;
for(i=0;i<3;i++) q[i]=m[i];
for(i=0;i<t;i++)
{G(q,n,i);
mi=i<(t-1)?m+(i+1)*3:m;
for(j=0;j<3;j++)
q[j]=*(n+j)^*(mi+j);
}
P(m,q,s*8);
Y(q);
free(m);
}
...全文
72 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hnccbuck 2002-05-29
  • 打赏
  • 举报
回复
看起来很累,写规范一点也许容易看一点。说老实话,我也不会做。
jerry921 2002-05-29
  • 打赏
  • 举报
回复
too long
terron 2002-05-28
  • 打赏
  • 举报
回复
晕!!
不解 2002-05-28
  • 打赏
  • 举报
回复
考验我们的视力?!!
jimconrad 2002-05-28
  • 打赏
  • 举报
回复
惨不忍睹……
:P (闪)
jimconrad 2002-05-28
  • 打赏
  • 举报
回复
是main函数中者两行写颠倒了:
for(i=0;i<s;i++) *(m+i)=*(x+i); // line1
for(i=0;i<t*3;i++) *(m+i)=0; // line2
将line2放到line1前。
jimconrad 2002-05-28
  • 打赏
  • 举报
回复
您的代码真是惨不忍睹啊,变量名函数名没有遵循好的规范起。看得好累。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧