<强>前言强>
数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。
数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法。它利用密码技术对信息进行加密,实现信息隐蔽从而起到保护信息的安全的作用。
项目中使用插座进行文件传输过程时,需要先进行加密。实现的过程中踏了一些坑,下面对实现过程进行一下总结。
由于加密过程中使用的是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使用套接字对大文件进行加密传输