APP下载

基于Java点对点通信技术的DES密钥交换

2012-04-29汪志达

计算机时代 2012年11期

汪志达

摘要: 介绍了使用Java的点对点通信技术,基于Diffie-Hellman规则,给出了IBM DES密钥交换的总体方案、算法和应用程序,详细说明了其中涉及的主要技术和方法,同时给出了在PC机上用二进制指数分解法实现大数模运算的算法分析和实现方案。

关键词: 密钥交换; Java; DES; Diffie-Hellman

中图分类号:TP301.6;311.11文献标志码:A 文章编号:1006-8228(2012)11-23-03

Interchange of DES cipher key based on Java p2p communication technology

Wang Zhida

(Ningbo Polytechnic, Ningbo, Zhejiang 315800, China)

Abstract: The scheme, module, and application program of IBM DES cipher key interchange by Diffie-Hellman rules based on Java P2P communication technology are introduced. The related techniques and methods in detail are explained. The module analysis and the implementation scheme of calculating large figure modulus on PC with binary index decomposing method are given.

Key words: cipher key interchange; Java; DES; Diffie-Hellman

0 引言

在IBM DES加密传输应用中,如果是首次通信或密钥已过期,则需要进行Diffie-Hellman密钥交换[6]。本文使用Java的点对点通信技术和二进制指数分解法[1]设计Diffie-Hellman密钥交换应用程序,如图1、图2所示。

图1密钥交换服务端

图2密钥交换客户端

密钥交换双方运行各自的程序,一方以客户机方式连接另一方(服务端),设定任意的初始值(Diffie-Hellman运算指数),系统计算并交换密钥种子,生成初始密钥,经DES系数和DES模数处理后得到DES密钥。

1 算法

1.1 算法概要

密钥交换过程如图3所示。

[设定

初始值m][密钥

k=f2(N,m)][

密钥

交换

程序

][公共通信网络] [

密钥

交换

程序

][密钥种子

M=f1(m)][接收N][设定

初始值n][密钥

k'=f2(M,n)][密钥种子

N=f1(n)][接收M]

图3密钥交换过程

程序预设两个Diffie-Hellman运算基数p和q(大于80位二进制),程序运行时,交换双方分别设定运算指数m/n(大于20位二进制),程序用Diffie-Hellman算法[5]计算密钥种子:

M=pm mod q

N=pn mod q

程序交换M/N后,计算密钥:

k=Nm mod q

k'=Mn mod q

根据模运算的性质:

(pn mod q)m mod q=pnm mod q=pmn mod q=(pm mod q)n mod q

所以:

k=k'

1.2 算法设计

由于pm、pn以及Nm、Mn这样的大数,已远远超出了现有计算机处理数据的范围,本文用二进制指数分解法进行计算,概括如下(设要计算PD mod Q):

将D转换成二进制数B(设为bnbn-1…b1b0),各位从右到左依次存入bi(i=0,1,2,...,n,bi=0或1),得到D的分解式:

bn×2n+bn-1×2n-1+......+b1×21+b0×20

式中各项从右到左依次存入di(i=0,1,2,...,n),得到PD的分解式:

按照模运算的规律,若数列(x=0,1,2,...,n)中大于Q的最小元素是(0≤t≤n),且 mod Q=T,则:

mod Q

等价于

mod Q

在程序中可使用循环,逐步减小PD分解式中指数较大的项,同时,利用模运算的如下性质[3]:

(X*Y*Z) mod Q=(((X*Y) mod Q)*Z) mod Q

得到算式PD mod Q中PD的可计算等价数(设为A),然后计算A mod Q的结果。

1.3 算法实现

按照上述算法,用Java实现如下:

import java.io.*;

public class clfm

