DES是对称加密算法的其中一个,用一个密钥进行加密解密数据,安全性能比较低,效率较高,一些不太重要的数据可以使用DES加密算法进行加密解密传输,其他的3DES与AES用法类似。

流程图

首先认真看一下流程图,在脑海里过一遍,然后其实也就是分为以下两个过程,传输完密钥后,就可以使用这个密钥加密数据发送给服务器,服务器拿密钥解密数据,完事。

OK,直接贴代码吧,注意下Base64转码传输以及密钥的传输就行了。

Server 端

package des;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.security.InvalidKeyException;

import java.security.Key;

import javax.crypto.BadPaddingException;

import javax.crypto.IllegalBlockSizeException;

//DES加密

public class Server {

public void openServer() throws IOException{

ServerSocket serverSocket=new ServerSocket(4400);

Thread thread=null;

Socket socket=null;

while(true){

socket=serverSocket.accept();

thread=new Thread(new myThread(socket));

thread.start();

}

}

public static void main(String[] args){

try {

new Server().openServer();

} catch (IOException e) {

System.out.println(e.getMessage());

e.printStackTrace();

}

}

}

class myThread implements Runnable{

private Socket socket;

BufferedReader is;

PrintWriter os;

String passwd="bayaojiu.com";

Key key=null;

public myThread(Socket socket){

this.socket=socket;

try {

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

os=new PrintWriter(socket.getOutputStream());

} catch (IOException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}

public void run(){

try {

DesKeyUtils des=new DesKeyUtils();

//接收到base64编码后的密钥字符串

String request=is.readLine();

//base64解密为普通二进制数组

byte decodeMsg[]=des.decoder.decode(request);

//根据二进制数组转换成key对象

key=des.strToKey(decodeMsg);

String passwdClient=null;

//等待客户端发送密文

String response=is.readLine();

//用密钥将密文解密

passwdClient=des.decodeKey(response.getBytes(),key);

System.out.println("receive:"+passwdClient);

//等于密码就通过验证了

if(passwdClient.equals(passwd))

os.println("yes");

else

os.println("false");

os.close();

is.close();

socket.close();

} catch (IOException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {

}

}

}

Client 端

package des;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.security.Key;

public class Client {

private static DesKeyUtils des;

private static Key publicKey;

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

des=new DesKeyUtils();

//生成密钥

publicKey=des.generateSecrety();

connectServer();

}

public static void connectServer() throws IOException{

String passwd="bayaojiu.com";

Socket socket=new Socket("127.0.0.1",4400);

PrintWriter os=new PrintWriter(socket.getOutputStream());

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

//转换成二进制数据进行保存

byte[]encodeData=publicKey.getEncoded();

//因为DES生成二进制数据中有ascii码无法显示的字符,传输的时候会丢失,所以我们使用base64进行无损传输

String request=des.encoder.encodeToString(encodeData);

//发送给服务器

os.println(request);

os.flush();

//根据Key对象对发送的内容进行加密,然后再将加密后的密文经过base64编码

String decodeMes=des.encodeKey(passwd.getBytes("UTF-8"),publicKey);

//发送密文给服务器

os.println(decodeMes);

os.flush();

//查看是否成功验证

System.out.println(is.readLine());

os.close();

is.close();

socket.close();

}

}

然后我抽出来了一个加密解密类  DesKeyUtils

package des;

import java.io.UnsupportedEncodingException;

import java.security.InvalidKeyException;

import java.security.Key;

import java.security.NoSuchAlgorithmException;

import java.security.spec.InvalidKeySpecException;

import java.util.Base64;

import javax.crypto.BadPaddingException;

import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.KeyGenerator;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

public class DesKeyUtils {

private static Cipher cipher;

final public static Base64.Decoder decoder=Base64.getDecoder();

final public static Base64.Encoder encoder=Base64.getEncoder();

//初始化

public DesKeyUtils(){

try {

cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}

//解密

public static String decodeKey(byte [] encodeKey,Key secretkey) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException{

//先将经过base64编码的密文还原

encodeKey=decoder.decode(encodeKey);

try {

cipher.init(Cipher.DECRYPT_MODE, secretkey);

//将原密文进行解密

return new String(cipher.doFinal(encodeKey),"UTF-8");

}catch(Exception e){

e.printStackTrace();

return null;

}

}

//加密

public static String encodeKey(byte[] decodekey,Key secretkey){

try {

cipher.init(Cipher.ENCRYPT_MODE, secretkey);

//将明文加密成密文

byte[] encodeMsg=cipher.doFinal(decodekey);

//将密文经过base64加密

return new String(encoder.encode(encodeMsg),"UTF-8");

} catch (IllegalBlockSizeException | BadPaddingException | InvalidKeyException | UnsupportedEncodingException e) {

e.printStackTrace();

return null;

}

}

//生成密钥

public static Key generateSecrety(){

KeyGenerator key;

try {

//生成

key = KeyGenerator.getInstance("DES");

key.init(56);

SecretKey secretKey=key.generateKey();

byte[] bytesKey=secretKey.getEncoded();

//转换

DESKeySpec desKeySpec=new DESKeySpec(bytesKey);

SecretKeyFactory factory =SecretKeyFactory.getInstance("DES");

Key convertSecretKey=factory.generateSecret(desKeySpec);

return convertSecretKey;

} catch (NoSuchAlgorithmException | InvalidKeyException | InvalidKeySpecException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

return null;

}

}

//将二进制转换成Key对象,跟转换密钥那里差不多

public static Key strToKey(byte[] data){

Key convertSecretKey1=null;

try {

DESKeySpec desKeySpec=new DESKeySpec(data);

SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");

convertSecretKey1=factory.generateSecret(desKeySpec);

return convertSecretKey1;

} catch (NoSuchAlgorithmException | InvalidKeySpecException | InvalidKeyException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

return null;

}

}

}

运行结果

Server:

———————————————————————————-

Client:

参考:

java socket 加密,Java socket通信实现DES加密与解密相关推荐

