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