汪志達(dá)
摘要: 介紹了使用Java的點(diǎn)對(duì)點(diǎn)通信技術(shù),基于Diffie-Hellman規(guī)則,給出了IBM DES密鑰交換的總體方案、算法和應(yīng)用程序,詳細(xì)說明了其中涉及的主要技術(shù)和方法,同時(shí)給出了在PC機(jī)上用二進(jìn)制指數(shù)分解法實(shí)現(xiàn)大數(shù)模運(yùn)算的算法分析和實(shí)現(xiàn)方案。
關(guān)鍵詞: 密鑰交換; Java; DES; Diffie-Hellman
中圖分類號(hào):TP301.6;311.11文獻(xiàn)標(biāo)志碼:A 文章編號(hào):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加密傳輸應(yīng)用中,如果是首次通信或密鑰已過期,則需要進(jìn)行Diffie-Hellman密鑰交換[6]。本文使用Java的點(diǎn)對(duì)點(diǎn)通信技術(shù)和二進(jìn)制指數(shù)分解法[1]設(shè)計(jì)Diffie-Hellman密鑰交換應(yīng)用程序,如圖1、圖2所示。
圖1密鑰交換服務(wù)端
圖2密鑰交換客戶端
密鑰交換雙方運(yùn)行各自的程序,一方以客戶機(jī)方式連接另一方(服務(wù)端),設(shè)定任意的初始值(Diffie-Hellman運(yùn)算指數(shù)),系統(tǒng)計(jì)算并交換密鑰種子,生成初始密鑰,經(jīng)DES系數(shù)和DES模數(shù)處理后得到DES密鑰。
1 算法
1.1 算法概要
密鑰交換過程如圖3所示。
[設(shè)定
初始值m][密鑰
k=f2(N,m)][
密鑰
交換
程序
][公共通信網(wǎng)絡(luò)] [
密鑰
交換
程序
][密鑰種子
M=f1(m)][接收N][設(shè)定
初始值n][密鑰
k'=f2(M,n)][密鑰種子
N=f1(n)][接收M]
圖3密鑰交換過程
程序預(yù)設(shè)兩個(gè)Diffie-Hellman運(yùn)算基數(shù)p和q(大于80位二進(jìn)制),程序運(yùn)行時(shí),交換雙方分別設(shè)定運(yùn)算指數(shù)m/n(大于20位二進(jìn)制),程序用Diffie-Hellman算法[5]計(jì)算密鑰種子:
M=pm mod q
N=pn mod q
程序交換M/N后,計(jì)算密鑰:
k=Nm mod q
k'=Mn mod q
根據(jù)模運(yùn)算的性質(zhì):
(pn mod q)m mod q=pnm mod q=pmn mod q=(pm mod q)n mod q
所以:
k=k'
1.2 算法設(shè)計(jì)
由于pm、pn以及Nm、Mn這樣的大數(shù),已遠(yuǎn)遠(yuǎn)超出了現(xiàn)有計(jì)算機(jī)處理數(shù)據(jù)的范圍,本文用二進(jìn)制指數(shù)分解法進(jìn)行計(jì)算,概括如下(設(shè)要計(jì)算PD mod Q):
將D轉(zhuǎn)換成二進(jìn)制數(shù)B(設(shè)為bnbn-1…b1b0),各位從右到左依次存入bi(i=0,1,2,...,n,bi=0或1),得到D的分解式:
bn×2n+bn-1×2n-1+......+b1×21+b0×20
式中各項(xiàng)從右到左依次存入di(i=0,1,2,...,n),得到PD的分解式:
按照模運(yùn)算的規(guī)律,若數(shù)列(x=0,1,2,...,n)中大于Q的最小元素是(0≤t≤n),且 mod Q=T,則:
mod Q
等價(jià)于
mod Q
在程序中可使用循環(huán),逐步減小PD分解式中指數(shù)較大的項(xiàng),同時(shí),利用模運(yùn)算的如下性質(zhì)[3]:
(X*Y*Z) mod Q=(((X*Y) mod Q)*Z) mod Q
得到算式PD mod Q中PD的可計(jì)算等價(jià)數(shù)(設(shè)為A),然后計(jì)算A mod Q的結(jié)果。
1.3 算法實(shí)現(xiàn)
按照上述算法,用Java實(shí)現(xiàn)如下:
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("");
/*多項(xiàng)式轉(zhuǎn)換*/
i=1; j=0;
do
{t=d%2*i;
if(t!=0) /*data[j][0]存底數(shù),data[j][1]存指數(shù)*/
{data[j][0]=p; data[j][1]=t; j++;
}
i=i*2; d=d/2;
} while(d!=0); j--;
/*多項(xiàng)式化簡(jiǎn)*/
result=1;
temp=p; /*data[j][0]存底數(shù),data[j][1]存指數(shù)*/
while(true)
{i=1;
while((((long)i)<=data[j][1])&&(userPow(temp,i) i=i*2; if(((long)i)>data[j][1]) break; /*在數(shù)列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++) /*將本次化簡(jiǎn)的結(jié)果依次存入二維 數(shù)組中*/ {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)); } /*自定義冪運(yùn)算函數(shù)*/ public static long userPow(long uPtemp,long uPi) {long uPresult=1; for(int uPk=1; uPk<=uPi; uPk++) uPresult*=uPtemp; return uPresult; } } 2 應(yīng)用程序設(shè)計(jì) 程序組成結(jié)構(gòu)如圖4所示。 2.1 服務(wù)端/客戶端程序設(shè)計(jì) 分別設(shè)計(jì)服務(wù)端和客戶端程序,使用Java的點(diǎn)對(duì)點(diǎn)通信技術(shù)[4]實(shí)現(xiàn)密鑰交換。程序運(yùn)行后,服務(wù)器在指定端口捕捉客戶機(jī)的連接請(qǐng)求,客戶機(jī)連接到服務(wù)器后雙方建立Socket類型的連接通道。雙方各自設(shè)定Diffie-Hellman運(yùn)算指數(shù),發(fā)送密鑰種子,程序利用Socket通道的即時(shí)特性,實(shí)時(shí)接收對(duì)方的密鑰種子。在檢測(cè)到已發(fā)送了本方的密鑰種子和接收了對(duì)方的密鑰種子后,程序自動(dòng)計(jì)算密鑰。設(shè)計(jì)要點(diǎn)如下: ⑴ 服務(wù)端程序在指定端口(本文使用4000端口)建立ServerSocket連接服務(wù),捕捉客戶端的Socket連接請(qǐng)求,建立點(diǎn)對(duì)點(diǎn)的連接通道,創(chuàng)建基于通道的輸入輸出流;接收客戶端的密鑰種子;根據(jù)設(shè)定的Diffie-Hellman運(yùn)算指數(shù)計(jì)算本地密鑰種子,通過輸出流發(fā)送;最后根據(jù)客戶端的密鑰種子和運(yùn)算指數(shù)計(jì)算密鑰。 ⑵ 客戶端程序在指定端口請(qǐng)求服務(wù)端的Socket連接,建立點(diǎn)對(duì)點(diǎn)的連接通道,創(chuàng)建基于通道的輸入輸出流;接收服務(wù)端的密鑰種子;根據(jù)設(shè)定的Diffie-Hellman運(yùn)算指數(shù)計(jì)算本地密鑰種子,通過輸出流發(fā)送;最后根據(jù)服務(wù)端的密鑰種子和運(yùn)算指數(shù)計(jì)算密鑰。 [項(xiàng)目\&名稱\&KeyInterchange(服務(wù)端) KeyInterchange2(客戶端)\&][主類\&名稱\&KIserver(服務(wù)端) KIclient(客戶端)\&功能\&含有作為程序入口的 main方法; 創(chuàng)建用戶窗體類的對(duì)象。\&][用戶窗體類\&名稱\&MyFrame\&功能\&設(shè)計(jì)有jbInit等方法; 界面設(shè)計(jì); 網(wǎng)絡(luò)連接; 密鑰交換等。\&][用戶自定義類模塊\&名稱\&ClfmClass\&功能\&提供clfm方法; 采用二進(jìn)制指數(shù)分解法進(jìn)行大數(shù)模運(yùn)算。\&] 圖4程序組成結(jié)構(gòu) 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 結(jié)束語 本文通過程序?qū)崿F(xiàn)了點(diǎn)對(duì)點(diǎn)密鑰交換,該軟件在Internet/Intranet及單機(jī)上測(cè)試成功,運(yùn)算時(shí)間不超過1秒。軟件運(yùn)行環(huán)境為P4/2G、512M、Windows2000/XP。為便于驗(yàn)證,設(shè)定Diffie-Hellman運(yùn)算基數(shù)p=50000001、q=70000001,DES系數(shù)r=1,DES模數(shù)u=1000000,而在實(shí)際應(yīng)用中應(yīng)根據(jù)需要按規(guī)定位數(shù)設(shè)定。由于本設(shè)計(jì)使用的是32位系統(tǒng),只能直接生成最大32位密鑰,用DES系數(shù)和DES模數(shù)處理后,得到56位密鑰。目前64位系統(tǒng)已漸趨普及,升級(jí)到64位系統(tǒng)后,能直接生成最大64位密鑰。也可將本文的算法及程序整合應(yīng)用到其他采用非公開密鑰的各種比特加密系統(tǒng)中[2],使加密傳輸更加方便、可靠。 參考文獻(xiàn): [1] [美]William A. Shay著,高傳善譯.數(shù)據(jù)通信與網(wǎng)絡(luò)教程[M].機(jī)械工業(yè) 出版社,2000. [2] 胡建偉.網(wǎng)絡(luò)安全與保密[M].西安電子科技大學(xué)出版社,2003. [3] 裴禮文.數(shù)學(xué)分析中的典型問題與方法[M].高等教育出版社,2001. [4] 王萌.Java程序設(shè)計(jì)[M].冶金工業(yè)出版社,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.