  1. java和c 进行des_c语言的des加密,怎么用java解密

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我试了好多java解密方法都不对,主要是看不懂c代码以下是C代码大神帮忙看看 /*------------------------------------ ...

  2. PHP、JAVA、C#、Object-C 通用的DES加密

    2019独角兽企业重金招聘Python工程师标准>>> PHP: class JoDES {private static $_instance = NULL;/*** @return ...

  3. 【Java工具类】(30)—DES加密工具类

    Java工具类(30)-DES加密工具类 package com.awifi.cloudnative.container.manage.provider.utils;import org.apache ...

  4. 对称加密——对入参进行DES加密处理

    体验更优排版请移步原文:http://blog.kwin.wang/programming/symmetric-encryption-des-js-java.html 对称加密是最快速.最简单的一种加 ...

  5. linux下des加密命令,linux下的DES加密

     linux下的DES加密 des_crypt, ecb_crypt, cbc_crypt, des_setparity, DES_FAILED 都是用于DES快速加密 调用格式 #include ...

  6. Java工具类——DES加密和解密工具 I

    可以指定不同的密钥对同一字符串进行不同的加密操作,增强加密性能. package com.app; import java.security.Key; import java.security.Sec ...

  7. 基于加密的即时通信系统设计

    1.1. 系统功能概述 根据自己的实际水平,以及即时聊天的流程需求,基于安全的即时聊天系统应该由服务器端模块.客户端模块.RSA加密解密模块.DES加密解密模块.数字签名和验证模块5部分组成. 根据实 ...

  8. DES加密工具类-DesUtil

    有一个功能要将拍照的图片进行加密保存,选择了DES加密.记录一下代码. import java.security.Key; import javax.crypto.Cipher; import jav ...

  9. DES加密和解密工具,可以对字符串进行加密和解密操作

    DES加密和解密工具,可以对字符串进行加密和解密操作 import java.io.UnsupportedEncodingException;import java.security.Key;impo ...

最新文章

  1. C#_关于静态类和静态方法(转)
  2. SysAid 9.0 发布,增加移动设备管理功能
  3. C++的几种遍历形式
  4. 寄存器(CPU的工作原理)
  5. C# 9 新特性 —— 增强的 foreach
  6. Android 用户界面---样式和主题(Styles and Themes)(二)
  7. 移动GPU三种主流架构优缺点浅析
  8. 《原神》月入16亿,米哈游为何仍然被嫌弃?
  9. web前端基础(09html5多媒体)
  10. java map扩容机制_java中ConcurrentHashMap的扩容机制问题
  11. 【渝粤教育】21秋期末考试组织行为学10068k2
  12. python搜索关键词自动提交_根据关键词,自动从搜索引擎采集相关网站的真实地址与标题...
  13. 淘宝价格带卡位公式是什么?如何定价?
  14. 软件测试实习生(3k)
  15. 00后面试华为软件测试工程师,竭尽全力拿到15K。。。。。
  16. 大数据架构和模式,第 2 部分
  17. java jcseg 官网_Jcseg轻量级Java中文分词器2.6.5最新版
  18. c++中static_cast用法
  19. 基于RTT Nano的多任务嵌入式程序设计
  20. 突然搜狗输入法切换不出中文

热门文章

  1. 用Python实现腾讯云点播VOD
  2. 详解css设置默认字体
  3. MySQL学习笔记(1)——高可用组复制
  4. 【智能制造】生产异常情况的处理流程
  5. SSM中mybtis报错### The error may involve defaultParameterMap ### The error occurred while setting param
  6. 水果分割论文、代码和数据集汇总
  7. maven如何排除依赖
  8. 不要相信深度学习报告的TOPS指标
  9. OmniPeek-20180725-Error 2502/Error 2053
  10. KIngcms 5.1版本增加站内链接功能自动给指定关键词加上链接