vue引入sm-crypto通过sm4对文件进行加解密,用户输入密码

对文件加密并保存:

javascript 复制代码
import { sm4 } from 'sm-crypto'

fetch("你的文件地址") .then(response => response.blob()) .then(byteStream => {
        const reader2 = new FileReader();
        reader2.onload = function(event) {
            const arrayBuffer = event.target.result;
            let keyBytes = new Uint8Array(arrayBuffer);
            let password = stringToHex("用户输入的密码");
            let code = sm4.encrypt(keyBytes,password, {output: 'array'})  
            let byteStream1 = new Blob([code], { type: 'application/octet-stream' });
            let link = document.createElement('a');
            link.href = URL.createObjectURL(byteStream1);
            link.download = "你保存的文件名";
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        };
        // 以ArrayBuffer形式读取文件
        reader2.readAsArrayBuffer(byteStream);
      })
	function stringToHex(str) {
	  let hex = '';
	  for (let i = 0; i < str.length; i++) {
	    hex += str.charCodeAt(i).toString(16);
	  }
	  // 如果转换后的16进制字符串长度不足32,则在前面填充0
	  while (hex.length < 32) {
	    hex = '0' + hex;
	  }
	  return hex;
	}

读取文件并解密:

javascript 复制代码
<input type="file" id="keyInput" accept="*" @change="readKeyFile" />

function readKeyFile() {
	    const keyInput = document.getElementById('keyInput');
	    const file = keyInput.files[0];
	    const reader = new FileReader();
	    reader.onload = function(event) {
	        const arrayBuffer = event.target.result;
	        let plainByte = JSON.parse("["+arrayBuffer+"]");
	        let password = stringToHex("用户输入的密码");
	        try{
	        	let pBytes = sm4.decrypt(plainByte,password, {output: 'array'});
	        	let prBytes = arrayToBuffer(pBytes);
	        	privateKeyBytes = new Uint8Array(prBytes);
	        }catch(e){
	        	alert('文件或密码错误');
	        	return;
	        }
			let decoder = new TextDecoder();
		    let alltext = decoder.decode(privateKeyBytes);
            console.log(alltext)//你的文件内容
	    };
	    // 读取文件
	    reader.readAsText(file);
	}
function stringToHex(str) {
    let hex = '';
    for (let i = 0; i < str.length; i++) {
      hex += str.charCodeAt(i).toString(16);
    }
    // 如果转换后的16进制字符串长度不足32,则在前面填充0
    while (hex.length < 32) {
      hex = '0' + hex;
    }
    return hex;
  }
  function arrayToBuffer(arr) {
      let buffer = new ArrayBuffer(arr.length);
      let view = new Uint8Array(buffer);
      for (let i = 0; i < arr.length; i++) {
          view[i] = arr[i];
      }
      return buffer;
  }
相关推荐
IT_陈寒11 小时前
React性能优化实战:这5个Hooks技巧让我的应用快了40%
前端·人工智能·后端
江天澄12 小时前
HTML5 中常用的语义化标签及其简要说明
前端·html·html5
知识分享小能手12 小时前
jQuery 入门学习教程,从入门到精通, jQuery在HTML5中的应用(16)
前端·javascript·学习·ui·jquery·html5·1024程序员节
美摄科技12 小时前
H5短视频SDK,赋能Web端视频创作革命
前端·音视频
七号练习生.c12 小时前
JavaScript基础入门
开发语言·javascript·ecmascript
黄毛火烧雪下12 小时前
React Native (RN)项目在web、Android和IOS上运行
android·前端·react native
fruge12 小时前
前端正则表达式实战合集:表单验证与字符串处理高频场景
前端·正则表达式
baozj12 小时前
🚀 手动改 500 个文件?不存在的!我用 AST 撸了个 Vue 国际化神器
前端·javascript·vue.js
用户40993225021212 小时前
为什么Vue 3的计算属性能解决模板臃肿、性能优化和双向同步三大痛点?
前端·ai编程·trae
海云前端112 小时前
Vue首屏加速秘籍 组件按需加载真能省一半时间
前端