网络编程及安全

实验目的与要求

1.掌握Java网络编程的方法

2.掌握Java安全编程的方法

3.实现TCP加解密

实验内容与步骤

1    编写网络通信程序(基于TCP)

2    对通信内容使用对称加密算法进行加密

3    使用非对称算法分发对称加密中使用的密钥

客户端:

import java.net.*;

import java.security.*;

import javax.crypto.*;

import java.io.*;

public class ComputeTCPClient {

public static void main(String srgs[]) {

try {

//创建连接特定服务器的指定端口的Socket对象

Socket socket = new Socket("0.0.0.0", 4421);

//获得从服务器端来的网络输入流

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

//获得从客户端向服务器端输出数据的网络输出流

PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);

FileReader f1=new FileReader("e:/muhw.txt");

BufferedReader stdin=new BufferedReader(f1);

String str=stdin.readLine();

String s=new String(str);

FileInputStream f=new FileInputStream("key1.dat");

ObjectInputStream b=new ObjectInputStream(f);

Key k=(Key)b.readObject( );

Cipher cp=Cipher.getInstance("DESede");

cp.init(Cipher.ENCRYPT_MODE, k);

byte ptext[]=s.getBytes("UTF8");

byte ctext[]=cp.doFinal(ptext);

FileOutputStream f2=new FileOutputStream("SEnc.dat");

f2.write(ctext);

FileReader f3=new FileReader("SEnc.dat");

BufferedReader stdin3=new BufferedReader(f3);

String str3=stdin3.readLine();

out.println(str3);  //通过网络传送密文到服务器

String str1=in.readLine();//从网络输入流读取结果

System.out.println( "服务器接收到的结果为:"+str1); //输出服务器返回的结果

}

catch (Exception e) {

System.out.println(e);

}

finally{

//stdin.close();

//in.close();

//out.close();

//socket.close();

}

}

}

服务器:

import java.net.*;

import java.security.*;

import javax.crypto.*;

import java.io.*;

public class ComputeTCPClient {

public static void main(String srgs[]) {

try {

//创建连接特定服务器的指定端口的Socket对象

Socket socket = new Socket("0.0.0.0", 4421);

//获得从服务器端来的网络输入流

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

//获得从客户端向服务器端输出数据的网络输出流

PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);

FileReader f1=new FileReader("e:/muhw.txt");

BufferedReader stdin=new BufferedReader(f1);

String str=stdin.readLine();

String s=new String(str);

FileInputStream f=new FileInputStream("key1.dat");

ObjectInputStream b=new ObjectInputStream(f);

Key k=(Key)b.readObject( );

Cipher cp=Cipher.getInstance("DESede");

cp.init(Cipher.ENCRYPT_MODE, k);

byte ptext[]=s.getBytes("UTF8");

byte ctext[]=cp.doFinal(ptext);

FileOutputStream f2=new FileOutputStream("SEnc.dat");

f2.write(ctext);

FileReader f3=new FileReader("SEnc.dat");

BufferedReader stdin3=new BufferedReader(f3);

String str3=stdin3.readLine();

out.println(str3);  //通过网络传送密文到服务器

String str1=in.readLine();//从网络输入流读取结果

System.out.println( "服务器接收到的结果为:"+str1); //输出服务器返回的结果

}

catch (Exception e) {

System.out.println(e);

}

finally{

//stdin.close();

//in.close();

//out.close();

//socket.close();

}

}

}

DES加密:

import java.io.*;

import java.security.*;

import javax.crypto.*;

public class SEnc{

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

String s="Hello world!";//需加密的明文

FileInputStream f=new FileInputStream("key1.dat");

ObjectInputStream b=new ObjectInputStream(f);

Key k=(Key)b.readObject( );

Cipher cp=Cipher.getInstance("DESede");

cp.init(Cipher.ENCRYPT_MODE, k);

byte ptext[]=s.getBytes("UTF8");

for(int i=0;i<ptext.length;i++){

System.out.print(ptext[i]+",");

}

System.out.println("");

byte ctext[]=cp.doFinal(ptext);

for(int i=0;i<ctext.length;i++){

System.out.print(ctext[i] +",");

}

FileOutputStream f2=new FileOutputStream("SEnc.dat");

f2.write(ctext);

}

}

