能力值:
( LV2,RANK:10 )
|
-
-
2 楼
用c重写了一下代码,vb写的太乱。只写了加密部分的。解密的慢慢完善。
#include <stdio.h>
long b[4]={0,0,0,0},t[4]; //初始化数组b,临时数组t
long ab[4]={0x92e24749,0x49476b8b,0xb849b647,0x00d64fd1}; //加密串的异或因子 4947e292 8b6b4749 47B649B8 d14Fd600
long ac[4]={0x25f1cdb,0x4be39b6,0x12f8e6d8,0x2f8e6d80}; //乘法因子
unsigned char a[16],*c1,*c2,sc[4]; // 输入密码,加密前数据
int i,j;
int as[16]={0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
int am[4]={4,9,4,7};
int mima[32];
unsigned char cc[32];
void mimacuan()
{
for (i=0;i<32;i++) mima[i]=0;
for (i=0;i<4;i++) mima[i]=am[i];
for (i=0;i<4;i++) mima[i+4]=as[am[3-i]];
for (i=0;i<4;i++) mima[i+8]=as[15-mima[4+i]];
mima[12]=mima[2];
mima[13]=mima[3];
mima[14]=mima[0];
mima[15]=mima[1];
mima[16]=mima[2];
mima[17]=mima[3];
mima[18]=mima[11];
mima[19]=mima[10];
mima[20]=mima[0];
mima[21]=mima[1];
mima[22]=mima[9];
mima[23]=mima[8];
mima[24]=as[15-mima[2]];
mima[25]=as[15-mima[3]];
for (i=0;i<32;i++) cc[i]=mima[i];
mima[26]=cc[0]|cc[2];
mima[27]=cc[1]|cc[3];
mima[28]=as[15-mima[0]];
mima[29]=as[15-mima[1]];
mima[30]=0;
mima[31]=0;
for (i=0;i<16;i++) cc[i]=mima[2*i]*0x10+mima[2*i+1];
memcpy(ab, cc, 16);
printf("密码串:");
for (i=0;i<4;i++) printf ("%08lx ",ab[i]);
}
main()
{
printf("输入四位十六进制数字生成密码串: ");
scanf("%s",sc);
if(strlen(sc)==4 )
{
for (i=0;i<4;i++)
{
if (sc[i]<='9'&&sc[i]>='0') am[i]=sc[i]-0x30;
else
{ if (sc[i]<='f'&&sc[i]>='a') am[i]=sc[i]-'a'+10;
else if (sc[i]<='F'&&sc[i]>='A') am[i]=sc[i]-'A'+10;
else {
printf("输入不正确,用默认4947\n");
break;
}
}
}
}else printf("输入不正确,用默认4947\n");
mimacuan();
printf("\nPut your password: ");
getchar();
gets(a);
memcpy(b, a, strlen(a)); //密码进数组b
for (i=0;i<4;i++) printf("%08lx ",*(b+i));
printf("\n");
for(j=0;j<6;j++) //做5次加密算法
{
for (i=0;i<4;i++) b[i]=b[i] ^ ab[i]; //与异或因子做异或
for (i=0;i<4;i++) b[i]=b[i] * ac[i]; //与乘法因子做乘法,四位乘四位,积取低四位
c1=b;
c2=b+3;
if (*c1==0x01) b[0]=b[0] ^ 0x2aaaaaaa; //比较b[0],b[3]的低位,相等做异或
if (*c2==0x00) b[3]=b[3] ^ 0x2aaaaaaa;
t[0]=b[0] ^ b[1] ^ b[3]; //b的四个元素做异或
t[1]=b[0] ^ b[2] ^ b[3];
b[2]=b[0];
b[3]=b[1];
b[0]=t[0];
b[1]=t[1];
}
c1=b;
printf("\n密文:");
for (i=0;i<16;i++) printf("%02x ",*(c1+i)); //打印密文
printf("\n");
getch();
}
|