动态网站制作指南
[  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 软件工程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ 软件工程 ]的信息



本月文章推荐
.安全的SOA提高MedicAlert公司可靠.
.网站项目系统分析及软件建模.
.Deming的质量管理十大原则.
.有效的软件质量管理.
.测试服务:SOA的完整性和扩展性.
.UML类图详解(1).
.灰关联分析与语音/音乐信号识别.
.回顾2005 开源软件进入SOA.
.UML组件图详解(1).
.Microsoft .NET让新一代因特网变.
.VS2005改善团队开发的人力负担与.
.SOA成熟度模型为SOA 护航.
.一种普遍的社会工程学的反思——.
.实现基于IDEA算法的加密工具(7).
.2007年值得去思考的N大软件技术.
.Visual Studio .NET中的Web项目和.
.IBM的MARS加密算法实现(8).
.详述RPG游戏引擎的设计原理.
.解析SOA反模式(1).
.在数据架构规划前进行XML消息的设.

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

文章类别:软件工程 | 发表日期:2008-3-23 |



3.5 算法实现代码

/*此处略去信息说明和头文件*/

#include "idea.h"


#define NULL ((void *)0)

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 LOW16(x) ((x)&0xffff)

#define _USEDFINDTABLE_ 1 /*是否采用查表实现*/

/*解密时密钥的换位表*/

//ULONG16 outkey[52] = { 0 };

static ULONG8 wz_spkey[52] = {

48,49,50,51,46,47,

42,44,43,45,40,41,/*解密密钥配置,2,3位要交换:44<->43*/

36,38,37,39,34,35,/*解密密钥配置,2,3位要交换:38<->37*/

30,32,31,33,28,29,/*解密密钥配置,2,3位要交换:32<->31*/

24,26,25,27,22,23,/*解密密钥配置,2,3位要交换:26<->25*/

18,20,19,21,16,17,/*解密密钥配置,2,3位要交换:20<->19*/

12,14,13,15,10,11,/*解密密钥配置,2,3位要交换:14<->13*/

6, 8, 7, 9, 4, 5,/*解密密钥配置,2,3位要交换:8<->7*/

0, 1, 2, 3

};


static ULONG8 wz_spmulrevr[18] = {/*变乘法逆的位*/

0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51

};

static ULONG8 wz_spaddrever[18] ={/*变加法逆的位*/

1,2,7,8,13,14,19,20,25,26,31,32,37,38,43,44,49,50

};

INT32 mulInv( ULONG16 x);/*取x的(%0x10001L)乘法逆*/

INT32 handle_data( ULONG16 *data, /*待加密的64位数据首地址*/

ULONG16 *key /* 6组本轮使用的16位长的密钥首地址*/

);

INT32 idea_makekey( ULONG32 *inkey,/*用户输入的128位密钥首地址*/

ULONG16 *outkey/*生成的52组16位密钥的首地址*/

);

INT32 key_leftmove(ULONG32 *inkey);

INT32 key_decryEXP(ULONG16 *outkey);/*解密密钥的变逆处理*/

INT32 MUL( ULONG16 a, ULONG16 b);/*(a*b)*/


 

INT32 idea_dec( ULONG16 *data, /*待解密的64位数据首地址*/

ULONG16 *outkey

)

{


ULONG32 i ;

ULONG16 tmp;

if ( NULL == data NULL == outkey)

{

return FAIL;

}

for ( i = 0 ; i < 48 ; i += 6)/*8轮*/

{

handle_data( data , &outkey[i]);

/*交换中间两个*/

tmp = data[1];

data[1] = data[2];

data[2] = tmp;

}

tmp = data[1];/*最后一轮不交换*/

data[1] = data[2];

data[2] = tmp;


data[0] = MUL(data[0],outkey[48]);

data[1] += outkey[49];

data[2] += outkey[50];


data[3] = MUL(data[3],outkey[51]);

return SUCCESS;

}


INT32 idea_enc( ULONG16 *data, /*待加密的64位数据首地址*/

ULONG16 *outkey

)

{

ULONG32 i ;

ULONG16 tmp;

if ( NULL == data NULL == outkey)

{

return FAIL;

}

for ( i = 0 ; i < 48 ; i += 6)/*8轮*/

{

handle_data( data , &outkey[i]);

/*交换中间两个*/

tmp = data[1];

data[1] = data[2];

data[2] = tmp;

}

tmp = data[1];/*最后一轮不交换*/

data[1] = data[2];

data[2] = tmp;


data[0] = MUL(data[0],outkey[48]);

data[1] += outkey[49];

data[2] += outkey[50];

data[3] = MUL(data[3],outkey[51]);

return SUCCESS;

}


INT32 handle_data( ULONG16 *data, /*待加密的64位数据首地址*/

ULONG16 *key /* 6组本轮使用的16位长的密钥首地址*/

)

{

ULONG16 *D1,*D2,*D3,*D4;

ULONG16 D57;/*提供给第5,7步用的暂存数据的*/

ULONG16 D68;/*提供给第6,8,9,10步用的暂存数据的*/

D1 = &data[0];

D2 = &data[1];

D3 = &data[2];

D4 = &data[3];

/*start*/

*D1 = MUL(*D1,key[0]);/*第1步*/

*D2 += key[1];/*第2步*/

*D3 += key[2];/*第3步*/

*D4 = MUL(*D4,key[3]);/*第4步*/

D57 = *D1 ^ *D3;/*第5步*/

D68 = *D2 ^ *D4;/*第6步*/

D57 = MUL(D57,key[4]);/*第7步*/

D68 += D57;/*第8步*/

D68 = MUL(D68,key[5]);/*第9步*/

*D1 ^= D68;/*第11步*/

*D3 ^= D68;/*第12步*/

D68 += D57;/*第10步*/

*D2 ^= D68;/*第13步*/

*D4 ^= D68;/*第14步*/


return SUCCESS;

}


