移动商务应用对于数据传输的安全性有较高的要求,需要高效可靠的加密算法对关键性数据如用户信息、订单、销售数据等进行保护;同时,受限于终端手机设备的有限性能,要求所采用的加密算法必须是轻量级的。为此,我们今天就来和我们大家讲一下IDEA加密算法在移动商务中是如何应用的。

一、移动商务的特点

移动商务创造更高效、更准确的信息互动,以直接面向用户为特征的随身通讯和实时沟通让信息传递突破了互联网局限和在线效率。

移动商务以更广范的消费者覆盖为基础,将传统电子商务的疆界成倍扩张。在以客户为中心的现代商业社会,将面向互联网用户的关注更多转向数倍人口的移动通讯消费者是更加务实更具商业价值的转变。

移动商务开拓更大自由尺度的商务环境,任何人(Anyone)在任何地点(Anywhere)任何时间(Anytime)都有条件保持信息沟通,减少传统电子商务对设备条件与网络环境的要求,降低用户端参与的门槛。移动商务在给予消费者更多使用便利的同时,也为企业创造了更多商业机会。

1、应用的多样性

随着无线互联网技术的不断发展,越来越多的传统上基于电脑的商务应用被移植到了手机上。典型的应用包括:

PushiMail:将Email主动,安全地推送到用户手持终端(手机)上的移动Email解决方案,邮箱用户通过PushEmail服务,可以随时随地通过无线数据网络使用自己的移动终端设备接收电子邮件。目前较著名的应用包括RIM公司的BlackBerry和中移动的飞信。

移动供应链:企业一线销售人员从移动设备将企业的进销存、订单、物流等信息实时的收集到总部,从而实现企业供应链的优化和渠道信息的扁平化。

2、终端设备的广泛性

可用于移动商务的终端设备类型广泛,除了已有10年左右,应用历史技术最成熟的PDA之外,使用各种操作系统的智能手机如Symbian、WinCE、Linux也得到了日益广泛的使用,甚至较低端的支持Java应用和GPRS上网的普通手机也已经具备了作为移动商务终端的基本条件。

3、数据传输的局限性

受无线网络性能限制,目前仅适合传输小容量数据。GPRS的峰值速率为115.2kbit/s,CDMA1X系统的峰值速率为153.6kbit/s。而实际应用中GPRS的平均业务速率可以达到20kbit/s-40kbit/s,CDMA1X的平均业务速率为80kbit/s-100kbit/s。这样的传输速度不足以应付大容量多媒体数据的传输,但对于普通业务数据的传输已经足够。

二、加密算法的选择

目前主流手机的CPU频率普遍在50至120MHz,少部分智能手机的主频达到200MHz以上,内存容量在2M至10M,其运算能力还无法与计算机相提并论。因此选用的加密算法必须具备高效率、高安全性的特点。

IDEA数据加密算法是由中国学者来学嘉博士和著名的密码专家JamesL.Massey于1990年联合提出的,它的明文和密文都是64比特,但密钥长为128比特。IDEA是作为迭代的分组密码实现的,使用128位的密钥和8个循环,这比DES提供了更多的安全性,但是在选择用于IDEA的密钥时,应该排除那些称为“弱密钥”的密钥。DES加密算法只有四个弱密钥和12个次弱密钥,而IDEA中的弱密钥数相当可观,有2的51次方个。但是,如果密钥的总数非常大,达到2的128次方个,那么仍有2的77次方个密钥可供选择。IDEA加密算法被认为是极为安全的。使用128位的密钥,蛮力攻击中需要进行的测试次数与DES相比会明显增大,甚至允许对弱密钥测试。而且,它本身也显示了它尤其能抵抗专业形式的分析性攻击。

Java是Sun公司开发的一种面向对象的编程语言,Java在手机上的开发版本称为J2ME(Java2MicroEdition)。由于Java语言使用虚拟机技术实现了平台无关性,使用J2ME开发的应用软件可以运行在数量众多的手机之上。

综合上述的分析,IDEA加密算法的特性符合移动商务数据加密的要求,而使用Java语言实现的该加密算法可以最广泛的适用于各种型号的手机,因此在此选用Java语言作为IDEA加密算法的实现工具。

三、IDEA加密算法的程序实现

