用java实现基于cs模式的sm4算法加解密软件实现

时间: 2023-12-10 13:03:47 浏览: 29
好的,以下是Java实现的基于cs模式的sm4算法加解密软件实现: 服务端代码: ```java import cn.com.sgcc.crypto.SM4; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; public class SM4Server { private static final int PORT = 8888; private static final String KEY = "1234567890abcdef"; public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(PORT); System.out.println("Server started, waiting for client connection..."); while (true) { Socket socket = serverSocket.accept(); System.out.println("Client connected: " + socket.getInetAddress().getHostAddress()); new Thread(() -> { try { DataInputStream dis = new DataInputStream(socket.getInputStream()); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); while (true) { int type = dis.readInt(); if (type == 0) { // 加密 int length = dis.readInt(); byte[] data = new byte[length]; dis.readFully(data); byte[] encryptedData = SM4.encrypt_ECB(data, KEY.getBytes(StandardCharsets.UTF_8)); dos.writeInt(encryptedData.length); dos.write(encryptedData); dos.flush(); } else if (type == 1) { // 解密 int length = dis.readInt(); byte[] data = new byte[length]; dis.readFully(data); byte[] decryptedData = SM4.decrypt_ECB(data, KEY.getBytes(StandardCharsets.UTF_8)); dos.writeInt(decryptedData.length); dos.write(decryptedData); dos.flush(); } else { break; } } dis.close(); dos.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } }).start(); } } } ``` 客户端代码: ```java import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.nio.charset.StandardCharsets; public class SM4Client { private static final String HOST = "127.0.0.1"; private static final int PORT = 8888; public static void main(String[] args) throws IOException { Socket socket = new Socket(HOST, PORT); System.out.println("Connected to server: " + socket.getInetAddress().getHostAddress()); DataInputStream dis = new DataInputStream(socket.getInputStream()); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); String input = "这是一段测试字符串。"; byte[] inputData = input.getBytes(StandardCharsets.UTF_8); // 加密 dos.writeInt(0); // 指定为加密操作 dos.writeInt(inputData.length); dos.write(inputData); dos.flush(); int encryptedLength = dis.readInt(); byte[] encryptedData = new byte[encryptedLength]; dis.readFully(encryptedData); String encryptedText = new String(encryptedData, StandardCharsets.UTF_8); System.out.println("Encrypted text: " + encryptedText); // 解密 dos.writeInt(1); // 指定为解密操作 dos.writeInt(encryptedLength); dos.write(encryptedData); dos.flush(); int decryptedLength = dis.readInt(); byte[] decryptedData = new byte[decryptedLength]; dis.readFully(decryptedData); String decryptedText = new String(decryptedData, StandardCharsets.UTF_8); System.out.println("Decrypted text: " + decryptedText); dis.close(); dos.close(); socket.close(); } } ``` 需要注意的是,在这里我们使用了SM4算法的ECB模式进行加解密,因此需要保证每次加密的明文长度和密钥长度是一致的。在实际应用中,可以考虑使用SM4算法的CBC或CTR模式,以提高加密的安全性。同时,在实际应用中还需要考虑对数据进行完整性校验,防止数据被篡改。

相关推荐

最新推荐

recommend-type

H2003031251_李丹_基于JAVA CS远程监控系统软件的实现.doc

H2003031251_李丹_基于JAVA CS远程监控系统软件的实现.docH2003031251_李丹_基于JAVA CS远程监控系统软件的实现.doc
recommend-type

用Java实现的一个CS完整聊天程序源代码.doc

import java.awt.*;  import java.awt.event.*;    public class Client extends Frame implements  ActionListener,Runnable{    private TextField tf1,tf2;  private Label la1,la2;  private ...
recommend-type

用java做的新闻网站设计实现(包含后台管理系统)

其后台数据库采用Mysql数据库进行支持,界面美化是利用Adobe PhotoshopCS6图片处理软件进行处理的。本系统从使用者角度出发,界面友好美观,人机信息交互灵活、方便、快捷,安全可靠,系统同时具有很大的可扩充性。...
recommend-type

用C_实现CS模式下软件自动在线升级

本文针对目前C/S模式下编写的应用程序可维护性差的特点,提出了一套自动在线升级的解决方案,分析了在线升级的困难及实现原理,并给出了实现升级的部分代码,具有实际参考价值和现实意义。本文程序代码均在.Net ...
recommend-type

用C# 实现CS模式下软件自动在线升级.doc

针对目前C/S模式下编写的应用程序可维护性差的特点,提出了一套自动在线升级的解决方案,分析了在线升级的困难及实现原理,并给出了实现升级的部分代码,具有实际参考价值和现实意义
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。