# 国密支持

### 简介

chain33联盟链支持国密标准，集成了国密SM2(非对称加解密，签名，验签)算法, SM3哈希算法, SM4对称加解密算法等一系列国家密码局认定的商用密码算法，适用于所有常用的国密应用场景。

### 使用方法

用户通过chain33-sdk生成国密公私钥对，构造交易使用国密签名，然后发送到chain33区块链，chain33节点通过国密算法验证签名。

#### 环境搭建

根据具体需要，选择搭建chain33单节点，私链或者联盟链，搭建方法请参考：

- [单节点](../installDeploy/solo.md)
- [私链](../installDeploy/privateChain.md)
- [联盟链](../installDeploy/consortiumChain.md)

节点不需要对国密有额外的配置，节点会根据签名类型自适应验签方式。

#### 构造国密交易

```
// 生成公私钥对
SM2KeyPair keyPair = SM2Util.generateKeyPair();
// 构造交易
Transaction transation = createTxRaw(toAddress, execer.getBytes(), payLoad, DEFAULT_FEE);
// 交易签名
byte[] msg = encodeProtobuf(transation)
byte[] priv = keyPair.getPrivateKey().toByteArray()
byte[] uid = "gm test".getBytes()
sign(SignType.SM2, msg, priv, uid, transation);
// 交易发送
byte[] encodeProtobufWithSign = encodeProtobufWithSign(transation);
String transationHash = HexUtil.toHexString(encodeProtobufWithSign);
String hash = chain33client.submitTransaction(transactionHash);
```

#### 国密签名结合证书校验

国密签名可以结合证书一起使用，使用示例参考[chain33 ca](./caService.md)

#### 国密接口说明

国密的接口文档，请参考[chain33-sdk](https://github.com/33cn/chain33-sdk-java/blob/master/联盟链接口说明.md#国密接口)