{public static void main(String args[]) throws Exception

{long p=2000000001,d=9223372036854775807L,

q=2147483647,t,result,temp;

int i,j,k,n;

long data[][]=new long[200][2];

System.out.println("");

/*多项式转换*/

i=1; j=0;

do

{t=d%2*i;

if(t!=0) /*data[j][0]存底数,data[j][1]存指数*/

{data[j][0]=p; data[j][1]=t; j++;

}

i=i*2; d=d/2;

} while(d!=0); j--;

/*多项式化简*/

result=1;

temp=p; /*data[j][0]存底数,data[j][1]存指数*/

while(true)

{i=1;

while((((long)i)<=data[j][1])&&(userPow(temp,i)

i=i*2;

if(((long)i)>data[j][1])

break; /*在数列p2i中找大于q的最小元素*/

else

{for(n=0;data[n][0]!=temp;n++);

for(;data[n][1]<((long)i);n++);

temp=userPow(temp,i)%q;

for(k=n; k<=j; k++) /*将本次化简的结果依次存入二维

数组中*/

{data[k][0]=temp; data[k][1]=data[k][1]/i;

}

}

}

for(i=1;i<=j;i++) /*变累乘后模除q为每乘一次就模除q*/

{data[i][0]=(data[i-1][0]*data[i][0])%q;

}

result=data[j][0];

System.out.println(String.valueOf(result));

}

/*自定义幂运算函数*/

public static long userPow(long uPtemp,long uPi)

{long uPresult=1;

for(int uPk=1; uPk<=uPi; uPk++)

uPresult*=uPtemp;

return uPresult;

}

}

2 应用程序设计

程序组成结构如图4所示。

2.1 服务端/客户端程序设计

分别设计服务端和客户端程序,使用Java的点对点通信技术[4]实现密钥交换。程序运行后,服务器在指定端口捕捉客户机的连接请求,客户机连接到服务器后双方建立Socket类型的连接通道。双方各自设定Diffie-Hellman运算指数,发送密钥种子,程序利用Socket通道的即时特性,实时接收对方的密钥种子。在检测到已发送了本方的密钥种子和接收了对方的密钥种子后,程序自动计算密钥。设计要点如下:

⑴ 服务端程序在指定端口(本文使用4000端口)建立ServerSocket连接服务,捕捉客户端的Socket连接请求,建立点对点的连接通道,创建基于通道的输入输出流;接收客户端的密钥种子;根据设定的Diffie-Hellman运算指数计算本地密钥种子,通过输出流发送;最后根据客户端的密钥种子和运算指数计算密钥。

⑵ 客户端程序在指定端口请求服务端的Socket连接,建立点对点的连接通道,创建基于通道的输入输出流;接收服务端的密钥种子;根据设定的Diffie-Hellman运算指数计算本地密钥种子,通过输出流发送;最后根据服务端的密钥种子和运算指数计算密钥。

[项目\&名称\&KeyInterchange(服务端)

KeyInterchange2(客户端)\&][主类\&名称\&KIserver(服务端)

KIclient(客户端)\&功能\&含有作为程序入口的

main方法;

创建用户窗体类的对象。\&][用户窗体类\&名称\&MyFrame\&功能\&设计有jbInit等方法;

界面设计;

网络连接;

密钥交换等。\&][用户自定义类模块\&名称\&ClfmClass\&功能\&提供clfm方法;

采用二进制指数分解法进行大数模运算。\&]

图4程序组成结构

2.2 模块化算法程序

将算法程序制作成方法:

long clfm(long, long, long)

定义在类模块ClfmClass中,如下:

import java.io.*;

public class ClfmClass {

public static long clfm(long p,long d,long q) throws Exception

{long t,result,temp;

int i,j,k,n;

long data[][]=new long[200][2];

(……)

return result;

}

public static long userPow(long uPtemp,long uPi)

{

(……)

}

}

3 结束语

本文通过程序实现了点对点密钥交换,该软件在Internet/Intranet及单机上测试成功,运算时间不超过1秒。软件运行环境为P4/2G、512M、Windows2000/XP。为便于验证,设定Diffie-Hellman运算基数p=50000001、q=70000001,DES系数r=1,DES模数u=1000000,而在实际应用中应根据需要按规定位数设定。由于本设计使用的是32位系统,只能直接生成最大32位密钥,用DES系数和DES模数处理后,得到56位密钥。目前64位系统已渐趋普及,升级到64位系统后,能直接生成最大64位密钥。也可将本文的算法及程序整合应用到其他采用非公开密钥的各种比特加密系统中[2],使加密传输更加方便、可靠。

参考文献:

[1] [美]William A. Shay著,高传善译.数据通信与网络教程[M].机械工业

出版社,2000.

[2] 胡建伟.网络安全与保密[M].西安电子科技大学出版社,2003.

[3] 裴礼文.数学分析中的典型问题与方法[M].高等教育出版社,2001.

[4] 王萌.Java程序设计[M].冶金工业出版社,2004.

[5] Stinson D. Cryptograph: Theory and Practice[M].Boca Raton, FL:

CRC Press,1995.

[6] Stallings W. Network and Internet Security[M].Englewood Cliffs,

NJ:Prentice-Hall,1995.