尝试在fabric的bccsp中加入国密算法

该博客介绍了如何在Hyperledger Fabric的BCCSP(Blockchain Crypto Service Provider)中添加国密算法SM2和SM4。作者通过参考现有的RSA、ECDSA和AES算法实现,为BCCSP的sw纯软件实现中增加了SM2和SM4的签名、验签、加密和解密功能。文章详细说明了各个关键文件的作用,包括sm2.go、sm2key.go、sm4.go等,以及如何在BCCSP接口中使用这些新算法。
摘要由CSDN通过智能技术生成

代码地址:https://github.com/Freezingsmile/fabric-gmsm

主要是根据原bccsp的sw文件夹,通过参考里面的rsa、ecdsa、aes等算法的使用,新增sm2、sm3、sm4等算法的调用。

bccsp的代码实现结构
在这里插入图片描述
bccsp.go: 主要接口声明的文件,比如 BCCSP、Key、各种 Opts 等, 其中
BCCSP 接口为主要接口。

sw: bccsp 的纯软件实现,内部实现通过调用 go 原生支持的密码算法,并且
提供了一个 keystore 来保存密钥。

pkcs11: bccsp 的 pkcs11 实现,通过调用 pkcs11 接口来实现相关的密码操
作,仅支持 ecdsa、rsa 以及 aes 算法。密钥保存在 pkcs11 通过 pin 口令保
护的数据库或者硬件设备中。

utils:工具包,密钥编码转换等

signer: 实现了 go 的 crypto.signer 接口

factory:factory 是 bccsp 的一个工厂,可以通过这个工厂返回一个具体的
bccsp 实例,比如上面说的 sw 或者 pkcs11,如果添加了自己的 bccsp 实现,
也要讲该 bccsp 添加到 factory 中。

fileks.go:与密钥存储和读取相关

impl.go:sw 的主文件,通过调用 6 中的函数来实现 bccsp 的各个接口。

以算法名字开头的:密码算法实现相关。

以算法名字+key 开头的: 定义该算法密钥的具体数据结构,并实现 Key 接口

以 bccsp 接口函数名开头的:包含了 bccsp 接口各个函数的具体实现代码。

BCCSP 实例是通过工厂来提供的,sw 包对应的工厂在 swFactory.go 中实现,
pkcs11 包对应的工厂在 pkcs11Factory.go 中实现,它们都共同实现了的
BCCSPFactory 接口。

以下主要讲述具有国密算法改动的部分。

sm2.go

sm2.go文件里面调用了SM2类型的签名者和校验者的接口实现。主要包含了签名和验签功能。

func signGMSM2(k *sm2.PrivateKey, digest []byte, opts bccsp.SignerOpts) (signature []byte, err error) {
   
	signature, err = k.Sign(rand.Reader, digest, opts)
	return
}

func verifyGMSM2(k *sm2.PublicKey, signature, digest []byte, opts bccsp.SignerOpts) (valid bool, err error) {
   
	valid = k.Verify(digest, signature)
	return
}

type gmsm2Signer struct{
   }

func (s *gmsm2Signer) Sign(k bccsp.Key, digest []byte, opts bccsp.SignerOpts) (signature []byte, err error) {
   
	return signGMSM2(k.(*gmsm2PrivateKey).privKey, digest, opts)
}

type ecdsaPrivateKeySigner struct{
   }

func (s *ecdsaPrivateKeySigner) Sign(k bccsp.Key, digest []byte, opts bccsp.SignerOpts) (signature []byte, err error) {
   
	puk := k.(*ecdsaPrivateKey).privKey.PublicKey
	sm2pk := sm2.PublicKey{
   
		Curve: puk.Curve,
		X:     puk.X,
		Y:     puk.Y,
	}

	privKey := k.(*ecdsaPrivateKey).privKey
	sm2privKey := sm2.PrivateKey{
   
		D:         privKey.D,
		PublicKey: sm2pk,
	}

	return signGMSM2(&sm2privKey, digest, opts)
}

