首页 > 其他分享 >实验二 电子公文传输系统安全-进展2

实验二 电子公文传输系统安全-进展2

时间:2024-05-25 15:22:18浏览次数:21  
标签:公文 加密 String 传输 static new import byte 系统安全

实验二 电子公文传输系统安全-进展2

任务详情

  • 上周任务完成情况(代码链接,所写文档等)
  • 本周计划

上周任务完成情况

package cn.edu.nuc.article.util;

import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;

import java.security.SecureRandom;
import java.security.Security;
import java.util.Arrays;

public class SM3SaltHelper {

    static {
        // 在类加载时添加BouncyCastleProvider
        Security.addProvider(new BouncyCastleProvider());
    }

    public static void main(String[] args) {
        // 原始数据
        byte[] data = "Hello, World!".getBytes();

        // 生成随机的盐值
        byte[] salt = generateSalt();

        // 将原始数据与盐值拼接
        byte[] dataWithSalt = concatBytes(data, salt);

        // 计算SM3哈希值
        byte[] hash = calculateHash(dataWithSalt);

        // 将盐值和哈希值转换为十六进制字符串
        String saltHex = bytesToHex(salt);
        String hashHex = bytesToHex(hash);

        System.out.println("Salt: " + saltHex);
        System.out.println("Hash: " + hashHex);
    }

    public static String encrypt(String paramStr, byte[] salt) {
        // 原始数据
        byte[] data = paramStr.getBytes();

        // 将原始数据与盐值拼接
        byte[] dataWithSalt = concatBytes(data, salt);

        // 计算SM3哈希值
        byte[] hash = calculateHash(dataWithSalt);

        // 将哈希值转换为十六进制字符串
        return bytesToHex(hash);
    }

    public static String entryptSM3Password(String plainPassword) {
        byte[] bytesSalt = generateSalt();
        String sm3Password = encrypt(plainPassword, bytesSalt);
        return bytesToHex(bytesSalt) + sm3Password;
    }

    public static byte[] generateSalt() {
        byte[] salt = new byte[16];  // 使用16字节的盐值
        new SecureRandom().nextBytes(salt);
        return salt;
    }

    private static byte[] concatBytes(byte[] a, byte[] b) {
        byte[] result = Arrays.copyOf(a, a.length + b.length);
        System.arraycopy(b, 0, result, a.length, b.length);
        return result;
    }

    private static byte[] calculateHash(byte[] input) {
        SM3Digest digest = new SM3Digest();
        digest.update(input, 0, input.length);
        byte[] result = new byte[digest.getDigestSize()];
        digest.doFinal(result, 0);
        return result;
    }

    public static String bytesToHex(byte[] bytes) {
        return Hex.toHexString(bytes);
    }

    public static byte[] HexTobytes(String hexStr) {
        return Hex.decode(hexStr);
    }
}

用户数据库如下:

  • SM4
    采用sm4对存储的公文进行加密处理,密钥随机生成,乱序存储在数据库中。其中sm4采用cbc模式,iv随机生成,跟随密文一起存储。解密的时候读取密文并分离密文和iv,然后解密。
package cn.edu.nuc.article.util;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.*;
import java.util.Arrays;
import java.util.Random;

public class SM4Tools {
    private static final String name = "SM4";                               // 算法名字
    private static final String transformation = "SM4/CBC/PKCS5Padding";    // 加密模式以及短块填充方式

    // private static final String Default_iv="0123456789abcdef";            // 加密使用的初始向量

    /**
     * 加载指定文件,对其进行加密,并将加密结果写入指定输出文件中
     * @param inputFile 要加密的输入文件路径
     * @param outputFile 加密后的输出文件路径
     * @param key 加密所需的密钥
     * @throws Exception 如果文件读取、加密或写入时出现错误,则抛出异常
     */
    public static void encodeFile(String inputFile, String outputFile, String key) throws Exception {
        byte[] inputBytes = Files.readAllBytes(Paths.get(inputFile));
        byte[] encodeByte = encode(inputBytes, key.getBytes(StandardCharsets.UTF_8));
        Files.write(Paths.get(outputFile), encodeByte);
        System.out.println("File encoded successfully.");
    }

    /**
     * 使用指定的加密算法和密钥对给定的字节数组进行加密
     * @param inputByte 要加密的字节数组
     * @param key 加密所需的密钥
     * @return 加密后的字节数组
     * @throws Exception 如果加密时发生错误,则抛出异常
     */
    public static byte[] encode(byte[] inputByte, byte[] key) throws Exception {
        Cipher c = Cipher.getInstance(transformation);
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, name);

        // 生成随机IV
        byte[] iv = new byte[16];
        SecureRandom random = new SecureRandom();
        random.nextBytes(iv);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

