NaN 2023-10-31 21:34 采纳率: 18.2%
浏览 27
已结题

js实现给txt文件sm3加密,java也实现sm3加密,前后端需要加密一致!如何实现!

js实现给txt文件sm3加密,java也实现sm3加密,前后端需要加密一致!java通过对文件内容byte数组进行加密,前端如何实现可以和后端保持一致!

  • 写回答

18条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-31 21:37
    关注
    获得0.45元问题酬金

    引自强大而免费的微信小程序:皆我百晓生

    下面给出参考代码:

    前端(JavaScript):

    // 读取文件内容
    function readFile(file) {
      return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = (event) => {
          const content = event.target.result;
          resolve(content);
        };
        reader.onerror = reject;
        reader.readAsArrayBuffer(file);
      });
    }
    
    // 数组缓冲区转换为 Uint8Array
    function arrayBufferToUint8Array(buffer) {
      return new Uint8Array(buffer);
    }
    
    // 将 Uint8Array 转换为十六进制字符串
    function uint8ArrayToHexString(uint8Array) {
      return Array.prototype.map.call(uint8Array, (byte) => {
        return ('0' + (byte & 0xFF).toString(16)).slice(-2);
      }).join('');
    }
    
    // SM3 加密
    function sm3Encrypt(file) {
      return new Promise(async (resolve, reject) => {
        try {
          // 读取文件内容
          const content = await readFile(file);
          // ArrayBuffer 转换为 Uint8Array
          const uint8Array = arrayBufferToUint8Array(content);
          // 加密
          const encryptedData = CryptoJS.SHA256(uint8Array);
          // 转换为十六进制字符串
          const encryptedHexString = uint8ArrayToHexString(encryptedData);
          resolve(encryptedHexString);
        } catch (error) {
          reject(error);
        }
      });
    }
    
    // 使用示例
    const fileInput = document.getElementById('file-input');
    fileInput.addEventListener('change', async (event) => {
      const file = event.target.files[0];
      const encryptedHexString = await sm3Encrypt(file);
      console.log('Encrypted String:', encryptedHexString);
    });
    

    后端(Java):

    import org.bouncycastle.crypto.digests.SM3Digest;
    import java.math.BigInteger;
    
    public class SM3Example {
        public static void main(String[] args) {
            // 前端发送的加密后的十六进制字符串
            String encryptedHexString = "1234567890abcdef";
            
            // 将十六进制字符串转换为 byte 数组
            byte[] encryptedData = hexStringToByteArray(encryptedHexString);
            
            // 加密
            byte[] encryptedResult = SM3Digest.encrypt(encryptedData);
            
            // 将加密后的 byte 数组转换为十六进制字符串
            String encryptedResultHexString = byteArrayToHexString(encryptedResult);
            
            System.out.println("Encrypted Result: " + encryptedResultHexString);
        }
        
        // 十六进制字符串转换为 byte 数组
        private static byte[] hexStringToByteArray(String hexString) {
            int len = hexString.length();
            byte[] data = new byte[len / 2];
            for (int i = 0; i < len; i += 2) {
                data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)
                                     + Character.digit(hexString.charAt(i+1), 16));
            }
            return data;
        }
        
        // byte 数组转换为十六进制字符串
        private static String byteArrayToHexString(byte[] bytes) {
            StringBuilder sb = new StringBuilder();
            for (byte b : bytes) {
                sb.append(String.format("%02x", b));
            }
            return sb.toString();
        }
        
        // SM3 加密
        public static byte[] encrypt(byte[] data) {
            SM3Digest digest = new SM3Digest();
            digest.update(data, 0, data.length);
            byte[] result = new byte[digest.getDigestSize()];
            digest.doFinal(result, 0);
            return result;
        }
    }
    

    以上是一种实现方式,并不能代表唯一正确的实现方法,你可以根据具体情况进行调整和优化。因为涉及到文件的加密,一般建议在前端和后端都进行相同的加密操作,以保持加密一致性。


    对以上代码步骤补充解释:
    要实现前后端对txt文件进行SM3加密并保持一致,可以按照以下步骤进行操作:

    1. 前端使用JavaScript读取txt文件内容。可以使用File API的FileReader对象读取文件内容,并使用readAsArrayBuffer()方法将文件内容转换为ArrayBuffer类型的数据。

    2. 将ArrayBuffer类型的文件内容转换为Uint8Array类型的数据。可以使用ArrayBuffer对象的slice()方法将ArrayBuffer对象转换为Uint8Array对象。

    3. 调用SM3加密算法进行加密。在JavaScript中,可以使用crypto-js库来实现SM3加密。可以使用该库的CryptoJS.SHA256()方法对Uint8Array类型的数据进行加密。

    4. 将加密后的数据转换为十六进制字符串。可以使用刚刚加密后的Uint8Array类型的数据,通过调用Array.prototype.map()方法对每个字节进行转换,然后使用Array.prototype.join()方法将转换后的字节拼接成十六进制字符串。

    5. 将加密后的十六进制字符串发送给后端。

    6. 后端使用Java读取前端发送的十六进制字符串,并将其转换为byte数组。可以使用Java的String类的toCharArray()方法将字符串转换为字符数组,然后使用Integer类的parseInt()方法将字符数组中的每个字符转换为整数,最后将整数转换为byte类型。

    7. 调用SM3加密算法进行加密。在Java中,可以使用Bouncy Castle库来实现SM3加密。可以使用该库的SM3Digest类进行加密。

    8. 将加密后的byte数组转换为十六进制字符串。可以使用Java的BigInteger类的toString()方法将byte数组转换为十六进制字符串。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月8日
  • 创建了问题 10月31日

悬赏问题

  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥15 Python3.5 相关代码写作
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