
桌面应用音视频即时通讯【免费下载链接】zyfun跨平台桌面端视频资源播放器,免费高颜值.项目地址https://gitcode.com/gh_mirrors/zy/zyfun点击查看免费下载本指南以 packages/crypto/README.md 为骨架结合仓库内 src 源码实现与 example 示例应用系统讲解zy/crypto的安装方式、全部 API 用法、参数默认值与约束以及它在 zyfun 桌面播放器中作为底层加解密/编码基础设施的实际应用场景。读完本文你将能直接用zy/crypto完成 12 种哈希、12 种 HMAC、AES/DES/3DES/RC4/Rabbit/SM4/RSA 七大类加解密以及 Base64/Unicode/HTML/Gzip/URL/Hex 六类编码转换并了解其基于 crypto-js、node-forge、sm-crypto-v2 的多引擎实现原理。一、库定位与适用场景zy/crypto是 zyfun 仓库内一个面向Node.js 与 Web 双端的通用加密工具包提供hash、hmac、aes、des、tripleDes、rc4、rc4Drop、rabbit、rabbitLegacy、rsa、sm4、base64、unicode、html、gzip、url、hex共 17 个能力模块覆盖摘要、消息认证、对称/非对称加密、国密算法与常用编码格式。在 zyfun 项目中它承担着算法工具箱的职责主进程的 hiker 规则解析ruleParse.ts、代理缓存proxy/utils/cache.ts、视频站点嗅探sniffer.ts、TVBox 文件处理tvbox.ts等场景都直接引用该包渲染进程则在实验室页面的 crypto 组件src/renderer/src/pages/lab/components/crypto中通过 Web Worker 将加解密任务放入后台线程执行避免阻塞 UI。二、安装与引入当前zy/crypto尚未发布到 npm需要通过 pnpm workspace 方式使用。在目标包的package.json中添加工作区依赖{ dependencies: { zy/crypto: workspace:* } }然后执行pnpm install包本身依赖crypto-js、node-forge、sm-crypto-v2、fflate、he、uuid等运行时依赖见 package.json构建产物通过 tsdown 输出dist/index.cjs、dist/index.mjs与dist/index.d.mts同时支持 ESMimport与 CJSrequire要求 Node.js 18。本地构建执行pnpm build入口文件 src/index.ts 将base、encode、encrypt、mac四个子模块统一导出import * as base from ./core/base; import * as encode from ./core/encode; import * as encrypt from ./core/encrypt; import * as mac from ./core/mac; export { base, encode, encrypt, mac }; export * from ./core/base; export * from ./core/encode; export * from ./core/encrypt; export * from ./core/mac; export * from ./type;三、Hash 与 HMAC3.1 通用参数模型所有哈希/HMAC 方法共享一组参数类型定义见 type.ts参数说明默认值src待计算原文必填inputEncode原文编码取值utf8/utf16/utf16be/utf16le/hex/base64/latin1utf8outputEncode输出编码仅支持hex与base64hexkeyHMAC 密钥keyEncode密钥编码utf8底层由 mac.ts 的processHash/processHmac统一处理先把src/key按指定编码解析为 CryptoJSWordArray经哈希函数计算后再按输出编码序列化若outputEncode不是hex/base64直接返回空字符串。3.2 Hash 用法import { hash } from zy/crypto; hashmd5-32; hash.sha256({ src: hello, outputEncode: hex }); hash.sm3({ src: hello });支持的哈希算法md5-16、md5-32、sha1、sha224、sha256、sha3、sha384、sha512、sha512-224、sha512-256、ripemd160、sm3。其中md5-16是取 32 位 MD5 的第 8~24 位slice(8, 24)sha512-224/sha512-256由于 crypto-js 不支持由 node-forge 的forge.md[sha512/224]计算见 mac.tssm3则由 sm-crypto-v2 的SmCrypto.sm3计算mac.ts。3.3 HMAC 用法import { hmac } from zy/crypto; hmac.sha256({ src: hello, key: secret }); hmac.sm3({ src: hello, key: secret });支持的 HMAC 算法与 Hash 完全一致12 种。实现上md5-16同样截取中间 16 位sha512-224/sha512-256走 forge 的forge.hmac.create()sm3走SmCrypto.sm3(src, { mode: hmac, key })。四、对称加密AES / DES / 3DES / RC4 / Rabbit / SM44.1 公共参数约定对称加密普遍接受以下参数完整接口见 type.tssrc明文/密文key密钥长度按算法硬校验iv初始向量ECB 模式可省略其余模式必填modecbc默认、cfb、ofb、ctr、ecbAES/SM4 额外支持gcmpadpkcs5padding与 pkcs7 同义映射到pkcs7padding、pkcs7padding默认、ansix923、iso10126、iso97971、zeropadding、nopaddinginputEncode/outputEncode/keyEncode/ivEncode各类数据的编码输出编码仅接受base64/hexAES/SM4 在 GCM 模式下还支持aad附加认证数据、tag认证标签与对应的aadEncode/tagEncode。以 AES 为例其填充与模式映射分别由getPad和getMode完成pkcs5padding被归一化为pkcs7padding未识别的填充默认nopadding模式未识别时回退AES-CBC见 aes.ts。4.2 AESnode-forge 实现支持 GCMimport { aes } from zy/crypto; const encrypted aes.encode({ src: hello, key: 1234567890123456, iv: 1234567890123456, mode: cbc, pad: pkcs7padding, outputEncode: hex, }); const decrypted aes.decode({ src: encrypted, key: 1234567890123456, iv: 1234567890123456, mode: cbc, pad: pkcs7padding, inputEncode: hex, outputEncode: utf8, });关键约束源码 aes.ts 内以抛错强制密钥必须为 16/24/32 字节即 AES-128/192/256否则抛Key must be 128, 192, or 256 bytesCBC/CFB/OFB/CTR 模式下 IV 必填且必须为 16 字节否则抛IV must be 128 bytesECB/GCM 模式不需要 IVnopadding时明文必须是 128 位16 字节的整数倍否则抛错。GCM 模式的特殊行为加密时若检测到 AAD会将其注入 forge cipher 的additionalData密文输出后还会追加认证标签返回格式为${密文}\nTag:${标签}见 aes.ts。解密时需通过tag参数传入标签const result aes.encode({ src: hello, key: key, iv: iv, mode: gcm, outputEncode: hex }); // result 形如: hex密文\nTag:hex标签 const [ct, tag] result.split(\nTag:); const plain aes.decode({ src: ct, key: key, iv: iv, mode: gcm, tag: tag, inputEncode: hex, outputEncode: utf8 });4.3 DES / 3DES / RC4 / RabbitCryptoJS 实现仓库还保留了一份基于 CryptoJS 的_aes实现crypto.ts主要提供 DES/3DES/RC4 等算法import { des, tripleDes, rc4, rabbit } from zy/crypto; des.encode({ src: hello, key: 12345678, iv: 12345678, mode: cbc });各算法的长度校验规则如下源码中均有throw new Error强校验算法密钥长度IV 长度说明DES8 字节8 字节ECB 可省Key must be 64 bytes3DES24 字节8 字节ECB 可省Key must be 192 bytesRC4任意非空无流密码密钥为空抛错RC4Drop任意非空无额外参数drop默认 192须为非负整数丢弃初始密钥流Rabbit16 字节0/8 字节Key must be 128 bytesIV 若提供须 8 字节RabbitLegacy16 字节0/8 字节旧版 Rabbit忽略 IV 参与运算RC4/Rabbit 解密需要先用CryptoJS.lib.CipherParams.create({ ciphertext })包装密文再调用对应的decrypt。注意源码注释提示 DES/3DES/Rabbit 对中文非 ASCII兼容性不佳涉及中文文本时建议改用 AES 或 SM4。4.4 SM4 国密算法sm-crypto-v2 实现import { sm4 } from zy/crypto; sm4.encode({ src: hello, key: 1234567890123456, iv: 1234567890123456, mode: cbc });SM4 是国密分组密码仓库使用sm-crypto-v2实现sm.ts支持ecb/cbc/gcm三种模式填充支持pkcs#7即 pkcs5/7与none。约束密钥必须为 16 字节Key must be 128 bytes非 ECB 模式下 IV 必须为 16 字节GCM 模式同样会输出\nTag:标签后缀。五、RSA 非对称加密node-forge 实现5.1 基本用法import { rsa } from zy/crypto; rsa.encode({ src: hello, key: -----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----, pad: rsaes-pkcs1-v1_5, outputEncode: hex, });5.2 参数详解参数说明默认值keyPEM 格式密钥公钥必须以-----BEGIN PUBLIC KEY-----开头私钥支持RSA PRIVATE KEY/ENCRYPTED PRIVATE KEY等形式必填pad填充方案rsaes-pkcs1-v1_5默认、rsaes-oaep-sha1OAEP默认 SHA-1、nopaddingrsaes-pkcs1-v1_5type0公钥加密/私钥解密标准用法1私钥加密/公钥解密非标0long是否分块处理超长文本falselongBlock分块大小数字或auto自动按填充方案计算最大块长如 PKCS1 v1.5 为keySizeBytes - 11117passphrase加密私钥的解密口令passphraseEncode/inputEncode/outputEncode各类编码utf8/utf8/base64实现细节rsa.ts密钥解析用正则校验 PEM 头加密私钥需先经forge.pki.decryptRsaPrivateKey配合 passphrase 解密OAEP 的哈希算法从pad名中解析如rsa-oaep-sha256支持 md5/sha1/sha256/sha384/sha512nopadding模式直接对BigInteger做modPow(e, n)并手动实现 PKCS#1 v1.5 的00||01||PS(FF..)||00||Data私钥加密填充公钥加密不支持 OAEP 之外的私钥签名场景、私钥加密不支持 OAEP均有对应抛错。注意事项RSA 密文长度等于密钥长度如 1024 位密钥产生 128 字节密文单次能加密的明文长度受填充方案限制超长文本必须开启long: true分块。六、编码与压缩Base64 / Unicode / HTML / Gzip / URL / Hex编码工具集中在 encode.ts多数方法的inputEncode/outputEncode默认utf8。6.1 Base64import { base64, unicode, html, gzip, url, hex } from zy/crypto; base64.encode({ src: hello }); // aGVsbG8 base64.decode({ src: aGVsbG8 });内部基于 CryptoJSenc.Base64实现。额外提供浏览器语义的btoa/atob方法btoa要求输入为 Latin-1 编码非 Latin-1 时默认抛Input string must be Latin-1 encoded for btoa可通过ignore: true跳过检查。6.2 Unicodeunicode.encode({ src: hello }); // 默认 prefix \u、pad 4、encodeEverything true参数prefix\u/%u/U默认\u、pad补零位数默认 4、encodeEverything默认true为false时仅编码charCodeAt 127的字符。解码按 prefix 匹配对应正则\\u/%u/U。6.3 HTML 实体编解码html.encode({ src: bbold/b }); // 基于 he 库默认 encodeEverything true、named 实体entities支持named默认输出amp;风格命名实体、hex#x66;风格、numeric十进制#100;风格encodeEverything: false时只转义必要字符。6.4 Gzip 压缩/解压gzip.encode({ src: hello }); // 基于 fflate.gzipSync输出默认 base64 gzip.decode({ src: H4sI... });压缩使用fflate.gzipSync无运行时依赖、体积小输入/输出编码均可配置压缩输出默认base64解压输入默认base64、输出默认utf8解压失败会抛Not a valid Gzip string。6.5 URL 编码url.encode({ src: https://example.com?qhello });type参数component默认encodeURIComponent空格变%20或uriencodeURI保留://等结构字符。6.6 Hexhex.encode({ src: hello });delimiter决定字节间的分隔样式通过HEX_DELIMITER_MAPencode.ts映射none默认连续输出、space、comma、semiColon、colon、lineFeed、crlf、0x0x前缀、0xComma、percent%前缀、\x\x前缀。解码时会先按规则剥离前缀/后缀并校验十六进制串长度为偶数否则抛String length must be even。七、附加能力base 工具集除 README 明确列出的模块外入口还导出了base工具集base.ts包含三类实用函数randomUUID()基于uuidv4 生成随机 UUIDrandomNanoid(len?)生成自定义长度默认 21的 URL 安全随机串generateStrUUID(value, namespace?, version?)按 RFC-4122 生成基于名称的 UUID v3MD5或 v5SHA-1默认命名空间非法时回退全零命名空间。八、在 zyfun 中的应用与前端 Worker 实践zy/crypto并非孤立的示例包它被 zyfun 主进程与渲染进程广泛引用。渲染进程实验室-加解密页面通过 Web Worker 封装加解密调用encrypt.worker.ts模式如下import { aes, des, rabbit, rabbitLegacy, rc4, rc4Drop, rsa, sm4, tripleDes } from zy/crypto; import workerpool from workerpool; export type CryptoAction rsa | rc4 | rc4Drop | aes | des | tripleDes | rabbit | rabbitLegacy | sm4; export type CryptoExecute encode | decode; const METHOD_MAP { rsa, rc4, rc4Drop, aes, des, tripleDes, rabbit, rabbitLegacy, sm4 }; const main (action: CryptoAction, execute: CryptoExecute, doc: Recordstring, any): string { const method METHOD_MAP[action]?.[execute]; return method(doc); }; workerpool.worker({ main });同一模式也出现在hash.worker.ts与encode.worker.tsexample/src/workers配合useWorkerPoolhook 将耗时计算移出主线程避免界面卡顿。读者可在仓库中直接运行 packages/crypto/example一个基于 React Vite 的演示应用含hash-panel.tsx、encrypt-panel.tsx、encode-panel.tsx三个面板直观验证各算法在不同参数组合下的输入输出。九、速查全部模块一览模块说明底层实现hash12 种哈希MD5-16/32、SHA1/224/256/3/384/512、SHA512-224/256、RIPEMD160、SM3crypto-js node-forge sm-crypto-v2hmac与 hash 对应的 12 种 HMAC同上aesAES 加解密支持 CBC/CFB/OFB/CTR/ECB/GCM 与 AADnode-forgedes/tripleDesDES/3DES 加解密crypto-jsrc4/rc4DropRC4 及 RC4-Drop 流密码crypto-jsrabbit/rabbitLegacyRabbit 流密码及旧版crypto-jsrsaRSA 加解密支持 PKCS1 v1.5 / OAEP / 无填充与长文本分块node-forgesm4国密 SM4支持 ECB/CBC/GCMsm-crypto-v2base64Base64 编解码 btoa/atobcrypto-jsunicodeUnicode 编解码\u / %u / U自实现htmlHTML 实体编解码named/hex/numerichegzipGzip 压缩/解压fflateurlURL 编解码component / uri原生 APIhexHex 编解码11 种分隔符样式crypto-js十、最佳实践与注意事项密钥与 IV 长度严格受限AES 128/192/256、DES 8、3DES 24、Rabbit 16、SM4 16 字节不符合会直接抛错配置参数前务必按目标算法的长度要求生成密钥。GCM 标签要妥善保存AES/SM4 的 GCM 模式返回密文\nTag:标签复合字符串解密时必须回传tag参数否则无法完成认证与解密。中文与流密码兼容性源码注释明确提示 DES/3DES/Rabbit 与部分在线工具对中文支持不佳处理非 ASCII 文本优先选择 AES-CBC/PKCS7 或 SM4。RSA 长文本分块超过单块上限PKCS1 v1.5 约密钥字节 - 11的明文务必开启long: true并可通过longBlock微调块大小。编码参数统一outputEncode对加密/哈希模块仅接受hex/base64inputEncode支持 utf8/utf16/utf16be/utf16le/hex/base64/latin1 全系列跨端Node/Web/Worker共享同一套类型定义规避了不同运行时原生 API 的差异。赞分享桌面应用音视频即时通讯【免费下载链接】zyfun跨平台桌面端视频资源播放器,免费高颜值.项目地址https://gitcode.com/gh_mirrors/zy/zyfun点击查看免费下载相关推荐终极移动端加密完全指南对称加密、非对称加密与密钥管理最佳实践终极移动端加密完全指南对称加密、非对称加密与密钥管理最佳实践 移动端应用开发中数据安全是用户信任的基石。GitHub 加速计划 / an / android文档教程移动开发从0到1开发Rust文本编辑器基于winit的界面架构设计从0到1开发Rust文本编辑器基于winit的界面架构设计 你是否曾想过打造一款属于自己的文本编辑器却被复杂的跨平台界面开发劝退本文将带你基于纯Rust窗密码学网络通信深度解析wangEditor-next基于Slate.js的现代化富文本编辑器架构设计与性能优化实战深度解析wangEditor next基于Slate.js的现代化富文本编辑器架构设计与性能优化实战 wangEditor next作为新一代开源富文本编辑器前端富文本上一篇深度解析 | 如何用LoveIwara打造极致二次元内容体验下一篇cangjie-skill 阶段 4 压力测试实战用 darwin 兼容的 test-prompts.json 守住 Agent Skill 的调用精准度创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考