INT32 idea_makekey( ULONG32 *inkey,/*用户输入的128位密钥首地址*/

ULONG16 *outkey/*生成的52组16位密钥的首地址*/

)

{

ULONG32 i,j,k;

ULONG16 *Pkey = ( ULONG16*)inkey;

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

{

k = i << 3;

for( j = 0 ; j < 8 ; j++)/*生成8组密钥*/

{

outkey[k+j] = Pkey[j] ;

}

key_leftmove(inkey);/*128位密钥左环移25位*/

}

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

{

outkey[48+i] = Pkey[i] ;

}


return SUCCESS;

}


INT32 key_leftmove(ULONG32 *inkey)/*密钥左环移25位*/

{

ULONG32 itmpfirst = 0,itmp = 0 ;

ULONG32 i;

inkey[0] = (inkey[0]<<25) (inkey[0]>>7);

/*取低25位,因为前面已经做了环移,原始的低7位已经移到了高位,保存*/

itmpfirst = inkey[0]&0x1ffffff;

inkey[0] &= 0xfe000000;/*低25位清0*/

for ( i = 1 ; i < 4 ; i++)

{

inkey[i] = (inkey[i]<<25) (inkey[i]>>7);

itmp = inkey[i] & 0x1ffffff;

inkey[i-1] = itmp;

inkey[i] &= 0xfe000000;/*低25位清0*/

}

inkey[i-1] = itmpfirst;/*把最高25位移到最低25位*/


return SUCCESS;

}


 

INT32 key_decryExp(ULONG16 *outkey)/*解密密钥的变逆处理*/

{

/*我习惯用查表的方法实现换位,当然也可以采用一些编程技巧直接实现*/


#if _USEDFINDTABLE_ /*用查表法*/

ULONG16 tmpkey[52] = { 0 };

ULONG32 i;

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

{

tmpkey[i] = outkey[ wz_spkey[i] ] ;/*换位*/

}

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

{

outkey[i] = tmpkey[i];

}

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

{

outkey[wz_spaddrever[i]] = 65536 -outkey[wz_spaddrever[i]] ;/*替换成加法逆*/

}

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

{

outkey[wz_spmulrevr[i]] = mulInv(outkey[wz_spmulrevr[i]] );/*替换成乘法逆*/

}


#else

ULONG16 K1, K2, K3, K4, i;

ULONG16 tmpkey[52] = { 0 };

ULONG16 *pin = outkey ;

ULONG16 *p = tmpkey + 52; /* 从后往前 */

K1 = mulInv(*pin);

K2 = 65536 - *++pin;

K3 = 65536 - *++pin;

K4 = mulInv(*++pin);

pin++;

*--p = K4;

*--p = K3;

*--p = K2;

*--p = K1;

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

{

K1 = *pin++;/*不变的两个*/

K2 = *pin++;

*--p = K2;

*--p = K1;


K1 = mulInv(*pin);

K2 = 65536 - *++pin;

K3 = 65536 - *++pin;

K4 = mulInv(*++pin);

pin++;

*--p = K4;

*--p = K2; /* 交换 */

*--p = K3;

*--p = K1;

}

K1 = *pin++;/*最后一组不交换*/

K2 = *pin++;

*--p = K2;

*--p = K1;

K1 = mulInv(*pin);

K2 = 65536 - *++pin;

K3 = 65536 - *++pin;

K4 = mulInv(*++pin);

*--p = K4;

*--p = K3;

*--p = K2;

*--p = K1;

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

{

outkey[i] = tmpkey[i];

}


 

#endif


return SUCCESS;

}


DllExport INT32 idea_MakeEncKey(ULONG16 *key, ULONG16 *outkey)

{

if ( NULL == outkey NULL == key)

{

return FAIL;

}

idea_makekey( (ULONG32*)key , outkey);

return SUCCESS;


}


INT32 idea_MakeDecKey(ULONG16 *key, ULONG16 *outkey)

{

if ( NULL == outkey NULL == key)

{

return FAIL;

}

idea_makekey( (ULONG32*)key , outkey);

key_decryExp(outkey);

return SUCCESS;

}

/*算法实现结束*/

上述代码在vc6.0环境下测试通过.


上一篇:实现基于IDEA算法的加密工具(8) 人气:222
下一篇:实现基于IDEA算法的加密工具(7) 人气:163
点击此处浏览全部软件工程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-5-21 仿中华网简单调查系统
2008-5-21 耐恩Wap下载网站系统 v1.0
2008-5-21 福建新闻小偷(DIV+CSS) v2 3.1
2008-5-21 超级美化阿波罗DJ程序 v1.1
2008-5-21 海涯英文视频网整站 v1.0
2008-5-21 在线考试系统源码及论文
2008-5-21 网奇IOS智能在线订单系统 ASP.NE
2008-5-21 网奇IOS智能在线订单系统 ASP.NE
2008-5-21 tom911免费电影完美版本-带自定义
2008-5-7 Windows XP SP3 官方英文版
2008-5-7 Windows XP SP3 官方香港中文版
2008-5-7 Windows XP SP3 官方繁体中文版
2008-5-7 Windows XP SP3 官方简体中文版
2008-4-30 Multiple Unzip Wizard 1.02
2008-4-30 Multiple Unrar Wizard 1.0.0
2008-4-30 WinZip Install/Try/Uninstall a
2008-4-30 ZIP压缩文件修复器WzipFix 2.0
2008-4-30 Pentazip 6.01 Build 189 For Wi
  发表评论
姓 名: 验证码: [ 全部贴吧 ] [ 浏览评论 ]
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報