目录
前言
为简化传统公钥密码系统的密钥管理问题,Shamir 提出基于身份密码的思想:将用户的公开身份信息( 如 E-mail 名字等)作为用户公钥,或是可以由该身份信息通过一个公开的算法计算出该用户的公钥。在基于身份的系统中,交互双方 Alice 和 Bob 可以直接根据对方的身份信息执行加密或是签名验证等密码操作。相对于传统的 PKI 技术,基于身份的系统无需复杂的公钥证书与认证。
一、IBE算法原理
1. 双线性配对
q 为一大素数, 为 q 阶循环群,g为
生成元。
为双线性映射,具备以下属性:
- 双线性:对
,有
- 非退化性:
- 可计算性:对于所有的
,存在有效的算法计算
2. 身份基签名算法
Setup
-
生成公共参数
-
选取随机数
。生成系统密钥对
-
选取公共哈希函数:
Extract
-
给定用户身份
,系统主密钥 msk
-
计算
,用户私钥
Sign
-
给定消息
,私钥
-
选择随机数
,计算
-
输出签名
Verify
-
给定用户身份
,消息
,签名
和系统公钥 mpk
-
计算签名
-
验证等式
是否成立,成立则签名正确
二、算法实现
1. 环境配置
-
安装PBC库及该库对应的依赖
-
导入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代码实现,希望能给大家带来帮助。