`
dyyaries
  • 浏览: 80714 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

RSA加密Socket传输文件、签名(二)

    博客分类:
  • Java
阅读更多

服务器端采用多线程方式并行处理传输请求以提高效率。

因为我想用JavaServiceWrapper将 程序作为windows服务运行,所以main方法中需接收一些参数,比如端口、密钥文件位置、文件存放路径等。

1.从main方法接受配置参数

 

  1. for(String arg : args){  
  2.             String argName = arg.substring(0,arg.indexOf(":")).trim();  
  3.             String argValue = arg.substring(arg.indexOf(":")+1).trim();  
  4.             if(argName.equals("rsa_private")){  
  5.                 privateKey = argValue;  
  6.             }else if(argName.equals("rsa_public")){  
  7.                 publicKey = argValue;  
  8.             }else if(argName.equals("port")){  
  9.                 port = Integer.parseInt(argValue);  
  10.             }else if(argName.equals("file_dir")){  
  11.                 file_dir = argValue;  
  12.             }  
  13.         }  

 

 

 

2.初始化解密、签名类实例

 

  1. RSASecurityCoder coder = new RSASecurityCoder(privateKey);  
  2. RSASecuritySignature sign = new RSASecuritySignature(publicKey);  

 

 

 

3.建立服务器

 

  1. private static void runServer(String[] args){  
  2.         long start = System.currentTimeMillis();  
  3.         //获取配置参数   
  4.         for(String arg : args){  
  5.             String argName = arg.substring(0,arg.indexOf(":")).trim();  
  6.             String argValue = arg.substring(arg.indexOf(":")+1).trim();  
  7.             if(argName.equals("rsa_private")){  
  8.                 privateKey = argValue;  
  9.             }else if(argName.equals("rsa_public")){  
  10.                 publicKey = argValue;  
  11.             }else if(argName.equals("port")){  
  12.                 port = Integer.parseInt(argValue);  
  13.             }else if(argName.equals("file_dir")){  
  14.                 file_dir = argValue;  
  15.             }  
  16.         }  
  17.           
  18.         //配置    
  19.         coder = new RSASecurityCoder(privateKey);  
  20.         sign = new RSASecuritySignature(publicKey);  
  21.         //启动服务器   
  22.         System.out.println("服务器启动中...");  
  23.         try {  
  24.             ss = new ServerSocket(port);  
  25.             clientCount = 0;  
  26.         } catch (NumberFormatException e) {  
  27.             System.err.println("端口配置错误");  
  28.         } catch (IOException e) {  
  29.             System.err.println("服务器在端口"+port+"启动失败");  
  30.         }  
  31.           
  32.         //文件存放目录   
  33.         dir = new File(file_dir);  
  34.         if(!dir.exists()){  
  35.             dir.mkdir();  
  36.         }  
  37.         System.out.println("服务器已启动,端口: "+port);  
  38.         //计算启动时间   
  39.         long end = System.currentTimeMillis();  
  40.         System.out.println("共消耗 "+(end-start)+" ms.");  
  41.           
  42.         //接收数据   
  43.         while(true){  
  44.             try {  
  45.                 if(ss == null){  
  46.                     ss = new ServerSocket(port);   
  47.                     clientCount = 0;  
  48.                 }  
  49.                 Socket socket = ss.accept();  
  50.                 clientCount += 1;  
  51.                 System.out.println("有新的连接,当前总连接数:"+clientCount);  
  52.                 Thread th = new Thread(new ServerProcessor(socket));  
  53.                 th.start();  
  54.             } catch (IOException e) {  
  55.                 e.printStackTrace();  
  56.             }  
  57.         }  
  58.           
  59.     }  

 

 

 

 

3.建立线程类ServerProcessor处理每个文件

 

  1. static class ServerProcessor extends Thread{  
  2.         private Socket socket;  
  3.         private InputStream in;  
  4.         private String filename;  
  5.         private long totalBytes;  
  6.         private File file;  
  7.         private FileOutputStream fos;  
  8.         public ServerProcessor(Socket socket){  
  9.             this.socket = socket;  
  10.         }  
  11.         @Override  
  12.         public void run(){  
  13.             try {  
  14.                 in = socket.getInputStream();  
  15.                 DataInputStream dis = new DataInputStream(in);  
  16.                 filename = dis.readUTF();         //读取文件名   
  17.                 totalBytes = dis.readLong();      //读取文件大小    
  18.                 file = new File(dir,filename);  
  19.                 fos = new FileOutputStream(file);  
  20.                 //FileOutputStream fos = new FileOutputStream(File.createTempFile(filename, null, dir));   
  21.                 //输出日志   
  22.                   
  23.                 //RSA加密以128 bytes位单位,一次最多加密117bytes.   
  24.                 byte[] buf = new byte[128];  
  25.                 int available;  
  26.                 while((available = in.read(buf)) != -1){  
  27.                     //读取签名   
  28.                     byte[] signature = buf;  
  29.                     //读取数据   
  30.                     buf = new byte[128];  
  31.                     available = in.read(buf);  
  32.                     byte[] availableBytes = null;  
  33.                     if(available == buf.length){  
  34.                         availableBytes = buf;  
  35.                     }else{  
  36.                         availableBytes = new byte[available];  
  37.                         for (int i = 0; i < available; i++) {  
  38.                             availableBytes[i] = (Byte) buf[i];  
  39.                         }  
  40.                     }  
  41.                       
  42.                     //验证数据签名   
  43.                     boolean flag = sign.verifySignature(availableBytes, signature);  
  44.                     //写入数据   
  45.                     if(flag){  
  46.                         //count += availableBytes.length;   
  47.                         fos.write(coder.decrypt(availableBytes));  
  48.                         //System.out.println(""+count+" bytes received");   
  49.                     }  
  50.                 }  
  51.                 fos.close();  
  52.                 socket.shutdownInput();  
  53.                 clientCount -= 1;  
  54.                 System.out.println("有连接断开,当前总连接数:"+clientCount);  
  55.                 System.out.println(new SimpleDateFormat("[yyyy-MM-DD HH:mm:ss ]").format(new Date())  
  56.                     +filename+" 接收完毕. 大小 "+(totalBytes/1024)+" kb,保存路径:"+dir.getAbsolutePath());  
  57.             } catch (NumberFormatException e) {  
  58.                 System.err.println("端口配置错误");  
  59.                 e.printStackTrace();  
  60.             } catch (FileNotFoundException e) {  
  61.                 System.err.println("文件没找到,文件名:"+filename+",可能是因为读取socket数据失败");  
  62.                 e.printStackTrace();  
  63.             } catch (IOException e) {  
  64.                 System.err.println("文件读/写错误");  
  65.                 try {  
  66.                     fos.close();  
  67.                 } catch (IOException e1) {  
  68.                     e1.printStackTrace();  
  69.                 }  
  70.                 file.delete();  
  71.                 e.printStackTrace();  
  72.             }  
  73.         }  
  74.     }  

 

 

 

main方法

 

  1. public static void main(String[] args) {  
  2.           
  3.         runServer(args);  
  4.           
  5.     } 
分享到:
评论

相关推荐

    Delphi RSA 加密解密签名验签控件 RSA_Component(1.0.0.0).rar

    RSA加密演算法是一种非对称加密演算法。在公开密钥加密和电子商业中RSA被广泛使用。 典型的应用 1. 苹果App签名, iOS App 签名的原理; 2. 支付宝签名验证 ; 2. HTTPS 加密连接; 3. 程序直接用RSA+AES加密通信 ...

    Delphi 开发的 RSA 加密解密签名验签控件演示程序 RSA_Component_Demo(1.0.0.0).rar

    RSA加密演算法是一种非对称加密演算法。在公开密钥加密和电子商业中RSA被广泛使用。这是演示程序,不包含控件 型的应用 1. 苹果App签名, iOS App 签名的原理; 2. 支付宝签名验证 ; 2. HTTPS 加密连接; 3. 程序...

    C# Socket传输加密文件并解密(WinForm版)

    这是我用C#编写的基于Socket网络编程技术,在网络上传输加密文件,并对其进行数字签名,在另一端进行解密,并验证签名的一个WinForm程序,里面涉及到的加密解密算法有对称密码算法DES和非对称密码算法RSA加密解密...

    RSA文件加密传送

    综合来看,这个系统利用RSA加密保障文件的安全性,结合TCP和UDP满足不同场景的传输需求,是实现安全文件传输的一个典型示例。开发者需要对Java网络编程、加密算法以及数据传输协议有深入理解,才能有效地构建和维护...

    java模仿QQ通信实现RSA加密解密

    综上所述,"java模仿QQ通信实现RSA加密解密"项目涵盖了网络通信的基础(Socket编程),以及安全性相关的高级概念(RSA加密解密、消息摘要、数字签名)。通过这样的实践,开发者可以更好地理解和掌握网络编程和信息...

    Java实现RSA加密解密,数字证书生成与验证(有搭Socket)

    本主题涉及的关键技术包括RSA加密算法、数字证书、以及Socket编程,这些都是网络安全通信的基础。 首先,RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它的特点...

    ssl socket加密传输

    在SSL Socket加密传输中,OpenSSL的作用是生成必要的密钥材料和证书,以确保数据的机密性和完整性。 1. **生成私钥**: 使用OpenSSL生成RSA私钥,通常使用`genpkey`命令。例如,以下命令将创建一个2048位的RSA私钥...

    VC++ 毕业论文:RSA文件加密原理及代码实现

    VC++ 毕业论文:RSA文件加密原理及代码实现 RSA在软件方面的应用,主要集中在Internet上。加密连接、数字签名和数字证书的核心算法广泛使用RSA。日常应用中,有比较著名的工具包Open SSL(SSL,Security Socket Layer...

    socket 加密传送

    1. **EncripClient.java** - 这可能是客户端的加密Socket实现。客户端在发送数据前先加密,然后通过Socket连接将加密后的数据发送到服务器。 2. **EncripServer.java** - 对应的是服务器端的处理逻辑,它接收客户端...

    基于java的类PGP文件加密传输系统

    总的来说,基于Java的类PGP文件加密传输系统利用了Java的安全特性,如加密库和数字签名,实现了类似PGP的文件加密、签名和传输功能,确保了数据在传输过程中的隐私和完整性。通过这样的系统,用户可以更安心地进行...

    文件传输的签名与验证程序

    本文主要介绍了一种基于RSA和MD5算法的文件传输签名与验证系统,利用Java语言和Winsock通信协议实现。以下将详细阐述这个系统的设计原理和关键组成部分。 首先,数字签名的核心是RSA算法,这是一种非对称加密算法,...

    Openssl给文件传输加密

    例如,`openssl enc`命令可用于对文件进行加密,`openssl rsautl`可用于处理RSA加密和解密。同时,`openssl pkeyutl`也可以用于非对称加密操作。具体的命令格式和参数需要根据实际情况调整。 6. **SSLClient**: ...

    Socket_Tcp.zip

    通过这种方式,"Socket_Tcp.zip"中的程序展示了如何利用C++、TCP Socket、RSA加密和MD5摘要来实现安全的文件传输,这对于任何需要进行安全数据交换的系统都具有很高的参考价值。这样的实现不仅保证了文件内容的安全...

    带有RSA的MFC加密聊天软件

    在RSA加密的基础上,SOCKET可以实现安全的数据传输。 在项目中,"SecureIM.doc"可能是设计文档,详细描述了软件的设计思路、架构和实现方法,包括RSA算法的实现、MFC框架的应用以及SOCKET编程的细节。而"SecureIM...

    基于JAVA的文件加密传输系统的设计与实现.pdf

    - **加密算法**:文中虽然未明确指出具体的加密算法,但考虑到系统需要支持文件的加密传输,可以推测可能采用了AES、RSA等加密算法。这些算法既可以保证数据的安全性,又能够满足文件传输的需求。 - **数字签名**:...

    rsa算法实现系统

    1. **RSA加密与解密**:RSA的加解密过程基于大数因子分解的困难性。加密时,用户使用接收者的公钥对明文进行加密;解密时,接收者使用自己的私钥对密文进行解密。这种机制确保了即使公钥被截获,也无法轻易解密信息...

    mongodb开启SSL传输加密

    在现代网络安全环境中,确保数据在传输过程中的安全性至关重要,SSL(Secure Socket Layer)或其更新版本TLS(Transport Layer Security)正是实现这一目标的关键技术。SSL/TLS可以提供端到端的数据加密,防止中间人...

    RSA-TBOS数字签密方案分析及其Java实现技术.pdf

    Java 提供了相关的 API 来实现 RSA 加密和数字签名,例如 Java Cryptography Architecture (JCA) 和 Java Secure Socket Extension (JSSE)。 在 Java 中,RSA 加密可以使用 java.security.KeyPairGenerator 生成...

    VC++毕业论文:RSA文件加密原理及代码实现

    加密连接、数字签名和数字证书的核心算法广泛使用RSA。日常应用中,有比较著名的工具包Open SSL(SSL,Security Socket Layer,是一个安全传输协议,在Internet上进行数据保护和身份确认。Open SSL是一个开放源代码的...

    浅析RSA密码算法在物联网数据传输中的应用.pdf

    8. 法规遵从性:在医疗、金融等领域,使用RSA加密符合相关法规对数据安全的要求,如HIPAA(Health Insurance Portability and Accountability Act)和PCI DSS(Payment Card Industry Data Security Standard)等。...

Global site tag (gtag.js) - Google Analytics