【GO-PBC密码学实践】IBE算法

文章详细介绍了IBE(Identity-BasedEncryption)算法的核心原理,包括双线性配对和身份基签名的步骤。接着,它展示了如何使用Go语言实现IBE算法的Setup、KeyGen、Sign和Verify过程,以及环境配置和关键函数的代码示例。此实现旨在简化传统的公钥密码系统的密钥管理问题。
摘要由CSDN通过智能技术生成

目录

一、IBE算法原理

1. 双线性配对

2. 身份基签名算法

Setup

Extract

Sign

Verify

二、算法实现

1. 环境配置

2. 代码实现

IbeSetup

IbekeyGen

IbeSign

IbeVerify

总结


前言

为简化传统公钥密码系统的密钥管理问题,Shamir 提出基于身份密码的思想:将用户的公开身份信息( 如 E-mail 名字等)作为用户公钥,或是可以由该身份信息通过一个公开的算法计算出该用户的公钥。在基于身份的系统中,交互双方 Alice 和 Bob 可以直接根据对方的身份信息执行加密或是签名验证等密码操作。相对于传统的 PKI 技术,基于身份的系统无需复杂的公钥证书与认证。

一、IBE算法原理

1. 双线性配对

 q 为一大素数,\mathbb{G}_{1},\mathbb{G}_{T} 为 q 阶循环群,g为 \mathbb{G}_{1} 生成元。e:{​{\mathbb{G}}_{1}}\times {​{\mathbb{G}}_{1}}\to {​{\mathbb{G}}_{2}} 为双线性映射,具备以下属性:

  1. 双线性:对  {\forall u,v} \in {​{\mathbb G}_1},a,b \in{Z_q^*},有 e(u^a,v^b)=e(u,v)^{ab}
  2. 非退化性:{\exists} e(g,g){\neq}1
  3. 可计算性:对于所有的 u,v \in{\mathbb{G}_{1}},存在有效的算法计算 e(u,v)

2. 身份基签名算法

Setup

  1. 生成公共参数 <\mathbb{G}_{1},\mathbb{G}_{T},e,Z_q^*,q>

  2. 选取随机数 s \in{Z_q^*}。生成系统密钥对<msk,mpk> =<s,g^s>

  3. 选取公共哈希函数:H_1: \{0,1\}^*\times {\mathbb{G}}_{1}\to {Z_q^*},H_2: \{0,1\}^* \to {\mathbb{G}}_{1}

Extract

  1. 给定用户身份 ID \in \{0,1\}^*,系统主密钥 msk

  2. 计算 Q_{ID} = H_1(ID),用户私钥 d_{ID}=sH_1(ID)

Sign

  1. 给定消息 \mathbb{M},私钥 d_{ID}

  2. 选择随机数 r \in{Z_q^*},计算 U=rQ_{ID},h=H_1(\mathbb{M},U),V=(r+h)d_{ID}

  3. 输出签名 \sigma=(U,V)

Verify

  1. 给定用户身份 ID \in \{0,1\}^*,消息 \mathbb{M},签名 \sigma=(U,V) 和系统公钥 mpk

  2. 计算签名 \sigma =(U,V), Q_{ID} = H_1(ID)

  3. 验证等式 e(g,V)=e(mpk,U+hQ_{ID}) 是否成立,成立则签名正确

二、算法实现

1. 环境配置

  1. 安装PBC库及该库对应的依赖

  2. 导入PBC Go Wrapper

go get https://github.com/Nik-U/pbc      

2. 代码实现

IbeSetup

type sharedParam struct {
	params string // curve parameters
	g      []byte // generator
	mpk    []byte // master publicKey
}

func IbeSetup() (pubParams sharedParam, mskByte []byte) {
	params := pbc.GenerateA(160, 512)
	bp := params.NewPairing()
	g := bp.NewG1().Rand()

	// Generate master keypair (x, g^x)
	msk := bp.NewZr().Rand()
	mpk := bp.NewG1().PowZn(g, msk)
	mskByte = msk.Bytes()
	// public params
	pubParams = sharedParam{
		params: params.String(),
		g:      g.Bytes(),
		mpk:    mpk.Bytes(),
	}
	return
}

IbekeyGen

func IbekeyGen(pubParams sharedParam, mskByte []byte, ID string) []byte {
	// loads the system parameters and master key
	bp, _ := pbc.NewPairingFromString(pubParams.params)
	msk := bp.NewZr().SetBytes(mskByte)

	// QID := H_1(ID)
	QID := bp.NewG1().SetFromStringHash(ID, sha256.New())
	// d = QID^msk = H_1(ID)^msk
	d := bp.NewG1().PowZn(QID, msk)

	return d.Bytes()
}

IbeSign

type signature struct {
	UByte []byte
	VByte []byte
}

func IbeSign(pubParams sharedParam, dByte []byte, ID, msg string) (sign signature) {
	// loads the system parameters and secretKey
	bp, _ := pbc.NewPairingFromString(pubParams.params)
	d := bp.NewG1().SetBytes(dByte)

	// U = QID^r
	r := bp.NewZr().Rand()
	QID := bp.NewG1().SetFromStringHash(ID, sha256.New())
	U := bp.NewG1().PowZn(QID, r)

	// h = H_2(m,U)
	msg2Zr_U := append([]byte(msg), U.Bytes()...)
	h := bp.NewZr().SetFromStringHash(string(msg2Zr_U), sha256.New())

	// V = d^(r+h)
	r_h := bp.NewZr().Add(r, h)
	V := bp.NewG1().PowZn(d, r_h)

	sign = signature{
		UByte: U.Bytes(),
		VByte: V.Bytes(),
	}
	return
}

IbeVerify

func IbeVerify(pubParams sharedParam, sign signature, msg, ID string) bool {
	// loads the system parameters and signature
	bp, _ := pbc.NewPairingFromString(pubParams.params)
	g := bp.NewG1().SetBytes(pubParams.g)
	mpk := bp.NewG1().SetBytes(pubParams.mpk)
	U := bp.NewG1().SetBytes(sign.UByte)
	V := bp.NewG1().SetBytes(sign.VByte)

	msg2Zr_U := append([]byte(msg), U.Bytes()...)
	h := bp.NewZr().SetFromStringHash(string(msg2Zr_U), sha256.New())

	QID := bp.NewG1().SetFromStringHash(ID, sha256.New())
	h_QID := bp.NewG1().PowZn(QID, h)
	U_h_QID := bp.NewG1().Add(U, h_QID)
	pair1 := bp.NewGT().Pair(g, V)
	pair2 := bp.NewGT().Pair(mpk, U_h_QID)

	return pair1.Equals(pair2)
}

总结

本文介绍了IBE算法的基础概念和对应签名算法的Go代码实现,希望能给大家带来帮助。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值