4.3 KiB
4.3 KiB
starcrypto
starcrypto 是一个 Go 单包聚合风格的密码学工具库:根包可直接调用,同时内部拆分为子包实现,兼顾易用性与可维护性。
安装
go get b612.me/starcrypto
特性
- 根包直调 + 子包分层(
asymm/symm/hashx/encodingx/paddingx等) - 对称算法:AES、SM4、DES、3DES、ChaCha20、ChaCha20-Poly1305
- AEAD:AES-GCM/AES-CCM、SM4-GCM/SM4-CCM、ChaCha20-Poly1305
- 存储加密:AES-XTS、SM4-XTS(双 key,支持 data unit 索引与流式)
- 非对称算法:RSA、ECDSA、SM2、SM9
- 哈希与消息认证:SHA 系列、MD5/MD4、RIPEMD160、SM3、CRC32/CRC32A、HMAC
- 支持内存
[]byte与流式io.Reader/io.Writer
推荐用法(安全优先)
- 通用数据传输优先使用 AEAD:
EncryptAesGCM/DecryptAesGCMEncryptAesCCM/DecryptAesCCMEncryptSM4GCM/DecryptSM4GCMEncryptSM4CCM/DecryptSM4CCMEncryptChaCha20Poly1305/DecryptChaCha20Poly1305
- 磁盘/扇区类场景可用 XTS:
EncryptAesXTS/DecryptAesXTSEncryptSM4XTS/DecryptSM4XTS
- 统一选项接口(默认
GCM):EncryptAesWithOptions/DecryptAesWithOptionsEncryptSM4WithOptions/DecryptSM4WithOptions
CBC/CFB/OFB/CTR/ECB/XTS不提供完整性校验,不能替代 AEAD 的篡改检测能力。 AEAD (GCM/CCM/ChaCha20-Poly1305) 下,同一把 key 绝不能重复使用同一个 nonce。 使用CipherOptions时,AEAD 模式仅读取Nonce字段,不再回退IV。 GCM/CCM 流解密在 legacy 兼容分支会缓冲完整密文到内存;大文件建议使用分块流格式(带SCG1/SCC1头)。
XTS 约束(重要)
- 两个密钥分开传入:
key1,key2,且长度必须相同且非空。 dataUnitSize(数据单元大小)由调用方自定义,但必须是正整数且为16的倍数。dataUnitIndex必须与存储层的逻辑块映射保持稳定一致;同一数据单元在加密和解密时索引必须一致。- 当前实现不做 CTS(ciphertext stealing)。
- 非流式 API:输入长度必须满足
len(data) % 16 == 0,否则直接返回错误。 - 流式 API:最终尾块若不是
16字节对齐会返回错误。
文件随机填充
FillWithRandom使用math/rand伪随机,速度更高,但不适合安全用途。FillWithCryptoRandom使用crypto/rand,安全性更高,但速度可能受限。
快速示例
统一 Options(默认 GCM)
package main
import (
"fmt"
"log"
"b612.me/starcrypto"
)
func main() {
key := []byte("0123456789abcdef")
nonce := []byte("123456789012")
plain := []byte("hello starcrypto")
opts := &starcrypto.CipherOptions{Nonce: nonce}
enc, err := starcrypto.EncryptAesWithOptions(plain, key, opts)
if err != nil {
log.Fatal(err)
}
dec, err := starcrypto.DecryptAesWithOptions(enc, key, opts)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(dec))
}
AES-XTS(按 data unit)
package main
import (
"bytes"
"log"
"b612.me/starcrypto"
)
func main() {
k1 := []byte("0123456789abcdef")
k2 := []byte("fedcba9876543210")
plain := bytes.Repeat([]byte("0123456789abcdef"), 8) // 128 bytes, 16-byte aligned
// 每个 data unit 64 字节
enc, err := starcrypto.EncryptAesXTS(plain, k1, k2, 64)
if err != nil {
log.Fatal(err)
}
dec, err := starcrypto.DecryptAesXTS(enc, k1, k2, 64)
if err != nil {
log.Fatal(err)
}
_ = dec
}
算法能力矩阵
| 算法 | 模式 / 方案 | AEAD | Stream | 建议 |
|---|---|---|---|---|
| AES | ECB/CBC/CFB/OFB/CTR/GCM/CCM/XTS | GCM/CCM: 是;XTS: 否 | 是 | 生产优先 GCM/CCM;存储场景可用 XTS |
| SM4 | ECB/CBC/CFB/OFB/CTR/GCM/CCM/XTS | GCM/CCM: 是;XTS: 否 | 是 | 生产优先 GCM/CCM;存储场景可用 XTS |
| ChaCha20 | ChaCha20 / ChaCha20-Poly1305 | Poly1305: 是 | ChaCha20: 是 | 生产优先 ChaCha20-Poly1305 |
| DES | CBC | 否 | 是 | 仅兼容历史系统 |
| 3DES | CBC | 否 | 是 | 仅兼容历史系统 |
默认填充策略
- AES/SM4 的 CBC/ECB 默认:
PKCS7 - DES/3DES 的 CBC 默认:
PKCS5 - CFB/OFB/CTR/GCM/CCM/XTS/ChaCha20 不使用填充
兼容性说明
库中保留了部分历史/兼容用途算法与接口(例如 ECB、DES/3DES)。如无兼容要求,建议优先使用 AEAD 方案。
许可证
本项目使用 Apache-2.0 许可证,详见 LICENSE。