LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 680|回复: 0

求助:关于3des代码的段错误

[复制链接]
发表于 2009-3-29 17:56:09 | 显示全部楼层 |阅读模式
从网络上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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表