密钥加密:

import java.security.*;

import java.security.spec.*;

import javax.crypto.*;

import javax.crypto.spec.*;

import javax.crypto.interfaces.*;

import java.security.interfaces.*;

import java.math.*;

import java.io.*;

public class Enc_RSA{

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

FileInputStream  f1=new FileInputStream("keykb1.dat");

int num2=f1.available();

byte[ ] keykb=new byte[num2];

f1.read(keykb);

FileInputStream f=new FileInputStream("Skey_RSA_pub.dat");

ObjectInputStream b=new ObjectInputStream(f);

RSAPublicKey  pbk=(RSAPublicKey)b.readObject( );

BigInteger e=pbk.getPublicExponent();

BigInteger n=pbk.getModulus();

System.out.println("e= "+e);

System.out.println("n= "+n);

//byte ptext[]=s.getBytes("UTF8");

BigInteger m=new BigInteger(keykb);

BigInteger c=m.modPow(e,n);

System.out.println("c= "+c);

String cs=c.toString( );

BufferedWriter out=

new BufferedWriter(new OutputStreamWriter(

new FileOutputStream("Enc_RSA.dat")));

out.write(cs,0,cs.length( ));

out.close( );

}

}

客户端将密文和加密密钥传给服务器端

密钥解密:

import java.security.*;

import java.security.spec.*;

import javax.crypto.*;

import javax.crypto.spec.*;

import javax.crypto.interfaces.*;

import java.security.interfaces.*;

import java.math.*;

import java.io.*;

public class Dec_RSA{

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

BufferedReader in=

new BufferedReader(new InputStreamReader(new FileInputStream("Enc_RSA.dat")));

String ctext=in.readLine();

BigInteger c=new BigInteger(ctext);

FileInputStream f=new FileInputStream("Skey_RSA_priv.dat");

ObjectInputStream b=new ObjectInputStream(f);

RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );

BigInteger d=prk.getPrivateExponent();

BigInteger n=prk.getModulus();

System.out.println("d= "+d);

System.out.println("n= "+n);

BigInteger m=c.modPow(d,n);

System.out.println("m= "+m);

byte[] mt=m.toByteArray();

FileOutputStream f2=new FileOutputStream("keyb.dat");

f2.write(mt);

}

}

密文解密:

import java.io.*;

import java.security.*;

import javax.crypto.*;

import javax.crypto.spec.*;

public class SDec{

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

FileInputStream f=new FileInputStream("SEnc.dat");

int num=f.available();

byte[ ] ctext=new byte[num];

f.read(ctext);

//FileInputStream  f2=new FileInputStream("keya.dat");

FileInputStream  f2=new FileInputStream("keyb.dat");

int num2=f2.available();

byte[ ] keykb=new byte[num2];

f2.read(keykb);

SecretKeySpec k=new  SecretKeySpec(keykb,"DESede");

Cipher cp=Cipher.getInstance("DESede");

cp.init(Cipher.DECRYPT_MODE, k);

byte []ptext=cp.doFinal(ctext);

String p=new String(ptext,"UTF8");

System.out.println(p);

}

}

实验测试

服务器显示:

客户端显示:

时间: 2024-11-02 16:26:43

网络编程及安全的相关文章

C#网络编程技术FastSocket实战项目演练

一.FastSocket课程介绍 .NET框架虽然微软提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包.组包.粘包.维护连接列表等,UDP协议需要处理丢包.乱序,而且对于多连接并发,还要自己处理多线程等等.本期分享课程阿笨给大家带来的是来源于github开源Socket通信中间件:FastSocket,目的就是把大家从繁琐的网络编程技术中彻底地解放和释放出来. 阿笨只想安安静静的学习下网络编程技术Socket后,将学习的成果直接灵活的运用到自己的实际项目中去.

