vue中使用国密算法SM2、SM3、SM4

本文提供了一个Vue3应用的例子,展示了如何使用gm-crypto库进行SM2、SM3和SM4加密解密操作。包括SM2的公钥私钥加密解密,SM3的哈希加密,以及SM4的对称加密解密。代码示例中结合了ElementUI组件,实现了用户输入数据的实时加密解密展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、安装包

npm install gm-crypto

2、引入包

import { SM4, SM3, SM2 } from 'gm-crypto';

3、SM2加密解密

let SM2Data = reactive({
  publicKey: publicKey,
  privateKey: privateKey,
  originalData: 'SM2 椭圆曲线公钥密码算法',
  encryptedData: '',
  decryptedData: ''
})

//加密
const encryptSM2 = () => {
  SM2Data.encryptedData = SM2.encrypt(SM2Data.originalData, SM2Data.publicKey, {
    inputEncoding: 'utf8',
    outputEncoding: 'base64'
  })
}

//解密
const decryptedSM2 = () => {
  SM2Data.decryptedData = SM2.decrypt(SM2Data.encryptedData, SM2Data.privateKey, {
    inputEncoding: 'base64',
    outputEncoding: 'utf8'
  })
}

4、SM3加密

let SM3Data = reactive({
  originalData: 'SM3水电费水电费',
  encryptedData: ''
})

//加密
const encryptSM3 = () => {
  // SM3Data.encryptedData = SM3.digest(SM3Data.originalData)
  // SM3Data.encryptedData = SM3.digest(SM3Data.originalData, 'base64')
  SM3Data.encryptedData = SM3.digest(SM3Data.originalData, 'utf8', 'base64')
}

5、SM4加密解密

let SM4Data = reactive({
  key: '0123456789abcdeffedcba9876543210',
  iv: '0123456789abcdeffedcba9876543210',
  originalData: 'SM4 国标对称加密',
  encryptedData: '',
  decryptedData: ''
})


//加密
const encryptSM4 = () => {
  // ECB
  SM4Data.encryptedData = SM4.encrypt(SM4Data.originalData, SM4Data.key, {
    inputEncoding: 'utf8',
    outputEncoding: 'base64'
  })
  //CBC
  // SM4Data.encryptedData = SM4.encrypt(SM4Data.originalData, SM4Data.key, {
  //   iv: SM4Data.iv,
  //   mode: SM2Data.constants.CBC,
  //   inputEncoding: 'utf8',
  //   outputEncoding: 'hex'
  // })
}
//解密
const decryptedSM4 = () => {
  // ECB
  SM4Data.decryptedData = SM4.decrypt(SM4Data.encryptedData, SM4Data.key, {
    inputEncoding: 'base64',
    outputEncoding: 'utf8'
  })
  //CBC
  // SM4Data.decryptedData = SM4.decrypt(SM4Data.encryptedData, SM4Data.key, {
  //   iv: SM4Data.iv,
  //   mode: SM2Data.constants.CBC,
  //   inputEncoding: 'utf8',
  //   outputEncoding: 'hex'
  // })
}

6、vue3+element完整代码