type gmsm2PrivateKeyVerifier struct{
   }

func (v *gmsm2PrivateKeyVerifier) Verify(k bccsp.Key, signature, digest []byte, opts bccsp.SignerOpts) (valid bool, err error) {
   
	return verifyGMSM2(&(k.(*gmsm2PrivateKey).privKey.PublicKey), signature, digest, opts)
}

type gmsm2PublicKeyKeyVerifier struct{
   }

func (v *gmsm2PublicKeyKeyVerifier) Verify(k bccsp.Key, signature, digest []byte, opts bccsp.SignerOpts) (valid bool, err error) {
   
	return verifyGMSM2(k.(*gmsm2PublicKey).pubKey, signature, digest, opts)
}

type ecdsaPrivateKeyVerifier struct{
   }

func (v *ecdsaPrivateKeyVerifier) Verify(k bccsp.Key, signature, digest []byte, opts bccsp.SignerOpts) (valid bool, err error) {
   
	puk := k.(*ecdsaPrivateKey).privKey.PublicKey
	sm2pk := sm2.PublicKey{
   
		Curve: puk.Curve,
		X:     puk.X,
		Y:     puk.Y,
	}
	return verifyGMSM2(&sm2pk, signature, digest, opts)
}

type ecdsaPublicKeyKeyVerifier struct{
   }

func (v *ecdsaPublicKeyKeyVerifier) Verify(k bccsp.Key, signature, digest []byte, opts bccsp.SignerOpts) (valid bool, err error) {
   
	puk := k.(*ecdsaPublicKey).pubKey
	sm2pk := sm2.PublicKey{
   
		Curve: puk.Curve,
		X:     puk.X,
		Y:     puk.Y,
	}
	return verifyGMSM2(&sm2pk, signature, digest, opts)
}

Sign和Verify主要是调用sm2的函数算法,其中由于ecdsa与sm2同属椭圆曲线加密算法,其在函数调用上有一定的共通性,所以也可以用ecdsa算法产生的密钥当作参数。

sm2key.go

SM2类型的Key接口实现,包括sm2PrivateKey和sm2PublicKey。

type gmsm2PrivateKey struct {
   
	privKey *sm2.PrivateKey
}
func (k *gmsm2PrivateKey) PublicKey() (bccsp.Key, error) {
   
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABE(Attribute-Based Encryption)是一种加密技术,可以根据使用者的属性控制数据的访问权限。在fabric上实现ABE加密算法,需要以下步骤: 1. 定义属性:在ABE,使用者的属性通常用字符串表示,例如“age>18”、“gender=male”等。在fabric,可以使用chaincode定义这些属性,并将其保存到账本。每个使用者可以拥有多个属性。 2. 定义访问策略:在ABE,访问策略用布尔表达式表示,例如“(age>18 AND gender=male) OR (age>25)”表示只有年龄大于18岁且性别为男性,或者年龄大于25岁的用户可以访问数据。在fabric,可以使用smart contract定义这些访问策略,将其保存到账本。 3. 生成密钥:在ABE,密钥通常由属性集合生成。例如,如果使用者的属性为“age>18”和“gender=male”,则可以生成一个只给年龄大于18岁且性别为男性的用户使用的密钥。在fabric,可以使用smart contract生成密钥,并将其保存到账本。 4. 加密数据:在ABE,可以使用公钥对数据进行加密,并指定访问策略。只有拥有符合访问策略的密钥的用户才能解密数据。在fabric,可以使用smart contract加密数据,并将其保存到账本。 5. 解密数据:在ABE,只有拥有符合访问策略的密钥的用户才能解密数据。在fabric,可以使用smart contract解密数据,并将其返回给用户。如果用户没有符合访问策略的密钥,则无法解密数据。 需要注意的是,ABE加密算法是一种复杂的加密技术,实现过程比较困难,需要深入理解ABE算法的原理和实现细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值