网络编程 -- RPC实现原理 -- RPC -- 迭代版本V1 -- 本地方法调用

网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2--RPC -- 本地方法调用:不通过网络 入门 1. RPCObjectProxy rpcObjectProxy = new RPCObjectProxy(new LocalRPCClient()); : 绑定目标对象 2. IUserService userService = (IUserService) rpcObjectProxy.create(IUserService.class); :返回代理类 3. List<User> u

C#网络程序设计(1)网络编程常识与C#常用特性

    网络程序设计能够帮我们了解联网应用的底层通信原理!     (1)网络编程常识: 1)什么是网络编程 只有主要实现进程(线程)相互通信和基本的网络应用原理性(协议)功能的程序,才能算是真正的网络编程. 2)网络编程的层次 现实中的互联网是按照"TCP/IP分层协议栈"的体系结构构建的,因此程序员必须搞清楚自己要做的是哪个层次上的编程工作. TCP/IP协议体系的实现情况: 其中,网络接口层已经被大多数计算机生产厂家集成在了主板上,也就是经常所说的网卡(NIC).windows操

9. 网络编程:

网络编程: 端口: 物理端口: 逻辑端口:用于标识进程的逻辑地址,不同进程的标识:有效端口:0~65535,其中0~1024系统使用或保留端口. java 中ip对象:InetAddress. import java.net.*; class  IPDemo{ public static void main(String[] args) throws UnknownHostException{ //通过名称(ip字符串or主机名)来获取一个ip对象. InetAddress ip = InetA

物联网网络编程、Web编程综述

本文是基于嵌入式物联网研发工程师的视觉对网络编程和web编程进行阐述.对于专注J2EE后端服务开发的童鞋们来说,这篇文章可能稍显简单.但是网络编程和web编程对于绝大部分嵌入式物联网工程师来说是一块真空领域. 的确,物联网研发应该以团队协作分工的方式进行,所以有嵌入式设备端.网关.web前端.APP.后端开发等专属岗位.作为系统架构师,自然需要掌握各种岗位的关键技术.作为嵌入式工程师,掌握网络编程.web编程,能够极大地拓展自己的视野和架构思维,能够主动地对系统的各种协议和应用场景提出优化的见解

linux网络编程-(socket套接字编程UDP传输)

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

UNIX网络编程卷1 回射客户程序 TCP客户程序设计范式

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 下面我会介绍同一个使用 TCP 协议的客户端程序的几个不同版本,分别是停等版本.select 加阻塞式 I/O 版本. 非阻塞式 I/O 版本.fork 版本.线程化版本.它们都由同一个 main 函数调用来实现同一个功能,即回射程序客户端. 它从标准输入读入一行文本,写到服务器上,读取服务器对该行的回射,并把回射行写到标准输出上. 其中,非阻塞式 I/O 版本是所有版本中执行速度最快的,

黑马程序员——网络编程篇

------- android培训.java培训.期待与您交流! ---------- 概述   1.网络模型        (1).OSI参考模型        (2).TCP/IP参考模型   2.网络通讯要素         (1).IP地址        (2).端口号         (3).传输协议    3.过程        1,找到对方IP. 2,数据要发送到对方指定的应用程序上.为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识. 为了方便称呼这个数据,叫做端口(逻

网络编程TCP/IP实现客户端与客户端聊天

一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成.IP层负责网络主机的定位,数据传输的路由,由IP地址可以唯一的确定Internet上的一台主机.TCP层负责面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象. 二.TCP与UDP TCP是一种面向连接的保证可靠传输的协议

(一)理解网络编程和套接字

学习<TCP/IP网络编程> 韩 尹圣雨 著 金国哲 译 套接字类似电话 一.服务器端套接字(listening套接字)---接电话套接字 ①调用socket函数---安装电话机 #include <sys/socket.h> int socket(int domain, int type, int protocol); //成功时返回文件描述符,失败时返回-1 ②调用bind函数---分配电话号码 #include <sys/socket.h> int bind(in