腾讯云区块链服务平台 TBaaS国密算法使用说明(Go)_AI解决方案_同尘科技
操作场景
用户可以利用 TBaaS 提供的国密算法的能力,便捷的在智能合约中使用国密算法。在智能合约中使用国密算法一般分为以下两个步骤:1. 利用 TBaaS 提供的 gmtool 生成国密算法公私钥,同时使用生成的私钥对用户数据签名。2. 利用 TBaaS 提供的 Go 语言智能合约包 gmssl,在智能合约中直接 import gmssl,编写国密算法相关的业务操作,例如验证签名等。
操作步骤
Gmtool国密算法公私钥生成以及数据签名
1. 执行以下命令,使用 gmtool 生成国密算法公私钥对。
./gmtool genkey -pkout=pk.sm2 -skout=sk.sm2
其中,pk.sm2 是国密算法公钥文件,sk.sm2 是国密算法私钥文件。2. 执行以下命令,使用 gmtool 生成的私钥对信息进行签名。
./gmtool sign -skin=sk.sm2 -message=message -signature=sig.sm2
其中,message 是信息文件包含要签名的信息,sig.sm2 是生成的文件包含签名信息,该签名信息是 base64 编码的。
智能合约国密算法示例
该示例中的 Init 函数直接返回成功,无其余操作。Invoke 函数会根据不同业务逻辑进行细分调用,最终调用 verify 业务逻辑接口,用于验证用户的签名是否正确。您可访问 智能合约代码 获得完整代码,以下将对代码中的重要函数进行分析。
Init 函数示例
Init 函数主要用于在智能合约实例化和升级的时候默认调用。在实现 Init 函数的过程中,可以使用 Go 语言版本的合约 API 来对参数和账本进行操作。
以返回成功为例,示例代码如下:
// Init函数不包含具体业务,直接返回成功。func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Response { // Get the args from the transaction proposal return shim.Success(nil)}
Invoke 函数示例
Invoke 函数可以对用户的不同的智能合约业务逻辑进行拆分。本示例以只实现了一种业务类型国密算法验签 verify 为例,介绍如何通过调用 API GetFunctionAndParameters 获取到用户的具体业务类型和参数,再分别调用不同的函数。
// Invoke把用户调用的function细分到几个子function, 这里只实现了verify// Invoke is called per transaction on the chaincode. func (t *SimpleAsset) Invoke(stub shim.ChaincodeStubInterface) peer.Response { // Extract the function and args from the transaction proposal fn, args := stub.GetFunctionAndParameters()
var result string var err error
switch fn { case "verify": { result, err = verify(stub, args) } default: { shim.Error("invalid function") } } if err != nil { return shim.Error(err.Error()) }
// Return the result as success payload return shim.Success([]byte(result))}
业务逻辑 verify 函数示例
本示例以实现国密算法签名验证的业务逻辑 verify 函数为例。调用国密算法的接口 NewPublicKeyFromPEM 用于获取国密算法公钥,调用 ComputeSM2IDDiges,NewDigestContext,Reset,Update,Final 用于生成信息摘要,调用 Verify 用于验证签名是否正确。
// verify输入的参数是信息,签名base64以及公钥base64// verify验证用户的签名是否正确func verify(stub shim.ChaincodeStubInterface, args []string) (string, error) { if len(args) != 3 { return "", fmt.Errorf("Incorrect arguments. Expecting a message, a signature, and a public key") }
pkPem, err := base64.StdEncoding.DecodeString(args[2]) if err != nil { fmt.Println(err.Error()) return "", err } // 获取国密算法公钥 pk, err := gmssl.NewPublicKeyFromPEM(string(pkPem)) if err != nil { fmt.Println(err.Error()) return "", err }
sig, err := base64.StdEncoding.DecodeString(args[1]) if err != nil { fmt.Println(err.Error()) return "", err }
message := args[0] // 计算信息摘要 zid, err := pk.ComputeSM2IDDigest(DEFAULT_USER_ID) if err != nil { fmt.Println(err.Error()) return "", err } sm3ctx, err := gmssl.NewDigestContext("SM3") if err != nil { fmt.Println(err.Error()) return "", err } sm3ctx.Reset() sm3ctx.Update(zid) sm3ctx.Update([]byte(message)) tbs, err := sm3ctx.Final() if err != nil { fmt.Println(err.Error()) return "", err } // 验证签名 err = pk.Verify("sm2sign", tbs, sig, nil) if err == nil { fmt.Println("Valid Signature") return "Valid Signature.", nil } else { fmt.Println("Invalid Signature") return "Invalid signature:", nil }}
对腾讯云区块链服务平台 TBaaS的解决方案有疑惑?想了解解决方案收费? 联系解决方案专家
腾讯云限时活动1折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心,购买腾讯云享受折上折,更有现金返利:同意关联,立享优惠
阿里云解决方案也看看?: 点击对比阿里云的解决方案
暂无评论,你要说点什么吗?