<template>
  <div class="container">

    <el-row :gutter="24">
      <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
        相关文档:
        <a href="https://gitcode.net/mirrors/byte-fe/gm-crypto?utm_source=csdn_github_accelerator"
          target="_blank">gm-crypto</a>
      </el-col>
    </el-row>

    <el-tabs v-model="activeName" @tab-click="handleClick">
      <el-tab-pane label="SM2" name="SM2">
        <el-row :gutter="24">SM2 公钥: {{ SM2Data.publicKey }} </el-row>
        <el-row :gutter="24">SM2 私钥: {{ SM2Data.privateKey }} </el-row>
        <el-row :gutter="24">
          <el-col :xs="18" :sm="18" :md="18" :lg="18" :xl="18">
            <el-input v-model="SM2Data.originalData" placeholder="请输入需要加密的数据" clearable />
          </el-col>
          <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="6">
            <el-button type="cyan" size="mini" @click="encryptSM2">加密</el-button>
          </el-col>
        </el-row>
        <el-row :gutter="24">SM2 加密数据: </el-row>
        <el-row :gutter="24">
          <el-col :xs="18" :sm="18" :md="18" :lg="18" :xl="18">
            <el-input v-model="SM2Data.encryptedData" placeholder="请输入需要解密的数据" type="textarea" />
          </el-col>
          <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="6">
            <el-button type="cyan" size="mini" @click="decryptedSM2">解密</el-button>
          </el-col>
        </el-row>
        <el-row :gutter="24">SM2 解密数据: {{ SM2Data.decryptedData }} </el-row>
      </el-tab-pane>

      <el-tab-pane label="SM3" name="SM3">
        <el-row :gutter="24">
          <el-col :xs="18" :sm="18" :md="18" :lg="18" :xl="18">
            <el-input v-model="SM3Data.originalData" placeholder="请输入需要加密的数据" clearable />
          </el-col>
          <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="6">
            <el-button type="cyan" size="mini" @click="encryptSM3">加密</el-button>
          </el-col>
        </el-row>
        <el-row :gutter="24">SM3 加密数据: {{ SM3Data.encryptedData }} </el-row>
      </el-tab-pane>

      <el-tab-pane label="SM4" name="SM4">
        <el-row :gutter="24">SM4 秘钥: {{ SM4Data.key }} </el-row>
        <el-row :gutter="24">
          <el-col :xs="18" :sm="18" :md="18" :lg="18" :xl="18">
            <el-input v-model="SM4Data.originalData" placeholder="请输入需要加密的数据" clearable />
          </el-col>
          <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="6">
            <el-button type="cyan" size="mini" @click="encryptSM4">加密</el-button>
          </el-col>
        </el-row>
        <el-row :gutter="24">SM4 加密数据: {{ SM4Data.encryptedData }} </el-row>
        <el-row :gutter="24">
          <el-col :xs="18" :sm="18" :md="18" :lg="18" :xl="18">
            <el-input v-model="SM4Data.encryptedData" placeholder="请输入需要解密的数据" clearable />
          </el-col>
          <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="6">
            <el-button type="cyan" size="mini" @click="decryptedSM4">解密</el-button>
          </el-col>
        </el-row>
        <el-row :gutter="24">SM4 解密数据: {{ SM4Data.decryptedData }} </el-row>
      </el-tab-pane>
    </el-tabs>


  </div>
</template>

<script lang="ts" setup name="DemoGuomi">
// 该加密方式需要安装gm-crypto
import { SM4, SM3, SM2 } from 'gm-crypto';
import { reactive, ref } from 'vue';


const { publicKey, privateKey } = SM2.generateKeyPair()
let activeName = ref('SM2')
let SM2Data = reactive({
  publicKey: publicKey,
  privateKey: privateKey,
  originalData: 'SM2 椭圆曲线公钥密码算法',
  encryptedData: '',
  decryptedData: ''
})

let SM3Data = reactive({
  originalData: 'SM3水电费水电费',
  encryptedData: ''
})

let SM4Data = reactive({
  key: '0123456789abcdeffedcba9876543210',
  iv: '0123456789abcdeffedcba9876543210',
  originalData: 'SM4 国标对称加密',
  encryptedData: '',
  decryptedData: ''
})


const handleClick = (tab: string, event: HTMLElement) => {
  console.log(tab, event);
}

//加密
const encryptSM2 = () => {
  SM2Data.encryptedData = SM2.encrypt(SM2Data.originalData, SM2Data.publicKey, {
    inputEncoding: 'utf8',
    outputEncoding: 'base64'
  })
}

//解密
const decryptedSM2 = () => {
  SM2Data.decryptedData = SM2.decrypt(SM2Data.encryptedData, SM2Data.privateKey, {
    inputEncoding: 'base64',
    outputEncoding: 'utf8'
  })
}

//加密
const encryptSM3 = () => {
  // SM3Data.encryptedData = SM3.digest(SM3Data.originalData)
  // SM3Data.encryptedData = SM3.digest(SM3Data.originalData, 'base64')
  SM3Data.encryptedData = SM3.digest(SM3Data.originalData, 'utf8', 'base64')
}

//加密
const encryptSM4 = () => {
  // ECB
  SM4Data.encryptedData = SM4.encrypt(SM4Data.originalData, SM4Data.key, {
    inputEncoding: 'utf8',
    outputEncoding: 'base64'
  })
  //CBC
  // SM4Data.encryptedData = SM4.encrypt(SM4Data.originalData, SM4Data.key, {
  //   iv: SM4Data.iv,
  //   mode: SM2Data.constants.CBC,
  //   inputEncoding: 'utf8',
  //   outputEncoding: 'hex'
  // })
}
//解密
const decryptedSM4 = () => {
  // ECB
  SM4Data.decryptedData = SM4.decrypt(SM4Data.encryptedData, SM4Data.key, {
    inputEncoding: 'base64',
    outputEncoding: 'utf8'
  })
  //CBC
  // SM4Data.decryptedData = SM4.decrypt(SM4Data.encryptedData, SM4Data.key, {
  //   iv: SM4Data.iv,
  //   mode: SM2Data.constants.CBC,
  //   inputEncoding: 'utf8',
  //   outputEncoding: 'hex'
  // })
}
</script>

