实现基于IDEA算法的加密工具(8)

3/23/2008来源:软件工程人气:7052



3.6.1 加密工具实现源代码

下面列出按照上述操作思路编写的实现源代码


/**********************************************************************/

/*-文件名:idea.c */

/*- */

/*-功能: 利用idea加密算法实现文件的加密 */

/*- */

/*-说明: */

/*- 这是利用IDEA算法实现的文件加密工具可以在法律答应范围内以非商 */

/*-业形式自由使用,该程序的所有权利由作者吴真保留 */

/*- */

/*-版本号:1.0.0(2002.6) */

/*-AUTHOR:吴真(WUZHEN) */

/*- */

/*********************************************************************/

#include

#include

#include

#include

#include

#include "idea.h"


typedef int INT32;

typedef char INT8;

typedef unsigned char ULONG8;

typedef unsigned short ULONG16;

typedef unsigned long ULONG32;


#define SUCCESS 0

#define FAIL -1


#define WZ_COMMEND_NUM 4

#define WZUSEHELPNUM 7

#define READFILESIZE 512 /*一次从文件中读取多少字节,可以根据内存的大小调节*/

INT32 file_enc( FILE *readfile, FILE *writefile,ULONG8 *key);/*加密文件*/

INT32 file_dec( FILE *readfile, FILE *writefile,ULONG8 *key);/*解密文件*/

INT32 hextofile( ULONG8 *buf ,FILE *writefile, ULONG32 length);/*以16进制写入文件*/

INT32 encodehex(ULONG8 *tobuf,ULONG8 *frombuf,ULONG32 len);/*16进制解码*/

void wz_PRinthelp();/*打印帮助*/


INT8 *WZ_Commend_Help[] =

{


"基于IDEA的加密解密工具v1.0 ",/*0*/

"追求卓越,勇于创新 ",

"----著者 : 吴真--- ",

" "

};


INT8 *WZ_USE_HELP[]={

"输入5个参数:",

"\t1.可执行文件名 *.exe",

"\t2.操作类型 1:加密;2:解密;",

"\t3.读出数据的文件名*.txt",

"\t4.写入数据的文件名*.txt",

"\t5.密钥(32字节)",

"******************************"

};


 

void main(INT32 argc,INT8 *argv[])

{

INT8 *FILENAME1,*FILENAME2;

FILE *fp, *fp2;

ULONG8 key[33] = { 0 }; /*密钥容器*/

if ( argc != 5 )

{

wz_printhelp();

return;

}

FILENAME1 = argv[2];

FILENAME2 = argv[3];

if ((fp= fopen(FILENAME1,"r+b")) == NULL (fp2 = fopen(FILENAME2,"w+b"))==NULL)

{

printf("Can't open file\n");

return ;

}

memcpy( key, argv[4] , strlen( argv[4]) );/*取得密钥*/

switch( atoi(argv[1] ))

{

case 1:/*加密操作*/

file_enc(fp,fp2,key);

printf("\n \t IDEA 加密完毕,密文存于%s文件\n",FILENAME2);

break;


case 2:

/*解密*/

file_dec(fp,fp2,key);

printf("\n\t IDEA解密完毕,明文存于%s文件\n",FILENAME2);

break;

default:

printf("请选择是加密解密 plese choose encryptdeencrypt\n");

break;

}


fclose(fp);

fclose(fp2);



}


INT32 hextofile( ULONG8 *buf ,FILE *writefile, ULONG32 length)

{

ULONG32 writelen = 0 ;

/*以16进制形式写入文件*/

while( writelen < length)

{

if(buf[writelen] == 0)

{

fprintf( writefile, "%x", 0 );

fprintf( writefile, "%x", 0 );

}

else if (buf[writelen] < 0x10)

{

fprintf( writefile, "%x", 0 );

fprintf( writefile, "%x", buf[writelen] );

}

else

{

fprintf( writefile, "%x", buf[writelen] );


}

writelen++;


}

return SUCCESS;

}


INT32 file_enc( FILE *readfile, FILE *writefile,ULONG8 *key)

