Go语言和前端的DES加密解密

ops/2025/4/1 3:20:34/

Go语言和前端的DES加密解密

前端实现

安装加密包

npm install crypto-js

封装加密

des.js

import CryptoJS from '../node_modules/crypto-js/crypto-js.js' // DES加密
export const encryptDes = (message, key) => {const keyHex = CryptoJS.enc.Utf8.parse(key);const encrypted = CryptoJS.DES.encrypt(message, keyHex, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});return encrypted.toString();
}// DES解密
export const decryptDes = (ciphertext, key) => {const keyHex = CryptoJS.enc.Utf8.parse(key);// direct decrypt ciphertextconst decrypted = CryptoJS.DES.decrypt({ciphertext: CryptoJS.enc.Base64.parse(ciphertext)}, keyHex, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}

加密

import { encryptDes, decryptDes  } from '@/common/des.js' // 引用路径根据自己的文件结构而定encryptDes('要加密的数据', '加密的key')decryptDes('要解密的数据', '解密的key') 

go语言实现

封装加密

crypt.go

package cryptimport ("crypto/cipher""crypto/des""encoding/base64""errors"
)// EncryptDES DES加密
// message: 明文
// key: 8字节密钥
// 返回Base64编码的密文和可能的错误
func EncryptDES(message string, key string) (string, error) {if len(key) != 8 {return "", errors.New("DES key must be 8 bytes")}// 创建DES cipherblock, err := des.NewCipher([]byte(key))if err != nil {return "", err}// 创建ECB模式的加密器mode := NewECBEncrypter(block)// 对明文进行PKCS7填充plaintext := pkcs7Padding([]byte(message), block.BlockSize())// 创建密文缓冲区ciphertext := make([]byte, len(plaintext))// 加密mode.CryptBlocks(ciphertext, plaintext)// 返回Base64编码的密文return base64.StdEncoding.EncodeToString(ciphertext), nil
}// DecryptDES DES解密
// ciphertext: Base64编码的密文
// key: 8字节密钥
// 返回解密后的明文和可能的错误
func DecryptDES(ciphertext string, key string) (string, error) {if len(key) != 8 {return "", errors.New("DES key must be 8 bytes")}// 解码Base64密文cipherBytes, err := base64.StdEncoding.DecodeString(ciphertext)if err != nil {return "", err}// 创建DES cipherblock, err := des.NewCipher([]byte(key))if err != nil {return "", err}// 创建ECB模式的解密器mode := NewECBDecrypter(block)// 确保密文长度是8的倍数if len(cipherBytes)%8 != 0 {return "", errors.New("ciphertext is not a multiple of the block size")}// 创建明文缓冲区plaintext := make([]byte, len(cipherBytes))// 解密mode.CryptBlocks(plaintext, cipherBytes)// 去除PKCS7填充unpadded := pkcs7UnPadding(plaintext)return string(unpadded), nil
}// ECBEncrypter 实现ECB模式的加密器
type ECBEncrypter struct {b         cipher.BlockblockSize int
}// NewECBEncrypter 创建一个新的ECB加密器
func NewECBEncrypter(b cipher.Block) *ECBEncrypter {return &ECBEncrypter{b:         b,blockSize: b.BlockSize(),}
}// CryptBlocks 实现ECB模式的加密
func (x *ECBEncrypter) CryptBlocks(dst, src []byte) {if len(src)%x.blockSize != 0 {panic("input not full blocks")}if len(dst) < len(src) {panic("output smaller than input")}for len(src) > 0 {x.b.Encrypt(dst, src[:x.blockSize])src = src[x.blockSize:]dst = dst[x.blockSize:]}
}// ECBDecrypter 实现ECB模式的解密器
type ECBDecrypter struct {b         cipher.BlockblockSize int
}// NewECBDecrypter 创建一个新的ECB解密器
func NewECBDecrypter(b cipher.Block) *ECBDecrypter {return &ECBDecrypter{b:         b,blockSize: b.BlockSize(),}
}// CryptBlocks 实现ECB模式的解密
func (x *ECBDecrypter) CryptBlocks(dst, src []byte) {if len(src)%x.blockSize != 0 {panic("input not full blocks")}if len(dst) < len(src) {panic("output smaller than input")}for len(src) > 0 {x.b.Decrypt(dst, src[:x.blockSize])src = src[x.blockSize:]dst = dst[x.blockSize:]}
}// pkcs7Padding 添加PKCS7填充
func pkcs7Padding(origData []byte, blockSize int) []byte {padding := blockSize - len(origData)%blockSizepadtext := make([]byte, len(origData)+padding)copy(padtext, origData)for i := len(origData); i < len(padtext); i++ {padtext[i] = byte(padding)}return padtext
}// pkcs7UnPadding 去除PKCS7填充
func pkcs7UnPadding(origData []byte) []byte {length := len(origData)unpadding := int(origData[length-1])return origData[:(length - unpadding)]
}

解密

plainText, err := crypt.DecryptDES("vxa4TNMOWDlqwBnhYGD/6A==", "12345678")

http://www.ppmy.cn/ops/170751.html

相关文章

Python爬虫实战:批量获取中国知网(CNKI)文献摘要教程

前言 本教程将详细介绍如何使用Python爬虫批量获取中国知网(CNKI)的文献摘要信息。即使你是编程新手&#xff0c;也能通过本教程快速掌握相关技能。教程包含完整源码和详细解释&#xff0c;助你轻松入门网络爬虫开发。 准备工作 所需工具 Python 3.6 requests库 Beautiful…

Linux上位机开发实践(MPP平台的核心构成)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 芯片行业是一个赢者通吃的行业。也就是说细分领域的前两名&#xff0c;相比较后来者而言&#xff0c;拥有很多无可比拟的优势。以安防市场的soc来说…

企业级风控系统设计:速卖通API数据+区块链存证防篡改方案

以下是一个基于速卖通 API 数据与区块链存证防篡改技术相结合的企业级风控系统设计方案&#xff1a; 一、系统目标 该风控系统旨在利用速卖通 API 实时获取海量交易数据&#xff0c;并借助区块链的不可篡改特性对关键数据进行存证&#xff0c;通过智能化分析识别潜在风险&…

python:将mp4视频快进播放,并保存新的视频

本文将介绍将mp4视频快进播放&#xff0c;并保存新的视频的python代码。 import subprocessdef speed_up_video(input_path, output_path, speed2.0):"""快进播放视频&#xff08;加速播放&#xff09;:param input_path: 输入的视频文件路径:param output_pat…

paddle ocr

paddle ocr paddle ocr笔记准备工作referenceto onnx文本检测文本检测文字识别 paddle ocr笔记 准备工作 下载字典ppocr_keys_v1.txt&#xff0c;下标从1开始模型转换 reference paddlepaddle to onnx 下载模型&#xff0c;或者直接使用python跑一下并且把本地模型拿过来…

怎么简单设计一个文件上传系统?

关于文件上传系统有几个最主要的核心点需要解决: 如何支持超大文件上传 避免重复文件存储&#xff0c;节省空间 限流问题 大文件上传 假设有个 10 G 的文件需要上传&#xff0c;正常情况下是将文件转成流传到后端&#xff0c;如果不做任何处理&#xff0c;前端直传&#x…

k8s基础知识总结node+pod(上)

一、概念&#xff1a; k8s&#xff08;Kubernetes &#xff09;是一个开源的容器编排平台&#xff0c;用于容器化应用程序的部署、扩展和管理。使运维人员能够轻松地管理容器化应用的整个生命周期&#xff0c;包括容器的调度、资源分配、服务发现、负载均衡、自动伸缩以及故障…

ChatBI的流程图

Created with Raphal 2.3.0 用户输入 问题是否含预设关键字 预设关键字对应的参数 传入相应参数&#xff0c;调用查数 API 输出 把问题传给大语言模型 yes no Created with Raphal 2.3.0 用户输入 把 预设关键字 作为提示词一并传给大语言模型 大语言模型决定调用 API &#xf…