第17卷 第5期2002年10月内蒙古民族大学学报(自然科学版)Journal of I nner M ongolia U niv ersity for N ationalitiesVol.17 No.5Oct.2002利用Java程序实现加密解密问题y王国忱1,赵 芳1,李亚娟2(1 内蒙古民族大学理工学院,内蒙古通辽 028043;2 内蒙古通辽市通顺铝厂,内蒙古通辽 028000)摘 要:主要介绍了一种用Java语言设计加密解密的方法.关键词:Java;加密;解密中图分类号:JP312JA 文献标识码:A 文章编号:1671 0185(2002)05-0410-03Realize Encryption and Unencryption in Use of Java ProgramWANG Guo-chen1,ZH AO Fang1,LI Ya-juan2(1 College o f Science and Eng ineering,Inner M ong olia U niversity for N ationalities,T ongliao028043,China;2 T ong liao T ong shun A luminium F actory o f Inner M ongo lia,T ongliao028000,China)Abstract:Mainly describe a solution of encryption and unencry ption in use of Java.Key words:Jave;Encryption;U nencryptionJava程序是建立在一系列的类之上,这些类刻画了程序所要处理的基本数据类型的行为.通过向这些类的对象发送信息,从而使这些对象进行相应的操作,这样就构成了Jav a程序.已知一个文本加密解密问题,它遵循如下规则:(1)把明文中的所有字符倒过来,比如Glag to meet you!!变成!uoy teem ot galG!.(2)要求用户提供一个密钥(为一个正整数),设为key.设明文中字符的A SCII码值为x,把x和key相加,再通过一个可逆变换,映射成一个可打印的密文字符,设该字符的ASCII码值为y.因为ASCI I编码表中,0x00~0x1F(0~31)的字符为设备控制字符,所以在变换过程中必须加以避免.映射方法分析如下:设n=(32+key)%128,则可以分成如下规程情况:第一种情况: n<32,则if(x+key)%128<32 y=96+(x+key)%128;else y=(x+key)%128;第二种情况: n>32,则if((x+key)%128<n) y=32+(x+key)%128;else y=(x+key)%128;通过此方法就可以获得打印字符,并且保证是个可逆变换.当然也可以采用其它方法.(3)忽略明文中不可打印字符只要求程序从键盘接收需要加密的明文或者需要解密的密文;然后显示加密后的密文或者解密后的明文.下面讨论如何用面向对象的方法来解决这个问题.首先来确定需要什么类,再为每个类提供操作全集,最后利用继承机制抽取出类之间的共性.在这个问题中,可以看到核心的数据结构有两个,一个为字符串,另一个为字符.在字符串上有两种操作集合,一种是用来加密的集合操作,另一种为用来解密的操作集合,前者可以构成一个加密类Encode.后者可以构成一个解密类Deco de.核心数据结构的另一个为字符,在它之上的操作就是用来进行加密解密函数.只需改写该类的方法即可.因此这个程序需要三个类,它们的属性和操作命令分别为:Encode类y收稿日期:2002-01-06作者简介:王国忱(1975-),男,助教.变量:待处理字符串sS,结果字符串sd,密钥nKey ,用来加密解密的函数对象cd.方法:构造函数Encode(string sStr,int nKey);进行字符串转化的方法Convert();进行字符变换的方法Chang ();获得待处理字符串sS 的方法Getss();获得结果字符串sd 的方法G etss().Decode 类变量:待处理字符串sS,结果字符串sd,密钥sKey,用来加密解密的函数对象cd.方法:构造函数Decode(string sStr ,Int nKey);进行字符串转化的方法Conv er t();进行字符变换的方法Change();获得待处理字符串sS 的方法Getss();获得结果字符串sd 的方法G etsd().Code 类变量:密钥N key ,用于判断加密函数类型的辅助变量n.方法:造函数Code(int nKey);加密函数方法En();解密函数方法De().从这三个类中可以发现:Encode 类和Decode 类几乎相同,它们唯一的区别只是进行字符变换的方法Change()不同,因此从中可以抽取一个类T Code(文本编码基类)作为它们的父类,然后通过继承和重载的方法来获得Encode 和Deco de.整个程序的对象模型如图1所示.图1 程序的对象模型Figure 1 The model of programT ex tCode.java import java.io.*;import javautil.*;public class T ex tCo de{public static void main(string args ∀#){str ing sStr =new String(),sKey,sCmd= !; int nKey=0; char cCmd=∃%;T code tcd=new T code(); try{Input Stream Reader ir =new I nput Stream R eader (System.in);L ine N umber Reader InReader =new L ine N umber R eader(ir);System,out,println( please input the string !);sStr =inR rader.read:Line();System.out.println ( please input the scr yp to gr aphic key:!);sKey=inReader.r eadL ine();NK ey =integer.parselnt(sK ey);System.out.pr intln ( please input the command:(e or d)!);SCmd=inReadr.r eadL ine();CCmd=scmd.charA t(0);}catch(IOException e){system.out.println( Error l !);system.exit(0);}if(cCmd==∃e %){tcd=new Decode(sStr.nK ey);}else if (cCmd==∃d %){tcd=new Decode(sStr.nK ey);}else{System.out.println ( A wr ong command!!);System.ex it(0);}tcd.convert();sStr =tcd.getsD();Syst em.out.println(sStr);}}class T code {string sS,sD;int nKey=0Code cd;T code(){sS= !;nKey=0;cd=new Code(0);}T code(string sStr,int nKey){sS=sStr;411第5期 王国忱等:利用Java 程序实现加密解密问题t his.nKey=nKey;cd=new Code(nKey);}v oid conv ert(){int i,leng=sS.length();char ch,ych;char csD ∀#=new char ∀leng #;character cCh=new Char acter(∃%);stack stck=new Stack();O bject temp=new Object();F or(I=0;I<leng;I++){ch=sS.char At(I);ych=change(ch);cCh=new Character(ych);t emp=stck.push(cCh);}for(I=0;I <leng ,I++){try{cCh=(character)stck.pop();}catch(empty.stack.exception e){System.out.pr intln( the stack is empty!!);}csd ∀I #=cCh.char Value();}sd=new string(csD);}char chang e(char cs){return cs;}string getsD(){return sS;}string getsD(){return sD;}class Encode ex tends T Code {Encode(str ing sStr,int nKey){super(sStr,nK ey);}char chang e(char cs){return cd.en(cs);}}class Decode extends T code {Decode(string sStr.int nK ey ){super(sStr,nK ey);}char chang e(char cs){return cd.de(cs);}}class Decode ex tends T Code {Decode(string sStr.int nKey){super (sStr,nK ey );}char change(char cs){return cd.de(cs);}}class Code &用来加密/解密的函数对象&{int nK ey ,n;Code(int nKey) {this.nKey =nK ey ; n=32+nkey; n=n%128; }char en(char x) {int y; char ych; y =x+nKey; y =y%128; if(n<32){if(y <32)y=y +96;} else{if(y <n)y=y+32;} y ch=(char )y; r eturn ych; }char de(char y oh) {int y=ych; char xch; if(n<32){if(y >(n+96))y=y-96;} else{if(y <n)y=y-32;} y =y-nKey; y =y%128;if(y<0) y =y+128; x ch=(char)y ; r eturn x ch;}}程序执行环境:Jav e2SDK I 3 I 下编译运行.参 考 文 献∀1# 杨有安.Java 语言程序设计∀M #.北京:电子工业出版社,2002.∀2# 清宏计算机工作室编著.Java 编程起步∀M #.北京:机械工业出版社,2002.∀责任编辑 郑 瑛#412内 蒙 古 民 族 大 学 学 报 2002年。