java socket 加密,Java socket通信实现DES加密与解密
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加密与解密相关推荐
- java和c 进行des_c语言的des加密,怎么用java解密
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我试了好多java解密方法都不对,主要是看不懂c代码以下是C代码大神帮忙看看 /*------------------------------------ ...
- PHP、JAVA、C#、Object-C 通用的DES加密
2019独角兽企业重金招聘Python工程师标准>>> PHP: class JoDES {private static $_instance = NULL;/*** @return ...
- 【Java工具类】(30)—DES加密工具类
Java工具类(30)-DES加密工具类 package com.awifi.cloudnative.container.manage.provider.utils;import org.apache ...
- 对称加密——对入参进行DES加密处理
体验更优排版请移步原文:http://blog.kwin.wang/programming/symmetric-encryption-des-js-java.html 对称加密是最快速.最简单的一种加 ...
- linux下des加密命令,linux下的DES加密
linux下的DES加密 des_crypt, ecb_crypt, cbc_crypt, des_setparity, DES_FAILED 都是用于DES快速加密 调用格式 #include ...
- Java工具类——DES加密和解密工具 I
可以指定不同的密钥对同一字符串进行不同的加密操作,增强加密性能. package com.app; import java.security.Key; import java.security.Sec ...
- 基于加密的即时通信系统设计
1.1. 系统功能概述 根据自己的实际水平,以及即时聊天的流程需求,基于安全的即时聊天系统应该由服务器端模块.客户端模块.RSA加密解密模块.DES加密解密模块.数字签名和验证模块5部分组成. 根据实 ...
- DES加密工具类-DesUtil
有一个功能要将拍照的图片进行加密保存,选择了DES加密.记录一下代码. import java.security.Key; import javax.crypto.Cipher; import jav ...
- DES加密和解密工具,可以对字符串进行加密和解密操作
DES加密和解密工具,可以对字符串进行加密和解密操作 import java.io.UnsupportedEncodingException;import java.security.Key;impo ...
最新文章
- C#_关于静态类和静态方法(转)
- SysAid 9.0 发布,增加移动设备管理功能
- C++的几种遍历形式
- 寄存器(CPU的工作原理)
- C# 9 新特性 —— 增强的 foreach
- Android 用户界面---样式和主题(Styles and Themes)(二)
- 移动GPU三种主流架构优缺点浅析
- 《原神》月入16亿,米哈游为何仍然被嫌弃?
- web前端基础(09html5多媒体)
- java map扩容机制_java中ConcurrentHashMap的扩容机制问题
- 【渝粤教育】21秋期末考试组织行为学10068k2
- python搜索关键词自动提交_根据关键词,自动从搜索引擎采集相关网站的真实地址与标题...
- 淘宝价格带卡位公式是什么?如何定价?
- 软件测试实习生(3k)
- 00后面试华为软件测试工程师,竭尽全力拿到15K。。。。。
- 大数据架构和模式,第 2 部分
- java jcseg 官网_Jcseg轻量级Java中文分词器2.6.5最新版
- c++中static_cast用法
- 基于RTT Nano的多任务嵌入式程序设计
- 突然搜狗输入法切换不出中文
热门文章
- 用Python实现腾讯云点播VOD
- 详解css设置默认字体
- MySQL学习笔记(1)——高可用组复制
- 【智能制造】生产异常情况的处理流程
- SSM中mybtis报错### The error may involve defaultParameterMap ### The error occurred while setting param
- 水果分割论文、代码和数据集汇总
- maven如何排除依赖
- 不要相信深度学习报告的TOPS指标
- OmniPeek-20180725-Error 2502/Error 2053
- KIngcms 5.1版本增加站内链接功能自动给指定关键词加上链接