{

INT32 filelen = 0,readlen = 0,writelen = 0;

ULONG32 totalfilelen = 0 ;/*统计实际的文件的长度*/

INT32 i;

ULONG8 readbuf[READFILESIZE] = { 0 };

idea_makekey( (ULONG32*)key , outkey);

filelen = fread( readbuf, sizeof( INT8 ), READFILESIZE, readfile );

while( filelen == READFILESIZE )

{

totalfilelen += READFILESIZE;

for ( i = 0 ; i < READFILESIZE ; i += 8)

{

idea_enc( (ULONG16*)&readbuf[i] );/*加密*/

}

hextofile( readbuf, writefile, READFILESIZE );/*以16进制形式写入文件*/

memset(readbuf,0,READFILESIZE);

filelen = fread( readbuf, sizeof( INT8 ), READFILESIZE, readfile );

}

/*这是从文件中读出的最后一批数据,长度可能会等于0,所以要先判定*/


if ( filelen > 0 )

{

/*假如从文件中读出的长度不等于0,那么肯定有8个字节以上的空间

文件长度存在最后8个字节中*/

totalfilelen += filelen;

memcpy( &readbuf[READFILESIZE-8], (ULONG8*)&totalfilelen,4);

for ( i = 0 ; i < READFILESIZE ; i += 8)

{

idea_enc( (ULONG16*)&readbuf[i]);/*加密*/

}

hextofile( readbuf, writefile,READFILESIZE );/*以16进制形式写入文件*/

memset(readbuf,0 ,READFILESIZE);

}

else /*filelen == 0*/

{

memcpy( &readbuf[0], (ULONG8*)&totalfilelen,4);

idea_enc( (ULONG16*)&readbuf[0] );/*加密*/

hextofile( readbuf, writefile, 8);/*以16进制形式写入文件*/

}

return SUCCESS;

}


INT32 file_dec( FILE *readfile, FILE *writefile,ULONG8 *key)

{

INT32 filelen = 0,readlen = 0,writelen = 0;

ULONG32 totalfilelen = 0 ;/*统计实际的文件的长度*/

INT32 i,num;

ULONG8 readbuf[READFILESIZE] = { 0 };

ULONG8 sendbuf[READFILESIZE*2] = { 0 };


idea_makekey( (ULONG32*)key , outkey);

key_decryEXP(outkey);


fseek(readfile,-16,SEEK_END);/*最后16个字节的表示文件长度的空间*/

filelen = fread( sendbuf, sizeof( INT8 ), 16, readfile );


encodehex( readbuf,sendbuf,8);

idea_dec( (ULONG16*)&readbuf[0] );/*解密*/

memcpy((ULONG8*)&totalfilelen, &readbuf[0],4);/*得到文件总长*/

memset(readbuf,0 ,8);

memset(sendbuf,0 ,16);


num = totalfilelen/READFILESIZE;/*有几个READFILESIZE组*/

totalfilelen %= READFILESIZE;


fseek(readfile,0,SEEK_SET);/*跳到文件头*/

while(num--)

{

filelen = fread( sendbuf, sizeof( INT8 ), READFILESIZE*2, readfile );

encodehex( readbuf,sendbuf,READFILESIZE);

for ( i = 0 ; i < READFILESIZE ; i += 8)

{

idea_dec( (ULONG16*)&readbuf[i] );/*解密*/

}

writelen = fwrite(readbuf, sizeof( INT8 ), READFILESIZE, writefile);

memset(readbuf,0 ,READFILESIZE);

memset(sendbuf,0 ,READFILESIZE*2);

}

if ( totalfilelen > 0 )/*最后一块有多余的元素*/

{

filelen = fread( sendbuf, sizeof( INT8 ), READFILESIZE*2, readfile );

encodehex( readbuf,sendbuf,READFILESIZE);

for ( i = 0 ; i < READFILESIZE ; i += 8)

{

idea_dec( (ULONG16*)&readbuf[i] );/*解密*/

}

writelen = fwrite(readbuf, sizeof( INT8 ), totalfilelen, writefile);

memset(readbuf,0 ,READFILESIZE);

memset(sendbuf,0 ,READFILESIZE*2);


}

return SUCCESS;

}


INT32 encodehex(ULONG8 *tobuf,ULONG8 *frombuf,ULONG32 len)

{

ULONG8 *readfirst = frombuf ;

ULONG8 *readend = &frombuf[1] ;

INT8 *s;

ULONG8 y[2] ;

ULONG32 i;

for ( i = 0 ; i < len ; i++)

{

y[0] = *readfirst ;

y[1] = *readend ;

readfirst += 2 ;

readend += 2 ;

tobuf[i] = (ULONG8)strtol((INT8*)y, &s, 16);

}

return SUCCESS;

}


void wz_printhelp()

{

INT32 i ;

printf("\t");

for ( i = 0 ; i < 22 ; i++)

{

printf("%c ",5);

}

printf("\n");

for( i = 0 ; i < WZ_COMMEND_NUM ; i++)

{

printf("\t%c\t%s %c\n",5,WZ_Commend_Help[i],5);

}

printf("\t");

for ( i = 0 ; i < 22 ; i++)

{

printf("%c ",5);

}

printf("\n");

for( i = 0 ; i < WZUSEHELPNUM ; i++)

{

printf("\t%s\n",WZ_USE_HELP[i]);

}

return ;

}