        c.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);

        // 加密数据
        byte[] encryptedData = c.doFinal(inputByte);

        // 将IV和密文一起返回
        byte[] combined = new byte[iv.length + encryptedData.length];
        System.arraycopy(iv, 0, combined, 0, iv.length);
        System.arraycopy(encryptedData, 0, combined, iv.length, encryptedData.length);

        return combined;
    }

    public static void decodeFile(String inputFilePath, String outputFilePath, String key) throws Exception {
        byte[] inputBytes = Files.readAllBytes(Paths.get(inputFilePath));
        byte[] decodeBytes = decode(inputBytes, key.getBytes(StandardCharsets.UTF_8));
        Files.write(Paths.get(outputFilePath), decodeBytes);
        System.out.println("File decode successfully.");
    }

    public static byte[] decode(byte[] inputBytes, byte[] key) throws Exception {
        Cipher cipher = Cipher.getInstance(transformation);
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, name);

        // 从输入数据中提取IV和密文
        byte[] iv = Arrays.copyOfRange(inputBytes, 0, 16);
        byte[] encryptedData = Arrays.copyOfRange(inputBytes, 16, inputBytes.length);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
        return cipher.doFinal(encryptedData);
    }

    public static String generateRandomString(int length) {
        Random random = new Random();
        StringBuffer string = new StringBuffer();

        for (int i = 0; i < length; i++) {
            int randomChar = random.nextInt(91);
            if (randomChar >= 48 && randomChar <= 57 ||
                    randomChar >= 65 && randomChar <= 90 ||
                    randomChar >= 97 && randomChar <= 122) {
                string.append((char) randomChar);
            } else {
                i--;
            }
        }

        return string.toString();
    }

    public static void main(String[] args) throws Exception {
        Security.addProvider(new BouncyCastleProvider());
        String inputFile = "D:\\data\\test01.docx";
        String enFile = "D:\\data\\test01Encode.docx";
        String deFile = "D:\\data\\test01Decode.docx";
        String key = generateRandomString(16);
        System.out.println(key);
        encodeFile(inputFile, enFile, key);
        decodeFile(enFile, deFile, key);
    }
}

上传后的公文加密存储

本周计划

等待验收

标签:公文,加密,String,传输,static,new,import,byte,系统安全
From: https://www.cnblogs.com/spicypieces/p/18212450

相关文章

  • Bash反弹shell & 搭建网页服务器 & 文件描述符学习 & ssh连接vm虚拟机 & sftp进行文件
    环境:kali:┌──(kali㉿kali)-[~/Desktop]└─$cat/proc/versionLinuxversion6.0.0-kali5-amd64([email protected])(gcc-12(Debian12.2.0-9)12.2.0,GNUld(GNUBinutilsforDebian)1.建立一个简单的链接进行nc,可以进行两个端口通信!#首先使用nc监听......
  • 什么样的数据摆渡设备,可以满足不同网间数据的安全传输需求?
    数据摆渡设备是用来在不同的网络环境间安全地传输数据的硬件或软件解决方案。它们通常用于确保在具有不同安全级别的网络(如内网和外网)之间进行数据交换时的安全性和合规性。以下是一些常见的数据摆渡设备和方法:移动介质拷贝:使用U盘或移动硬盘等移动介质进行数据拷贝,这是一种比较......
  • 如何冲破传统传输形态带来的风险,保护核心研发数据?
    企业的核心资产主要体现在其科技创新和信息技术领域的核心竞争力和技术优势,因此研发数据就是企业最核心的数据资产,对企业具有至关重要的意义。研发数据通常指的是在产品或技术的研发过程中产生的各种数据,包括但不限于:实验数据:实验过程中收集的数据,如测试结果、性能指标等;设计数......
  • 如何保障EDA数据传输过程中,核心数据的安全可靠流转?
    EDA是指利用计算机辅助设计软件,来辅助完成超大规模集成电路芯片的设计,制造、封装、测试整个流程。随着芯片设计的复杂程度不断的提升,基于先进工艺节点的这种集成电路的规模,可以达到数10亿个半导体的器件,所以不借助EDA已经无法完成芯片的设计,因此EDA已经成为芯片设计的必要工具,是推......
  • 4/7一文讲透网络传输流程 epoll内核模型 reactor用户空间处理模型
    epoll是内核如何将由层层协议栈去除tcp头,根据四元组查socket文件,将sk_buffer放到socket接受队列的 reactor  五种IO模型,三种线程处理模型     回溯算法之全排列 将所有需要用到的数组包括路径数组状态数组都初始化好然后都放进dfs参数里面 这......
  • 仿真数据传输常用方式PK,最安全高效的还得是它!
    仿真数据(simulateddata)是在计算机或其他设备上通过模拟真实环境或系统生成的数据。这种数据可以用于各种目的,包括测试、验证、预测和分析等。仿真数据在科研、工程、金融、半导体等领域都有广泛的应用,通过模拟真实环境或系统生成的数据可以为各种研究和实践提供有力支持。仿真......
  • 完美的邮件大附件解决方案,需要具备哪些传输功能?
    企业办公中,会经常使用到电子邮件,进行文件传输和发送。但大多数电子邮件服务都有附件大小的限制,超过这个限制的文件无法通过邮件直接发送,会需要寻找邮件大附件解决方案。通常会涉及到用邮件发送的情况,包括但不限于以下几种:内部沟通:企业内部员工之间发送文件;正式文档:发送正式的......
  • 让机台数据传输更高效可靠,一文了解!
    在汽车制造业中,机台数据传输和管理是一个关键环节,它涉及到生产效率、产品质量和企业运营的多个方面。以下是一些机台数据传输和管理的关键点:车载通信技术:随着汽车智能化的提升,车载通信技术变得尤为重要。车内总线通信与车载无线通信技术的提升,使得智能电动汽车成为万物互联的新......
  • 传输层总结笔记3
    1.TCP头格式有源、目的端口号,指示进行通信的两个应用进程;首部长度;序列号,表示数据部分的第一个字节的编号;确认号,表示希望接收到的下一个字节的编号,表明该编号之前的数据都已经被确认接收了;控制位,ACK表示确认号有效性RST表示强制断开连接SYN、FIN方别表示报文属于TCP连接建立......
  • 可替代FTP的信创传输软件 需要具备哪些功能?
    信创传输软件是指在信息技术应用创新(信创)环境下,用于数据传输的软件系统。这类软件通常具备以下特点:1、自主可控:拥有完整的知识产权,不依赖于外国技术,能够保障数据传输过程中的安全性和可控性。2、全面适配信创环境:能够在国产化的服务器和终端环境下无缝运行,支持国产操作系统和C......