|
从网络上down了份3des的代码,在Fedora上用gcc编译运行了一下,但却发现有错误。
后来跟了一下,发现是下面的DES()中的加密处,只做了一次循环,到第2次时,就
出现了段错误, 请详见funF()。看了一下Transform(),没感觉到哪会出错,就
特地上来向大家请教,谢谢。最后是运行后的debug信息。
ps:1.谁有可以在gcc下能编译通过的3des代码,可否发给我?
2.把des()和funF()代码中的xor()去掉,就是ecb算法,可对?
void DES(char Out[8], char In[8], const PSubKey pSubKey, int Type)
{
printf("\n\n\t\t***Enter Des()***\n");
int i;
static int M[64], tmp[32], *Li = &M[0], *Ri = &M[32];
Byte2Bit(M, In, 64); printf("--- ");
Transform(M, M, Table_IP, 64); printf("-------------\n");
if( Type == ENCRYPT )
{ //加密
for(i = 0; i < 16; ++i)
{
printf("loop[%d] \n", i);
memcpy(tmp, Ri, 32);
funF(Ri, (*pSubKey)); //<===Loop=1时有错!
Xor(Ri, Li, 32);
memcpy(Li, tmp, 32);
}
}
else //解密
{
for(i = 15; i >= 0; --i)
{
memcpy(tmp, Li, 32);
funF(Li, (*pSubKey));
Xor(Li, Ri, 32);
memcpy(Ri, tmp, 32);
}
}
Transform(M, M, Table_InverseIP, 64);
Bit2Byte(Out, M, 64);
printf("\t\t***Finish Des()***\n\n");
}
//通用置换函数
void Transform(int *Out, int *In, const char *Table, int len)
{
printf("Enter Transform() \t");
int i;
for(i = 0; i < len; ++i)
Tmp = In[ Table - 1 ];
printf("*** ");
memcpy(Out, Tmp, len);
printf(" finished \n");
}
//异或运算
void Xor(int *InA, const int *InB, int len)
{
int i;
for( i = 0; i < len; ++ i)
InA ^= InB;
}
//F 函数
void funF(int In[32], const int Ki[48])
{
printf("Enter funF() \n");
int out[32]={0};
static int MR[48]={0};
Transform(MR, In, Table_E, 48);
////////////////////////////////////
//第2次就没做以下部分
printf("\t\ta. ");
Xor(MR, Ki, 48);
printf(" b. ");
funS(In, MR);
printf("c. ");
//Transform(In, In, Table_P, 32);
//here, I add a param "out" and modified Transform()
//but it seemed has no efffort!!!
Transform(out, In, Table_P, 32);
printf("d\n");
printf("Finish funF()\n\n");
}
显示结果:
================================================
***Enter Des()***
--- Enter Transform() *** finished
-------------
***loop[0]
Enter funF()
Enter Transform() *** finished
a. b. c. Enter Transform() *** finished
d
Finish funF()
***loop[1]
Enter funF()
Enter Transform() *** finished
Segmentation fault |
|