网络安全实验代码Word格式文档下载.docx
《网络安全实验代码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《网络安全实验代码Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
*/
publicStringbyteArr2HexStr(byte[]arrB)throwsException{
intiLen=arrB.length;
//每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
StringBuffersb=newStringBuffer(iLen*2);
for(inti=0;
i<
iLen;
i++){
intintTmp=arrB[i];
//把负数转换为正数
while(intTmp<
0){
intTmp=intTmp+256;
}
//小于0F的数需要在前面补0
if(intTmp<
16){
sb.append("
0"
);
sb.append(Integer.toString(intTmp,16));
returnsb.toString();
*将表示16进制值的字符串转换为byte数组,和publicstaticStringbyteArr2HexStr(byte[]arrB)
*互为可逆的转换过程
*paramstrIn
*需要转换的字符串
*return转换后的byte数组
publicbyte[]hexStr2ByteArr(StringstrIn)throwsException{
byte[]arrB=strIn.getBytes();
//两个字符表示一个字节,所以字节数组长度是字符串长度除以2
byte[]arrOut=newbyte[iLen/2];
i=i+2){
StringstrTmp=newString(arrB,i,2);
arrOut[i/2]=(byte)Integer.parseInt(strTmp,16);
returnarrOut;
*默认构造方法,使用默认密钥
publicDESPlus()throwsException{
this(strDefaultKey);
*指定密钥构造方法
*paramstrKey
*指定的密钥
publicDESPlus(StringstrKey)throwsException{
Security.addProvider(newcom.sun.crypto.provider.SunJCE());
Keykey=getKey(strKey.getBytes());
encryptCipher=Cipher.getInstance("
DES"
encryptCipher.init(Cipher.ENCRYPT_MODE,key);
decryptCipher=Cipher.getInstance("
decryptCipher.init(Cipher.DECRYPT_MODE,key);
*加密字节数组
*需加密的字节数组
*return加密后的字节数组
publicbyte[]encrypt(byte[]arrB)throwsException{
returnencryptCipher.doFinal(arrB);
*加密字符串
*需加密的字符串
*return加密后的字符串
publicStringencrypt(StringstrIn)throwsException{
returnbyteArr2HexStr(encrypt(strIn.getBytes()));
*解密字节数组
*需解密的字节数组
*return解密后的字节数组
publicbyte[]decrypt(byte[]arrB)throwsException{
returndecryptCipher.doFinal(arrB);
*解密字符串
*需解密的字符串
*return解密后的字符串
publicStringdecrypt(StringstrIn)throwsException{
returnnewString(decrypt(hexStr2ByteArr(strIn)));
*从指定字符串生成密钥,密钥所需的字节数组长度为8位不足8位时后面补0,超出8位只取前8位
*paramarrBTmp
*构成该字符串的字节数组
*return生成的密钥
*throwsjava.lang.Exception
privateKeygetKey(byte[]arrBTmp)throwsException{
//创建一个空的8位字节数组(默认值为0)
byte[]arrB=newbyte[8];
//将原始字节数组转换为8位
arrBTmp.length&
&
arrB.length;
arrB[i]=arrBTmp[i];
//生成密钥
Keykey=newjavax.crypto.spec.SecretKeySpec(arrB,"
returnkey;
}
服务器程序:
publicclassChatServerJFrame_TCPextendsJFrameimplementsActionListener{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
privateDESPlusdes=null;
ServerSocketserSkt;
SocketscSkt;
DataInputStreamdin;
DataOutputStreamdout;
JTextAreamsg;
JTextFieldtxt_str_send;
JButtonsendBtn,exitBtn;
ChatServerJFrame_TCP(){
setTitle("
聊天室-服务器"
msg=newJTextArea(100,250);
msg.setBackground(Color.white);
msg.setEditable(false);
add(msg);
//存放双方聊天记录的文本区
JLabelsend_lbl=newJLabel("
请输入要发送的消息"
txt_str_send=newJTextField(20);
txt_str_send.addActionListener(this);
//发送内容文本框
sendBtn=newJButton("
发送"
sendBtn.addActionListener(this);
//发送按钮
exitBtn=newJButton("
退出"
exitBtn.addActionListener(this);
//退出按钮
JPaneljp=newJPanel();
jp.add(send_lbl);
jp.add(txt_str_send);
jp.add(sendBtn);
jp.add(exitBtn);
add(jp,BorderLayout.SOUTH);
setSize(500,400);
//setLocation(400,400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try{
serSkt=newServerSocket(6600);
//在6600端口监听
scSkt=serSkt.accept();
din=newDataInputStream(scSkt.getInputStream());
dout=newDataOutputStream(scSkt.getOutputStream());
//返回socket的数据输入流和输出流
}catch(IOExceptione){
e.printStackTrace();
}
}
publicvoidsendMessage()throwsException{//发送方法
StringstrToClient=txt_str_send.getText().trim();
//提取文本框输入内容
if(strToClient.equals("
"
)){//发送内容不能为空
JOptionPane.showMessageDialog(null,"
发送内容不能为空"
txt_str_send.requestFocus();
return;
}else{//将内容发送给客户机,同时显示在聊天记录文本区中
msg.setForeground(Color.red);
msg.append("
服务器说:
+strToClient+"
\n"
des=newDESPlus();
strToClient=des.encrypt(strToClient);
dout.writeUTF(strToClient);
txt_str_send.setText("
}
}catch(IOExceptionie1){
ie1.printStackTrace();
publicvoidreceiveMessage(){//接受信息方法
while(true){//可以不断地接收对方发送过来的消息
StringstrFromClient=din.readUTF();
System.out.println("
客户端发给服务器的密文:
+strFromClient);
/*try{
strFromClient=des.decrypt(strFromClient);
}catch(Exceptionex){
ex.printStackTrace();
}*/
客户端说:
+strFromClient+"
}catch(IOExceptionie2){
msg.append("
您的聊天客户已经离开了!
+"
}finally{
try{
din.close();
dout.close();
scSkt.close();
}catch(IOExceptionex){
ex.printStackTrace();
System.exit(0);
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==txt_str_send){
try{
sendMessage();
}catch(Exceptionex){
}elseif(e.getSource()==sendBtn){
}elseif(e.getSource()==exitBtn){
publicstaticvoidmain(String[]args){
ChatServerJFrame_TCPchatServer=newChatServerJFrame_TCP();
chatServer.receiveMessage();
//调用接收消息方法
}
客户端程序:
publicclassChatClientJFrame_TCPextendsJFrameimplementsActionListener{
Stringhost="
localhost"
intport=6600;
ChatClientJFrame_TCP(){
聊天室-客户端"
scSkt=newSocket(host,port);
//返回socket的数据输入流和输出流
publicvoidsendMessage(){//发送方法
//提取文本框输入内容
try{
des=newDESPlus();
strToClient=des.encrypt(strToClient);
}
System.out.println("
服务器发给客户端的密文:
strFromClient=des.decrypt(strFromClient);
}catch(Exceptionex){
ex.printStackTrace();
服务器选择结束和您的本次聊天!
sendMessage();
ChatClientJFrame_TCPchatServer=newChatClientJFrame_TCP();