# 加密解密 API
**本文档引用的文件**
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
本项目是一个基于 SM4 对称加密算法的 JavaScript 加密解密工具包。该工具包提供了完整的加密解密功能,支持 ECB 和 CBC 两种加密模式,内置 Base64 编解码处理,并集成了 HTTP 请求加密传输功能。系统采用模块化设计,通过 TsCrypto 类封装 SM4 加密算法,通过 TsSM4 类实现具体的 SM4 算法逻辑,通过 TsHttpUtil 类实现 HTTP 请求的自动加密功能。
## 项目结构
该项目采用模块化组织结构,主要包含以下核心模块:
```mermaid
graph TB
subgraph "核心模块"
Crypto[TsCrypto.js
加密器封装]
SM4[TsSM4.js
SM4算法实现]
Config[TsGlobalConfig.js
全局配置]
end
subgraph "工具模块"
Http[TsHttpUtil.js
HTTP请求工具]
Storage[TsStorage.js
本地存储]
Common[TsCommon.js
通用工具]
end
subgraph "外部依赖"
Base64[base64-js
Base64编解码]
UmiRequest[umi-request
HTTP请求库]
end
Crypto --> SM4
Crypto --> Config
Http --> Crypto
Http --> Storage
Http --> Config
SM4 --> Base64
Http --> UmiRequest
```
**图表来源**
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
## 核心组件
### TsCrypto 加密器
TsCrypto 是整个加密系统的核心封装类,负责提供简化的加密解密接口。它内部使用 TsSM4 类来执行实际的加密解密操作。
**主要特性:**
- 基于 SM4 算法的对称加密
- 内置 Base64 编解码处理
- 支持 ECB 和 CBC 模式配置
- 自动密钥管理
**章节来源**
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
### TsSM4 SM4 算法实现
TsSM4 类实现了完整的 SM4 对称加密算法,包括密钥扩展、加密轮函数、填充和去填充等功能。
**核心功能:**
- 完整的 SM4 算法实现
- 支持 ECB 和 CBC 两种模式
- 自动填充和去填充机制
- Base64 和文本两种输出格式
**章节来源**
- [TsSM4.js:96-456](file://src/utils/TsSM4.js#L96-L456)
### TsGlobalConfig 全局配置
提供全局配置管理功能,支持动态设置和获取加密密钥、HTTP 前缀等配置项。
**配置选项:**
- base64Key: Base64 编码的密钥字符串
- prefix: HTTP 请求前缀
- onHttpError: HTTP 错误回调函数
- httpParams: HTTP 参数处理函数
**章节来源**
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
## 架构概览
系统采用分层架构设计,从上到下分为应用层、工具层、算法层和依赖层:
```mermaid
graph TB
subgraph "应用层"
App[业务应用]
end
subgraph "工具层"
HttpUtil[TsHttpUtil
HTTP请求工具]
Crypto[TsCrypto
加密器]
Storage[TsStorage
存储工具]
end
subgraph "算法层"
SM4[TsSM4
SM4算法]
Crypt[TsCrypt
编解码工具]
end
subgraph "依赖层"
Base64[base64-js]
UmiRequest[umi-request]
end
App --> HttpUtil
App --> Crypto
HttpUtil --> Crypto
Crypto --> SM4
SM4 --> Crypt
SM4 --> Base64
HttpUtil --> UmiRequest
```
**图表来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
## 详细组件分析
### TsCrypto 类详细分析
TsCrypto 类提供了简洁的加密解密接口,内部封装了复杂的加密细节。
#### 类结构图
```mermaid
classDiagram
class TsCrypto {
-sm4 : SM4
+constructor()
+encrypt(content) : string
+decrypt(base64) : string
}
class SM4 {
-key : Uint8Array
-iv : Uint8Array
-mode : string
-cipherType : string
-encryptRoundKeys : Uint32Array
-decryptRoundKeys : Uint32Array
+constructor(config)
+encrypt(plaintext) : string
+decrypt(ciphertext) : string
}
class Crypt {
+stringToArrayBufferInUtf8(str) : Uint8Array
+utf8ArrayBufferToString(buffer) : string
+arrayBufferToBase64(buffer) : string
+base64ToArrayBuffer(base64) : Uint8Array
}
TsCrypto --> SM4 : "组合"
SM4 --> Crypt : "使用"
```
**图表来源**
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsSM4.js:96-456](file://src/utils/TsSM4.js#L96-L456)
#### 加密流程序列图
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Crypto as "TsCrypto"
participant SM4 as "TsSM4"
participant Crypt as "Crypt"
Client->>Crypto : encrypt(明文)
Crypto->>SM4 : encrypt(明文)
SM4->>Crypt : stringToArrayBufferInUtf8(明文)
Crypt-->>SM4 : Uint8Array
SM4->>SM4 : padding(填充)
SM4->>SM4 : doBlockCrypt(加密块)
SM4->>Crypt : arrayBufferToBase64(密文)
Crypt-->>SM4 : Base64字符串
SM4-->>Crypto : Base64密文
Crypto-->>Client : 返回密文
```
**图表来源**
- [TsCrypto.js:19-21](file://src/utils/TsCrypto.js#L19-L21)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
**章节来源**
- [TsCrypto.js:15-30](file://src/utils/TsCrypto.js#L15-L30)
### TsSM4 类详细分析
TsSM4 类实现了完整的 SM4 算法,包括密钥扩展、加密轮函数和填充机制。
#### 算法流程图
```mermaid
flowchart TD
Start([开始加密]) --> ValidateKey["验证密钥长度(16字节)"]
ValidateKey --> CheckMode{"检查加密模式"}
CheckMode --> |CBC| InitIV["初始化IV(16字节)"]
CheckMode --> |ECB| NoIV["无IV模式"]
InitIV --> PadData["数据填充(PKCS7)"]
NoIV --> PadData
PadData --> SplitBlocks["分割为16字节块"]
SplitBlocks --> EncryptLoop{"遍历每个数据块"}
EncryptLoop --> |CBC模式| CBCProcess["CBC处理:
异或链+加密"]
EncryptLoop --> |ECB模式| ECBProcess["ECB处理:
直接加密"]
CBCProcess --> NextBlock{"还有下一个块?"}
ECBProcess --> NextBlock
NextBlock --> |是| EncryptLoop
NextBlock --> |否| EncodeOutput["编码输出(Base64)"]
EncodeOutput --> End([结束])
```
**图表来源**
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsSM4.js:343-378](file://src/utils/TsSM4.js#L343-L378)
#### 关键算法实现
**密钥扩展算法:**
- 使用 FK 常量和 CK 数组
- 生成 32 轮加密密钥
- 每轮密钥长度 32 位
**加密轮函数:**
- 实现 τ 变换和线性变换
- 包含 S 盒替换
- 支持 32 轮加密
**填充机制:**
- 使用 PKCS7 填充标准
- 自动处理任意长度数据
- 支持去填充操作
**章节来源**
- [TsSM4.js:189-207](file://src/utils/TsSM4.js#L189-L207)
- [TsSM4.js:250-278](file://src/utils/TsSM4.js#L250-L278)
- [TsSM4.js:287-312](file://src/utils/TsSM4.js#L287-L312)
### HTTP 加密传输集成
TsHttpUtil 类集成了加密功能,实现了 HTTP 请求的自动加密传输。
#### 加密传输流程
```mermaid
sequenceDiagram
participant App as "应用"
participant HttpUtil as "TsHttpUtil"
participant Crypto as "TsCrypto"
participant Server as "服务器"
App->>HttpUtil : post(url, data)
HttpUtil->>HttpUtil : dealParamsBody()
HttpUtil->>HttpUtil : 检查是否启用加密
HttpUtil->>Crypto : encrypt(JSON.stringify(data))
Crypto-->>HttpUtil : Base64密文
HttpUtil->>Server : POST /api/data {encryptData : 密文}
Server-->>HttpUtil : {code : 200, data : 明文}
HttpUtil->>HttpUtil : 检查响应是否加密
HttpUtil->>Crypto : decrypt(响应数据)
Crypto-->>HttpUtil : 明文数据
HttpUtil-->>App : 返回解析后的数据
```
**图表来源**
- [TsHttpUtil.js:82-87](file://src/https/TsHttpUtil.js#L82-L87)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
**章节来源**
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
## 依赖关系分析
### 外部依赖
项目的主要外部依赖包括:
| 依赖包 | 版本 | 用途 |
|--------|------|------|
| base64-js | 1.5.1 | Base64 编解码处理 |
| umi-request | 1.4.0 | HTTP 请求库 |
### 内部模块依赖
```mermaid
graph LR
index[index.js
入口文件] --> TsCrypto[TsCrypto.js]
index --> TsSM4[TsSM4.js]
index --> TsGlobalConfig[TsGlobalConfig.js]
index --> TsHttpUtil[TsHttpUtil.js]
TsCrypto --> TsSM4
TsCrypto --> TsGlobalConfig
TsHttpUtil --> TsCrypto
TsHttpUtil --> TsStorage
TsHttpUtil --> TsCommon
TsHttpUtil --> TsGlobalConfig
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-16](file://index.js#L1-L16)
## 性能考虑
### 加密性能优化
1. **内存管理**:
- 使用 TypedArray 进行高效的数据处理
- 避免不必要的数据拷贝
- 合理使用缓冲区复用
2. **算法优化**:
- 采用 32 位整数运算提高性能
- 使用预计算的 S 盒表
- 优化循环结构减少开销
3. **I/O 优化**:
- Base64 编解码使用高效的库实现
- 批量处理数据块避免频繁调用
### 安全性最佳实践
1. **密钥管理**:
- 密钥必须为 16 字节长度
- 建议使用安全的随机数生成器
- 定期更换密钥
2. **模式选择**:
- CBC 模式提供更好的安全性
- ECB 模式仅适用于相同明文的场景
- IV 必须随机且唯一
3. **填充安全**:
- 使用标准的 PKCS7 填充
- 验证去填充结果的有效性
## 故障排除指南
### 常见错误及解决方案
**密钥长度错误**
- 错误信息:`key should be a 16 bytes string`
- 解决方案:确保密钥为 16 字节长度的 Base64 编码
**IV 初始化错误**
- 错误信息:`iv error`
- 解决方案:在 CBC 模式下提供 16 字节长度的 IV
**数据解密失败**
- 可能原因:密钥不匹配、数据损坏
- 解决方案:验证密钥正确性,检查数据完整性
**Base64 编码问题**
- 可能原因:输入数据格式不正确
- 解决方案:确保输入为有效的字符串或 Buffer
### 调试技巧
1. **启用开发模式**:
```javascript
// 在开发环境中启用详细日志
const isDev = TsCommon.isDevelopment();
```
2. **验证加密结果**:
```javascript
const original = "测试数据";
const encrypted = TsCrypto.encrypt(original);
const decrypted = TsCrypto.decrypt(encrypted);
console.assert(original === decrypted, "加密解密结果不匹配");
```
**章节来源**
- [TsSM4.js:103-105](file://src/utils/TsSM4.js#L103-L105)
- [TsSM4.js:119-121](file://src/utils/TsSM4.js#L119-L121)
- [TsSM4.js:346](file://src/utils/TsSM4.js#L346)
## 结论
本加密解密模块提供了完整的 SM4 对称加密解决方案,具有以下特点:
1. **功能完整**:支持 ECB 和 CBC 两种加密模式,提供 Base64 编解码
2. **易于使用**:提供简洁的 API 接口,便于集成到现有项目中
3. **安全可靠**:采用标准的 SM4 算法和 PKCS7 填充机制
4. **性能优化**:使用高效的 TypedArray 和优化的算法实现
该模块特别适合需要数据加密传输和存储的应用场景,如 API 数据传输、用户敏感信息存储等。通过合理的配置和使用,可以有效提升应用程序的安全性。