# loong-crypto
**Repository Path**: for-in/loong-crypto
## Basic Information
- **Project Name**: loong-crypto
- **Description**: Loong-Crypto 支持多种国际算法密码运算,支持SM2,SM3,SM4商用密码算法,简化密码服务开发。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2023-04-24
- **Last Updated**: 2023-04-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Loong-Crypto - 简化密码服务开发
项目介绍
-------------------------------------
Loong-Crypto 支持多种国际算法密码运算,支持SM2,SM3,SM4商用密码算法,简化密码服务开发。
支持的算法
-----
* KeyAlgorithm
* AES
* Blowfish
* DES
* DESede
* HmacMD5
* HmacSHA1
* HmacSHA224
* HmacSHA256
* HmacSHA384
* HmacSHA512
* RC2
* RC4
* SM4
* KeyPairAlgorithm
* DSA
* ECDSA
* RSA
* SM2
* MessageDigestAlgorithm
* MD2
* MD4
* MD5
* SHA-1
* SHA-224
* SHA-256
* SHA-384
* SHA-512
* SM3
* HmacAlgorithm
* HmacMD5
* HmacSHA1
* HmacSHA224
* HmacSHA256
* HmacSHA384
* HmacSHA512
* HmacSM3
* Cipher (Encryption) algorithm
* AES
* AESWrap
* ARCFOUR
* Blowfish
* CCM
* DES
* DESede
* DESedeWrap
* ECIES
* GCM
* RC2
* RC4
* RC5
* RSA
* SM2
* SM4
* EncryptionMethod
* AES/ECB/NoPadding
* AES/CBC/NoPadding
* AES/CFB/NoPadding
* AES/OFB/NoPadding
* AES/ECB/PKCS5Padding
* AES/CBC/PKCS5Padding
* RC2/CBC/PKCS5Padding
* RC4/ECB/PKCS5Padding
* DES/ECB/PKCS5Padding
* DES/CBC/PKCS5Padding
* DESede/ECB/NoPadding
* DESede/ECB/PKCS5Padding
* DESede/ECB/PKCS7Padding
* DESede/CBC/NoPadding
* DESede/CBC/PKCS5Padding
* DESede/CBC/PKCS7Padding
* ECIES
* ECIESwithSHA1
* ECIESwithSHA256
* ECIESwithSHA384
* ECIESwithSHA512
* ECIESwithDESede-CBC
* ECIESwithSHA1andDESede-CBC
* ECIESwithSHA256andDESede-CBC
* ECIESwithSHA384andDESede-CBC
* ECIESwithSHA512andDESede-CBC
* ECIESwithAES-CBC
* ECIESwithSHA1andAES-CBC
* ECIESwithSHA256andAES-CBC
* ECIESwithSHA384andAES-CBC
* ECIESwithSHA512andAES-CBC
* RSA/None/NoPadding
* RSA/ECB/NoPadding
* RSA/ECB/PKCS1Padding
* SM2
* SM4/ECB/NoPadding
* SM4/ECB/PKCS5Padding
* SM4/CBC/NoPadding
* SM4/CBC/PKCS5Padding
* SignatureAlgorithm
* SHA1WithDSA
* SHA224WithDSA
* SHA256WithDSA
* SHA384WithDSA
* SHA512WithDSA
* SHA1WithECDSA
* SHA224WithECDSA
* SHA256WithECDSA
* SHA384WithECDSA
* SHA512WithECDSA
* MD2WithRSA
* MD5WithRSA
* SHA1WithRSA
* SHA224WithRSA
* SHA256WithRSA
* SHA384WithRSA
* SHA512WithRSA
* SHA1WithRSASSA-PSS
* SHA224WithRSASSA-PSS
* SHA256WithRSASSA-PSS
* SHA384WithRSASSA-PSS
* SHA512WithRSASSA-PSS
* SHA1WithSM2
* SHA256WithSM2
* SM3WithSM2
扩展功能
-------------------------------------
支持RSA密码算法,SM2密码算法加密签名消息
- RFC中各类型标识符定义如下:
| 对象标识符OID | 对象标识符定义 |
| -------------------- | -------------------------------------------- |
| 1.2.840.113549.1.7.1 | 数据类型data |
| 1.2.840.113549.1.7.2 | 签名数据类型signedData |
| 1.2.840.113549.1.7.3 | 数字信封数据类型envelopedData |
| 1.2.840.113549.1.7.4 | 签名及数字信封数据类型signedAndEnvelopedData |
| 1.2.840.113549.1.7.5 | 摘要数据类型digestData |
| 1.2.840.113549.1.7.6 | 加密数据类型encryptedData |
-
GM/T 0010 - 2012 规范中各类型标识符定义如下:
| 对象标识符OID | 对象标识符定义 |
| ----------------------- | -------------------------------------------- |
| 1.2.156.10197.6.1.4.2 | SM2密码算法加密签名消息语法规范 |
| 1.2.156.10197.6.1.4.2.1 | 数据类型data |
| 1.2.156.10197.6.1.4.2.2 | 签名数据类型signedData |
| 1.2.156.10197.6.1.4.2.3 | 数字信封数据类型envelopedData |
| 1.2.156.10197.6.1.4.2.4 | 签名及数据信封数据类型signedAndEnvelopedData |
| 1.2.156.10197.6.1.4.2.5 | 加密数据类型encrypedData |
| 1.2.156.10197.6.1.4.2.6 | 密钥协商类型keyAgreementInfo |
极速开始
-------------------------------------
以下例子基于Spring Boot
### 第一步:添加Maven依赖
直接添加以下maven依赖即可
```xml
org.loong
loong-crypto-spring-boot-starter
2.0.0
```
### 第二步:调用接口
```java
// 注入接口实例
@Autowired
private CryptoService cryptoService;
...
// 测试数据
private byte[] data = "Hello Word!".getBytes();
// 创建对称密钥
SecretKey secretKey = cryptoService.generateKey(KeyAlgorithm.SM4, KeyGeneratorParameters.builder().keySize(128).build());
// 创建非对称密钥
KeyPair keyPair = cryptoService.generateKeyPair(KeyPairAlgorithm.SM2, KeyPairGeneratorParameters.builder().keySize(256).build());
// 摘要计算
byte[] digest = cryptoService.digest(MessageDigestAlgorithm.SM3, data);
// HMac计算
byte[] hmac = cryptoService.hmac(HmacAlgorithm.HMAC_SM3, HmacParameters.builder().secret(secretKey.getEncoded()).build(), data);
// HMac验证
boolean hmacValid = cryptoService.verifyHmac(HmacAlgorithm.HMAC_SM3, HmacParameters.builder().secret(secretKey.getEncoded()).build(), data, hmac);
// 数据加密
CipherParameters encryptParams = CipherParameters.builder().key(keyPair.getPublic()).build();
byte[] cipherText = cryptoService.encrypt(CipherAlgorithm.SM2, encryptParams, data);
// 数据解密
CipherParameters decryptParams = CipherParameters.builder().key(keyPair.getPrivate()).build();
byte[] plainText = cryptoService.decrypt(CipherAlgorithm.SM2, decryptParams, cipherText);
// 数据签名
SignatureParameters signatureParams = SignatureParameters.builder().key(keyPair.getPrivate()).build();
byte[] signature = cryptoService.sign(SignatureAlgorithm.SM3_SM2, signatureParams, data);
// 签名验证
SignatureParameters verifyParams = SignatureParameters.builder().key(keyPair.getPublic()).build();
boolean signatureValid = cryptoService.verify(SignatureAlgorithm.SM3_SM2, verifyParams, data, signature);
```