注:Flag为加解密标记,flag为true表示加密,flag为flase表示解密。

publicbyte[]ideaEncrypt(byte[]bytekey,byte[]inputBytes,booleanflag)

{

byte[]encryptCode=newbyte[8];

int[]key=get_subkey(flag,bytekey);

encrypt(key,inputBytes,encryptCode);

returnencryptCode;

}
privatevoidencrypt(int[]key,byte[]inbytes,byte[]outbytes)

{

intk=0;

inta=bytesToInt(inbytes,0);

intb=bytesToInt(inbytes,2);

intc=bytesToInt(inbytes,4);

intd=bytesToInt(inbytes,6);

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

{

a=x_multiply_y(a,key[k++]);

b+=key[k++];

b&=0xffff;

c+=key[k++];

c&=0xffff;

d=x_multiply_y(d,key[k++]);

inttmp1=b;

inttmp2=c;

c^=a;

b^=d;

c=x_multiply_y(c,key[k++]);

b+=c;

b&=0xffff;

b=x_multiply_y(b,key[k++]);

c+=b;

c&=0xffff;

a^=b;

d^=c;

b^=tmp2;

c^=tmp1;

}

intToBytes(x_multiply_y(a,key[k++]),outbytes,0);

intToBytes(c+key[k++],outbytes,2);

intToBytes(b+key[k++],outbytes,4);

intToBytes(x_multiply_y(d,key[k]),outbytes,6);

}

privateint[]get_subkey(booleanflag,byte[]bytekey)

{

if(flag)

{

returnencrypt_subkey(bytekey);

}

else

{

returnuncrypt_subkey(encrypt_subkey(bytekey));

}

}

privateint[]encrypt_subkey(byte[]byteKey)

{

int[]key=newint[52];

if(byteKey.length<16)

{

byte[]tmpkey=newbyte[16];

System.arraycopy(byteKey,0,tmpkey,tmpkey.length-byteKey.length,byteKey.length);

byteKey=tmpkey;

}

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

{

key[i]=bytesToInt(byteKey,i*2);

}

for(intj=8;j<52;j++)

{

if((j&0x7)<6)

{

key[j]=(((key[j-7]&0x7f)<<9)|(key[j-6]>>7))&0xffff;

}

elseif((j&0x7)==6)

{

key[j]=(((key[j-7]&0x7f)<<9)|(key[j-14]>>7))&0xffff;

}

else

{

key[j]=(((key[j-15]&0x7f)<<9)|(key[j-14]>>7))&0xffff;

}

}

returnkey;

}

privateint[]uncrypt_subkey(int[]key)

{

intdec=52;

intasc=0;

int[]unkey=newint[52];

intaa=fun_a(key[asc++]);

intbb=fun_b(key[asc++]);

intcc=fun_b(key[asc++]);

intdd=fun_a(key[asc++]);

unkey[--dec]=dd;unkey[--dec]=cc;

unkey[--dec]=bb;unkey[--dec]=aa;

for(intk1=1;k1<8;k1++)

{

aa=key[asc++];

bb=key[asc++];

unkey[--dec]=bb;

unkey[--dec]=aa;

aa=fun_a(key[asc++]);

bb=fun_b(key[asc++]);

cc=fun_b(key[asc++]);

dd=fun_a(key[asc++]);

unkey[--dec]=dd;

unkey[--dec]=bb;

unkey[--dec]=cc;

unkey[--dec]=aa;

}

aa=key[asc++];

bb=key[asc++];

unkey[--dec]=bb;

unkey[--dec]=aa;

aa=fun_a(key[asc++]);

bb=fun_b(key[asc++]);

cc=fun_b(key[asc++]);

dd=fun_a(key[asc]);

unkey[--dec]=dd;

unkey[--dec]=cc;

unkey[--dec]=bb;

unkey[--dec]=aa;

returnunkey;

}

IDEA加密算法以其高效安全的特性适用于移动商务的数据传输文件加密。在实际应用中,将明文数据转换成字节流,经IDEA加密算法加密后通过socket(套接字)传输,可以获得数据在传输安全性和传输稳定性上的双重保障。

小知识之socket

socket的英文原义是“孔”或“插座”。作为4BDS UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,象一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。