Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > 其他编程语言 > 实现基于IDEA算法的加密工具(8)
【标  题】:实现基于IDEA算法的加密工具(8)
【关键字】:加密,ID,EA,IDE,IDEA
【来  源】:网络

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

Your Ad Here

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 encrypt|deencrypt\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 ;

}

实现基于IDEA算法的加密工具(7):【上一篇】
IBM的MARS加密算法实现(1):【下一篇】
【相关文章】
  • 实现基于IDEA算法的加密工具(7)
  • 实现基于IDEA算法的加密工具(6)
  • 实现基于IDEA算法的加密工具(5)
  • 实现基于IDEA算法的加密工具(4)
  • 实现基于IDEA算法的加密工具(3)
  • 实现基于IDEA算法的加密工具(2)
  • 实现基于IDEA算法的加密工具(1)
  • 用PB生成GUID解决主键重复
  • 使用Line建立漂亮的Grid DataWindow的技巧
  • 动态改变grid数据窗口的字段显示顺序
  • 【随机文章】
  • Secret of Photoshop 纹理篇(鹅卵石路面)
  • 安装 VMWARE TOOLS的步骤
  • webwork 2.2 中如何给Collection赋值
  • 使用hbm2java的一个问题
  • Servlets和JSP开发原则(1)
  • 并行开发版本管理之路(二) --- 典型的版本管理难题
  • C语言学习笔记
  • IP电话语音质量的测试
  • 用 BIND 架设 DDNS Server 提供 DDNS 服务
  • 传奇源码分析-服务器端(LoginGate服务器处理)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.