# easy-cryptography
**Repository Path**: yang37/easy-cryptography
## Basic Information
- **Project Name**: easy-cryptography
- **Description**: [easy-cryptography] 密码学相关Java工具类(含测试用例),eg.CFCA双证书请求文件生成与解析、SM2公私钥加载(PKCS#1/PKCS#8)、SM2私钥D值解析、SM2公钥XY值解析、SM2签名raw/der转换、SM4加密解密ECB/CBC|PKCS#5/PKCS#7/ZERO)等。
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 19
- **Forks**: 11
- **Created**: 2024-07-10
- **Last Updated**: 2026-08-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Java, 计算机密码学, sm2, sm4
## README

# 1.背景
> 注意,出于业内规范,你应该首先考虑对接硬件加密机(秘钥安全)。
发现网上关于加解密、数字信封这块相关的资料比较少,博客里面断断续续的会有人讨论,特此新建仓库。
- 给需要用到的人一份demo代码
- 整理自己这一块的知识点

相关标准,请参考:[密码行业标准化技术委员会-标准列表](http://www.gmbz.org.cn/main/bzlb.html?from=groupmessage)
# 2.项目结构
项目呢是为了精简,所以在刻意避免使用各种花里胡哨的代码,你结合自己的实际情况修改即可。
例如:
- 对象是否能复用
- 部分变量是否能提取成常量
- ...
嗯,我写这段话,就是希望你不要直接抄我的代码,这只是个demo项目。
**拉取项目后,关注test文件夹中的各个测试类。**

idea中,在对应的Class按下`ctrl + shift + t`,即可跳转到对应的测试类。

# 3.功能点(已完成)
| 序号 | 类型 | 分类 | 描述 | 文档 | 代码 | 测试类 |
| ---- | ---- | ---------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 1 | SM2 | CFCA-SM2双证书申请及下载规范 | 双证请求文件生成 | [docs/SM2-双证书请求文件.md](docs/SM2-双证书请求文件.md) | [src/main/java/cn/yang37/sm/DoubleCsrRequest.java](src/main/java/cn/yang37/sm/DoubleCsrRequest.java) | [src/test/java/cn/yang37/sm/DoubleCsrRequestTest.java](src/test/java/cn/yang37/sm/DoubleCsrRequestTest.java) |
| 2 | SM2 | CFCA-SM2双证书申请及下载规范 | 双证响应文件解析(解密xx_SM2_PrivateKey.key) | [docs/SM2-双证书请求文件.md](docs/SM2-双证书请求文件.md) | [src/main/java/cn/yang37/sm/DoubleCsrResultUtils.java](src/main/java/cn/yang37/sm/DoubleCsrResultUtils.java) | [src/test/java/cn/yang37/sm/DoubleCsrResultUtilsTest.java](src/test/java/cn/yang37/sm/DoubleCsrResultUtilsTest.java) |
| 3 | SM2 | 秘钥加载与转换 | 加载PKCS#1格式私钥
加载PKCS#8格式私钥
加载PKCS#8格式公钥
私钥D值
公钥X+Y值
| [docs/SM2-秘钥加载、生成与转换.md](docs/SM2-秘钥加载、生成与转换.md) | [src/main/java/cn/yang37/sm/SM2KeyUtils.java](src/main/java/cn/yang37/sm/SM2KeyUtils.java) | [src/test/java/cn/yang37/sm/SM2KeyUtilsTest.java](src/test/java/cn/yang37/sm/SM2KeyUtilsTest.java) |
| 4 | SM2 | 签名与验签 | 计算raw格式签名
计算der格式签名
计算raw格式签名(传入userId)
计算der格式签名(传入userId) | [docs/SM2-裸签名与der签名转换.md](docs/SM2-裸签名与der签名转换.md) | [src/main/java/cn/yang37/sm/SM2SignUtils.java](src/main/java/cn/yang37/sm/SM2SignUtils.java)
[src/main/java/cn/yang37/sm/SM2SignWithUserIdUtils.java](src/main/java/cn/yang37/sm/SM2SignWithUserIdUtils.java) | [src/test/java/cn/yang37/sm/SM2SignUtilsTest.java](src/test/java/cn/yang37/sm/SM2SignUtilsTest.java)
[src/test/java/cn/yang37/sm/SM2SignWithUserIdUtilsTest.java](src/test/java/cn/yang37/sm/SM2SignWithUserIdUtilsTest.java) |
| 5 | SM2 | 签名格式转换 | 裸签名(raw)与der签名转换 | [docs/SM2-裸签名与der签名转换.md](docs/SM2-裸签名与der签名转换.md) | [src/main/java/cn/yang37/sm/SM2SignRaw2DerUtils.java](src/main/java/cn/yang37/sm/SM2SignRaw2DerUtils.java) | [src/test/java/cn/yang37/sm/SM2SignRaw2DerUtilsTest.java](src/test/java/cn/yang37/sm/SM2SignRaw2DerUtilsTest.java) |
| 6 | SM2 | 加密与解密 | 公钥加密C1C2C3
公钥加密C1C3C2
私钥解密C1C2C3
私钥解密C1C3C2
公钥加密C1C2C3(结果移除04)
公钥加密C1C3C2(结果移除04)
私钥解密C1C2C3(源数据补充04)
私钥解密C1C3C2(源数据补充04)
| [docs/SM2-加密与解密.md](docs/SM2-加密与解密.md) | [src/main/java/cn/yang37/sm/SM2EncryptUtils.java](src/main/java/cn/yang37/sm/SM2EncryptUtils.java) | [src/test/java/cn/yang37/sm/SM2EncryptUtilsTest.java](src/test/java/cn/yang37/sm/SM2EncryptUtilsTest.java) |
| 7 | SM3 | 密码杂凑算法 | 计算 SM3 摘要
支持 Hex/Base64 编码 | [docs/SM3-国密哈希函数.md](docs/SM3-国密哈希函数.md) | [src/main/java/cn/yang37/sm/SM3HashUtils.java](src/main/java/cn/yang37/sm/SM3HashUtils.java) | [src/test/java/cn/yang37/sm/SM3HashUtilsTest.java](src/test/java/cn/yang37/sm/SM3HashUtilsTest.java) |
| 8 | SM4 | 秘钥生成 | 生成SM4秘钥(byteArr)
生成SM4秘钥(hex)
生成SM4秘钥(base64) | [docs/SM4-秘钥格式与加密与解密.md](docs/SM4-秘钥格式与加密与解密.md) | [src/main/java/cn/yang37/sm/SM4KeyUtils.java](src/main/java/cn/yang37/sm/SM4KeyUtils.java) | [src/test/java/cn/yang37/sm/SM4KeyUtilsTest.java](src/test/java/cn/yang37/sm/SM4KeyUtilsTest.java) |
| 9 | SM4 | 加密与解密 | ECB/PKCS5(加密/解密)
ECB/PKCS7(加密/解密)
ECB/Zero(加密/解密)
CBC/PKCS5(加密/解密)
CBC/PKCS75(加密/解密)
CBC/Zero(加密/解密)
| [docs/SM4-秘钥格式与加密与解密.md](docs/SM4-秘钥格式与加密与解密.md) | [src/main/java/cn/yang37/sm/SM4EncryptUtils.java](src/main/java/cn/yang37/sm/SM4EncryptUtils.java) | [src/test/java/cn/yang37/sm/SM4EncryptUtilsTest.java](src/test/java/cn/yang37/sm/SM4EncryptUtilsTest.java) |
| 10 | 数字信封 | SM2+SM4 数字信封 | 生成数字信封
解密数字信封
支持 Hex/Base64 编码 | [docs/SM2、SM4-国密数字信封.md](docs/SM2、SM4-国密数字信封.md) | [src/main/java/cn/yang37/sm/SMDigitalEnvelopeUtils.java](src/main/java/cn/yang37/sm/SMDigitalEnvelopeUtils.java) | [src/test/java/cn/yang37/sm/SMDigitalEnvelopeUtilsTest.java](src/test/java/cn/yang37/sm/SMDigitalEnvelopeUtilsTest.java) |
| 11 | 证书 | pem与der格式转换 | pem格式转为der
der格式转为pem | [docs/cert-证书的pem和der格式.md](docs/cert-证书的pem和der格式.md) | [src/main/java/cn/yang37/utils/DerAndPemUtils.java](src/main/java/cn/yang37/utils/DerAndPemUtils.java) | [src/test/java/cn/yang37/utils/DerAndPemUtilsTest.java](src/test/java/cn/yang37/utils/DerAndPemUtilsTest.java) |
| 12 | 证书 | 证书验证 | 验证证书有效期
验证证书签名
验证证书链
检查自签名
验证 KeyUsage | [docs/cert-证书验证.md](docs/cert-证书验证.md) | [src/main/java/cn/yang37/utils/CertUtils.java](src/main/java/cn/yang37/utils/CertUtils.java) | [src/test/java/cn/yang37/utils/CertUtilsTest.java](src/test/java/cn/yang37/utils/CertUtilsTest.java) |
| 13 | ECDH | 椭圆曲线密钥交换 | 生成 ECDH 密钥对
支持 P256/P384/P521 曲线
执行密钥交换
支持 Hex/Base64 编码 | [docs/ECDH-椭圆曲线密钥交换.md](docs/ECDH-椭圆曲线密钥交换.md) | [src/main/java/cn/yang37/utils/ECDHKeyUtils.java](src/main/java/cn/yang37/utils/ECDHKeyUtils.java)
[src/main/java/cn/yang37/utils/ECDHAgreement.java](src/main/java/cn/yang37/utils/ECDHAgreement.java) | [src/test/java/cn/yang37/utils/ECDHTest.java](src/test/java/cn/yang37/utils/ECDHTest.java) |
# 4.待实现
- ...
# 5.其他