详解Android使用套接字对大文件进行加密传输

  

<强>前言

  

数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。
  

  

数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法。它利用密码技术对信息进行加密,实现信息隐蔽从而起到保护信息的安全的作用。
  

  

项目中使用插座进行文件传输过程时,需要先进行加密。实现的过程中踏了一些坑,下面对实现过程进行一下总结。

  

  

由于加密过程中使用的是DES加密算法、下面贴一下DES加密代码:

     //秘钥算法   私有静态最终字符串KEY_ALGORITHM="德";//加密算法:算法/模式/填充算法/工作模式/填充模式   私有静态最终字符串CIPHER_ALGORITHM=癉ES/欧洲/PKCS5Padding”;//秘钥   私有静态最终字符串键=?2345678”;//DES秘钥长度必须是8位      公共静态void main (String参数[]){   字符串数据=" https://www.yisu.com/zixun/加密解密”;   KLog。d(“加密数据:“+数据);   byte [] encryptData=https://www.yisu.com/zixun/encrypt (data.getBytes ());   KLog。d(“加密后的数据:“+新字符串(encryptData));   byte [] decryptData=https://www.yisu.com/zixun/decrypt (encryptData);   KLog。d(“解密后的数据:“+新字符串(decryptData));   }      公共静态byte[]加密(byte[]数据){//初始化秘钥   SecretKey SecretKey=new SecretKeySpec (KEY.getBytes (), KEY_ALGORITHM);      尝试{   密码密码=. getinstance (CIPHER_ALGORITHM);   cipher.init(密码。ENCRYPT_MODE secretKey);   byte []=cipher.doFinal结果(数据);   返回Base64.getEncoder () .encode(结果);   }捕捉(异常e) {   e.printStackTrace ();   }   返回null;   }      公共静态byte[]解密(byte[]数据){   byte [] resultBase64=Base64.getDecoder () .decode(数据);   SecretKey SecretKey=new SecretKeySpec (KEY.getBytes (), KEY_ALGORITHM);      尝试{   密码密码=. getinstance (CIPHER_ALGORITHM);   cipher.init(密码。DECRYPT_MODE secretKey);   结果byte []=cipher.doFinal (resultBase64);   返回结果;   }捕捉(异常e) {   e.printStackTrace ();   }   返回null;   }      之前      

输出:   

加密数据:加密解密
  

  

加密后的数据:rt6XE06pElmLZMaVxrbfCQ==
  

  

解密后的数据:加密解密
  

  

        新的套接字(Socket套接字=ApiConstants。主机,ApiConstants.PORT);   OutputStream outStream=socket.getOutputStream ();      InputStream生态基=socket.getInputStream ();   RandomAccessFile fileOutStream=新RandomAccessFile(文件,“r”);   fileOutStream.seek (0);   byte[]新字节缓冲区=[1024];   int len=1;   (((len=fileOutStream.read(缓冲))!=1)){   outStream。写(缓冲区,0,len);//这里进行字节流的传输   }      fileOutStream.close ();   outStream.close ();   inStream.close ();   socket.close ();      之前      

        Socket套接字=server.accept ();   InputStream生态基=socket.getInputStream ();   OutputStream outStream=socket.getOutputStream ();   outStream.write (response.getBytes (" utf - 8 "));   RandomAccessFile fileOutStream=新RandomAccessFile(文件,“rwd”);   fileOutStream.seek (0);   byte[]新字节缓冲区=[1024];   int len;   在((len=inStream.read(缓冲)!=1){//从字节输入流中读取数据写入到文件中   fileOutStream。写(缓冲区,0,len);   }      fileOutStream.close ();   inStream.close ();   outStream.close ();   socket.close ();      之前      

<强>数据加密传输

  

下面对传输数据进行加密解密

  

<强>
  

  

客户端变更如下:

        (((len=fileOutStream.read(缓冲))!=1)){   outStream.write (DesUtil.encrypt(缓冲),0,len);//对字节数组进行加密   }      

服务端变更代码:

        在((len=inStream.read(缓冲)!=1){   fileOutStream.write (DesUtil.decrypt(缓冲),0,len);//对字节数组进行解密   }      

执行代码后,服务端解密时会报如下异常:

  

<强> javax.crypto。BadPaddingException:垫块损坏
  

  

猜测错误原因是加密过程会对数据进行填充处理,然后在io流传输的过程中,数据有丢包现象发生,所以解密会报异常。

详解Android使用套接字对大文件进行加密传输