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

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

时间:2024-05-25 21:22:20浏览次数:21  
标签:加密 String 传输 static 实验 import byte public 系统安全

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

上周任务完成情况

  • 采用sm4对存储的公文进行加密处理,密钥随机生成,乱序存储在数据库中。其中sm4采用cbc模式,iv固定,跟随密文一起存储。解密的时候读取密文并分离密文和iv,然后解密。
  • SM3加盐存储

代码

package cn.edu.nuc.article.util;

import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.util.encoders.Hex;

import java.security.Security;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class SM3SaltHelper {
    public static void main(String[] args) {
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

        // 原始数据
        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){
        Map<String,String> resultMap=new HashMap<>();
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        // 原始数据
        byte[] data = paramStr.getBytes();

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

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

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


    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[8];
        new Random().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);
    }




}
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 secretKeySpec = new SecretKeySpec(key, name);
        // 创建 IvParameterSpec 对象,使用默认向量和字符集
        IvParameterSpec ivParameterSpec = new IvParameterSpec(Default_iv.getBytes(StandardCharsets.UTF_8));
        // 初始化加密实例
        c.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
        // 返回加密后的字节数组
        return c.doFinal(inputByte);
    }

    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);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(Default_iv.getBytes(StandardCharsets.UTF_8));
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
        return cipher.doFinal(inputBytes);
    }

    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 || // 数字0-9
                    randomChar >= 65 && randomChar <= 90 || // 大写字母A-Z
                    randomChar >= 97 && randomChar <= 122) { // 小写字母a-z
                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="0123456789ABCDEF";            //加密密钥,注意必须是128bits,即16个字节
        String key= generateRandomString(16) ;
        System.out.println(key);
        encodeFile(inputFile,enFile,key);
        decodeFile(enFile,deFile,key);


    }

}

实现效果:
image
image

本周计划

  • 最后调整优化代码
  • 边界测试
  • 增加用户数据量测试
  • 验收

标签:加密,String,传输,static,实验,import,byte,public,系统安全
From: https://www.cnblogs.com/ahu123456/p/18213025

相关文章

  • 探索SPI单线传输模式:时钟线与数据传输的简化之道
    探索SPI单线传输模式:时钟线与数据传输的简化之道在当今的嵌入式系统和微控制器通信中,串行外设接口(SPI)因其高速、全双工和同步的特点而广受欢迎。然而,随着设备尺寸和复杂性的不断减少,对SPI通信的简化需求也日益增加。在这种背景下,SPI的单线传输模式成为了一个备受关注的解决方案。......
  • 实验5
    task1.1点击查看代码#include<stdio.h>#defineN5voidinput(intx[],intn);voidoutput(intx[],intn);voidfind_min_max(intx[],intn,int*pmin,int*pmax);intmain(){inta[N];intmin,max;printf("录入%d个数据:\n",N);......
  • H3C NAT实验(一看就会版)
    实验目的1.掌握BasicNAT的配置方法;2.掌握NAPT的配置方法;3.掌握EasyIP的配置方法;4.掌握NATServer的配置方法。实验拓扑图(设备已更名)1.配置IP地址注意网关的指定接口和单臂路由中的接口之间的匹配;为PC配置网关:[FTP]iproute-static0.0.0......
  • 实验二 电子公文传输系统安全-进展2
    实验二电子公文传输系统安全-进展2任务详情上周任务完成情况(代码链接,所写文档等)本周计划上周任务完成情况SM3加盐packagecn.edu.nuc.article.util;importorg.bouncycastle.crypto.digests.SM3Digest;importorg.bouncycastle.jce.provider.BouncyCastleProvider;......
  • 头歌05-排列树实验-批处理作业调度
    """题目:给定n个作业的集合{J1,J2,…,Jn}。每个作业必须先由机器1处理,然后由机器2处理。所有任务必须先由机器1处理完成后,才能由机器2处理,并且在机器2的处理顺序必须与机器1的处理顺序一致,处理顺序一旦确定不能改变。设作业Ji需要机器1的处理时间为Ai,需要机器2的处理时间为Bi......
  • 【计算机毕业设计】基于SSM++jsp的实验室耗材管理系统【源码+lw+部署文档】
             目录第1章绪论1.1课题背景1.2课题意义1.3研究内容第2章开发环境与技术2.1MYSQL数据库2.2JSP技术 2.3SSM框架第3章系统分析3.1可行性分析3.1.1技术可行性3.1.2经济可行性3.1.3操作可行性3.2系统流程3.2.1操作流程3.2.2......
  • 头歌实验平台-Python-Scrapy爬虫之拉勾网招聘数据分析(第4,5关)
    首先十分感谢在博主(Radish_c-CSDN博客)的帮助下,完成了这个实验的1-3关,然后第4-5关就卡住了,然后搜了好久,这个实验4和5平台上只有博主 (Radish_c-CSDN博客)这个需要更改命令行的答案,博主的原文章在这里Python应用-Scrapy爬虫之拉勾网招聘数据分析-CSDN博客Python应用-Scrapy爬虫......
  • 软件测试实验二 | 白盒测试
    实验二白盒测试一、实验目的1、 掌握白盒测试的基础知识;2、 掌握白盒测试的检查内容及测试目的;3、 掌握黑盒测试的几种基本测试方法:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖。二、实验要求1、 复习有关内容,理解白盒测试;2、 掌握语句覆盖、判......
  • 实验 2 Scala 编程初级实践
    一实验目的二实验平台三实验内容和要求1、计算级数   2、模拟图形绘制traitDrawable{defdraw():Unit=println(this.toString)}caseclassPoint(varx:Double,vary:Double)extendsDrawable{defshift(X:Double,Y:Double):Unit={x+=X......
  • Linux实验五:进程间通信(一)
    目录一、实验目的二、实验内容三、实验环境四、参考代码五、实验步骤步骤1.编辑源代码test5.c步骤2.编译源代码test5.c步骤3.运行可执行程序test5步骤4.进一步调试源代码test5.c六、实验结果七、实验总结一、实验目的1、理解Linux进程通信的基本原理和方法;2......