gm-crypto相关文档:https://gitcode.net/mirrors/byte-fe/gm-crypto?utm_source=csdn_github_accelerator

vue3+element ui例子:https://gitee.com/huanglgln/vue-sys-manage-el

 vue3+view ui例子:https://gitee.com/huanglgln/vue-sys-manage

 vue3+Ant Design Vue ui例子:https://gitee.com/huanglgln/vue-sys-manage-adv 

<think>好的,用户想了解边缘计算网关的定义、作用及工作原理。首先,我需要从提供的引用中找到相关信息,然后整理成清晰的结构。 首先,根据引用[1],边缘计算网关是连接物理世界和数字世界的核心枢纽,能实时处理数据,减轻云端负担。引用[3]提到,边缘网关位于物联网设备和云平台之间,负责数据采集、协议转换和边缘计算任务。定义部分可以综合这些信息,明确网关的位置和核心功能。 作用方面,引用[1]和[3]都提到了数据处理、协议适配、降低延迟和带宽节省。此外,引用[2]关于边缘计算的优势也可以补充进来,比如实时响应和安全性。需要分点说明,确保每个作用都有依据。 工作原理部分,引用[3]和[4]提供了细节。数据采集、协议转换、本地计算、数据过滤和云边协同是关键步骤。特别是引用[4]提到的Docker容器化技术,说明网关如何实现资源隔离和动态扩展,这需要详细解释。 还要注意用户要求使用中文回答,数学公式用$...$,独立公式用$$...$$,但当前内容可能不需要数学公式。不过要检查是否有需要的地方,比如如果有算法或方程的话,但根据引用内容,可能暂时不需要。 最后生成相关问题,要围绕定义、作用、工作原理展开,可能涉及技术架构、与云计算对比、安全机制和应用场景。需要确保问题具体,能引导深入学习。 检查引用标记是否正确,每个引用末尾加上[^n],比如引用[1]、[2]等。确保回答结构清晰,分点明确,语言通顺,符合用户的要求。</think>### 边缘计算网关的定义、作用及工作原理 #### 一、定义 边缘计算网关是**边缘计算架构中的关键设备**,位于物联网终端设备与云端或企业网络之间,具备**数据采集、协议转换、边缘计算**等核心功能。其核心目标是通过本地化处理减少云端依赖,实现低延迟、高可靠的数据交互[^3][^1]。 #### 二、核心作用 1. **数据聚合与协议适配** 连接多种异构设备(如传感器、PLC等),将不同通信协议(如Modbus、MQTT)统一转换为标准格式,解决设备间互联互通问题[^3]。 2. **实时计算与决策** 在本地执行数据处理(如滤波、特征提取)和规则引擎运算,实现毫秒级响应。例如,工业场景中设备异常检测的响应时间可从云端传输的数百毫秒降至10ms以内[^2][^1]。 3. **带宽优化与安全隔离** 通过数据压缩和过滤减少70%以上的上行流量,同时建立本地安全边界,阻断外部攻击向云端的扩散[^3][^4]。 4. **云边协同** 仅将关键数据(如报警信息、统计结果)上传云端,形成"边缘实时处理+云端长期分析"的分层架构[^2]。 #### 三、工作原理(技术实现) ```plaintext 设备层 → 边缘网关 → 云端 │ │ ├─ 数据采集(多协议兼容) ├─ 协议转换(标准化封装) ├─ 边缘计算(容器化任务) └─ 安全传输(TLS/DTLS加密) ``` 1. **数据采集层** 通过工业总线(RS485/CAN)或无线通信(LoRa/ZigBee)连接终端设备,支持同时接入200+节点[^3]。 2. **容器化计算引擎** 基于Docker实现轻量化虚拟化,每个计算任务(如AI推理、时序分析)运行在独立容器中,实现资源隔离与动态扩展[^4]。 3. **规则引擎示例** $$ \text{IF } (temperature > 100°C) \text{ AND } (vibration\_amplitude > 5mm/s^2) \text{ THEN trigger\_shutdown()} $$ 4. **资源调度机制** 采用优先级队列管理计算任务,确保关键任务(如安全控制)的CPU占用率始终高于后台任务[^4]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值