- UID
- 40117
注册时间2007-12-5
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
以前用vb写过,后来跟着老大学用c写,正好练练手,觉得代码简单的多了。这个加密的逻辑很简单,不过要是解密的话,就不是太容易了。因为在乘法加密的过程中,溢出的部分忽略了。有兴趣有时间的兄弟可以来一起讨论一下。
胡乱加了点点代码,写成个cm,高手就不要浪费时间了。
[hide] long b[4]={0,0,0,0},t[4]; //初始化数组b,临时数组t
long ab[4]={0x92e24749,0x49476b8b,0xb849b647,0x00d64fd1}; //加密串的异或因子(根据4位十六位字母计算)
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(int a[4]) //计算加密串
{
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(a[4]);
printf("\nPut your password: ");
//scanf("%s",a);
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++) //做6次加密算法
{
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");
}
[/hide]
[[i] 本帖最后由 sswater 于 2009-6-11 19:07 编辑 [/i]] |
|