文章说明
本数学基础为JPBC库中的,本文章主要解析基于属性加密的数学基础,特别指向双线性映射。需要达到的效果和 rsa加密中达到的效果一样。不关注其性能等,只关注计算过程的完整性和准确性。【基本理解它的意思了,但是没有去分析那个100+页的论文,以后用的上再分析吧】
想要完全理解,预计需要两天左右时间,请做好准备。
基础概念
pairing参数概念
在双线性对密码学中,双线性对(也称为双线性映射或配对)是一种特殊的数学运算,它在密码学方案中扮演了关键角色。为了实现这些方案,需要选定一组特定的参数,这些参数称为配对参数(pairing parameters)。【双线性映射中的参数】
pairing参数五元组
【我不知道这个参数P和g之间的区别,可以仔细斟酌一下】
<P,G1,G2,GT,e>
安全参数:λ
p:大素数,和安全参数λ相关
G1,G2,GT:阶为p的乘法循环群
e:双线性映射 :G1× G2→GT
性质
e(P,Q)→n:将两个群上元素映射为一个值
系数可以直接提取:这里的提取很有意思不知道怎么描述,自己体会一下
幂指数可以直接提取:同上,双线性性质是第五条,BLS签名用的第三条
双线性性质代码辅助分析
功能
验证双线性性质的正确性
环境配置–引用文章:
https://blog.csdn.net/weixin_44960315/article/details/107325591
双线性性质验证代码:
//这里的所有计算都是大整数下计算的,必须调用库函数进行
import it.unisa.dia.gas.jpbc.Element;
import it.unisa.dia.gas.jpbc.Field;
import it.unisa.dia.gas.jpbc.Pairing;
import it.unisa.dia.gas.plaf.jpbc.pairing.PairingFactory;
public class Main {
public static void main(String[] args) {
//生成pairing参数 【基于椭圆曲线】
Pairing bp = PairingFactory.getPairing("a.properties");
//生成C1 和 Zr两个群(后面这个可能是整环,这里理解大概意思就行)
Field G1 = bp.getG1();
Field Zr = bp.getZr();
//生成g a b三个数
Element g = G1.newRandomElement().getImmutable();
Element a = Zr.newRandomElement().getImmutable();
Element b = Zr.newRandomElement().getImmutable();
//计算g^a g^b ;这种计算,是在群环域之上计算的,可能或有模之后取值的情况【参照RSA】
Element ga = g.powZn(a);
Element gb = g.powZn(b);
//计算e(ga,gb)
Element egg_ab = bp.pairing(ga,gb);
//计算e(g,g)
Element egg = bp.pairing(g,g).getImmutable();
//计算ab
Element ab = a.mul(b);
//计算egg^ab
Element egg_ab_p = egg.powZn(ab);
if (egg_ab.isEqual(egg_ab_p)) {
System.out.println("yes");
}
else {
System.out.println("No");
}
}
}
自定义椭圆曲线参数
这里的参数还是随机生成的,不能够自己用小数据重现过程
import it.unisa.dia.gas.jpbc.Element;
import it.unisa.dia.gas.jpbc.Field;
import it.unisa.dia.gas.jpbc.Pairing;
import it.unisa.dia.gas.jpbc.PairingParameters;
import it.unisa.dia.gas.plaf.jpbc.pairing.PairingFactory;
import it.unisa.dia.gas.plaf.jpbc.pairing.a.TypeACurveGenerator;
public class Main {
public static void main(String[] args) {
//安全参数
int rBits = 160;
int qBits = 512;
TypeACurveGenerator pg = new TypeACurveGenerator(rBits, qBits);
//生成椭圆曲线参数
PairingParameters pp = pg.generate();
//生成pairing参数
Pairing bp = PairingFactory.getPairing(pp);
System.out.println(pp);
Field G1 = bp.getG1();
Field Zr = bp.getZr();
Element g = G1.newRandomElement().getImmutable();
Element a = Zr.newRandomElement().getImmutable();
Element b = Zr.newRandomElement().getImmutable();
Element ga = g.powZn(a);
Element gb = g.powZn(b);
Element egg_ab = bp.pairing(ga,gb);
Element egg = bp.pairing(g,g).getImmutable();
Element ab = a.mul(b);
Element egg_ab_p = egg.powZn(ab);
if (egg_ab.isEqual(egg_ab_p)) {
System.out.println("yes");
}
else {
System.out.println("No");
}
}
}
BLS签名算法实例
本小结通过简单分析BLS签名来学习一下双线性映射的应用。
系统初始化
内容
系统参数:<P,G1,G2,GT,e>
pairing参数:<g,G1,G2,GT,e>
随机选择私钥:x∈GT
生成公钥:y=g^x
签名
s=(H(m))^x
验证
e(g,s)=e(h,y)
算法源码:
import it.unisa.dia.gas.jpbc.Element;
import it.unisa.dia.gas.jpbc.Field;
import it.unisa.dia.gas.jpbc.Pairing;
import it.unisa.dia.gas.jpbc.PairingParameters;
import it.unisa.dia.gas.plaf.jpbc.pairing.PairingFactory;
import it.unisa.dia.gas.plaf.jpbc.pairing.a.TypeACurveGenerator;
public class Main {
public static void main(String[] args) {
// Initialization
Pairing bp = PairingFactory.getPairing("a.properties");
Field G1 = bp.getG1();
Field Zr = bp.getZr();
//生成g
Element g = G1.newRandomElement();
//随机生成私钥
Element x = Zr.newRandomElement();
//生成公钥
Element g_x = g.duplicate().powZn(x);
//Signing
String m = "message";
byte[] m_hash = Integer.toString(m.hashCode()).getBytes();
//进行哈系运算 h=H(m)
Element h = G1.newElementFromHash(m_hash, 0, m_hash.length);
//私钥签名:s=h^x
Element sig = h.duplicate().powZn(x);
//Verification:e(g,sig)=e(g,h^x) e(h,g^x),根据性质,两者应该相等
Element pl = bp.pairing(g, sig);
Element pr = bp.pairing(h, g_x);
if (pl.isEqual(pr))
System.out.println("Yes");
else
System.out.println("No");
}
}
身份基加密
身份即加密其实是将系统主密钥和身份进行了一次绑定,生成用户私钥的同时也将系统主密钥的计算特性转移到用户私钥。使得,用系统公钥加密的消息,可以用用户私钥去解密。同时利用随机数,区分每一次加密。
掌握了系统主密钥,也就掌握了用户私钥(系统主密钥+用户身份信息)
###但是呢,这就牵扯到一个密钥协商的过程,首先基于身份加密,需要一个可信机构来管理这个系统(主密钥)私钥msk,是一个中心机构,那么在与区块链进行结合的时候,是如何进行处理的呢?这个中心机构可以消除吗?还是选择了继续保留?
###我原本想的是用智能合约维护一个黑盒一样的东西,让系统主密钥,根据外边多个节点的协商,在里面产生。产生于多节点,而又由智能合约进行封闭维护。但是智能合约是完全透明的,我还没有遇到多怎样处理这个问题。
详细流程引见URL:
https://blog.csdn.net/weixin_44960315/article/details/122278903
代码源码(引用):
https://github.com/hjlpb/IBE
使用注意事项:
三个包加上主函数就可以了,其它的都无所谓
模糊身份认证
引用网址【这里介绍了模糊身份认证的完整方案】:
https://blog.csdn.net/weixin_44960315/article/details/122394033
基于拉格朗日插值定理设计了一种秘密共享方案而已。核心是秘密共享方案的思想和作用,这里的拉格朗日插值·定理倒不是重点。刚好这两个我都了解。
其中拉格朗日插值定理的具体原理可以见下URL中的范例部分:
https://zh.wikipedia.org/wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E6%8F%92%E5%80%BC%E6%B3%95
文献中的解密部分:d-1个拉格朗日基本多项式 * 拉格朗日因子之和,为用户随机生成的d-1多项式,取q(0)=y,即可恢复出y值。
秘密共享方案可以看Shamir最基本的(n,t)门限密钥分割方案,简单易懂。
https://blog.csdn.net/kety_gz/article/details/89366868
理解以上概念之后,解释一下这篇论文中的四个随机数的作用,这个也是这个算法的关键。
1.setup中的 随机数ti --tu :将主密钥与属性集合相关联(可信第三方保存)
2.setup中的 随机数y :主密钥(可信第三方保存)【这个和身份基中的x相当】
两者共同构成主密钥
3.随机d-1多项式:生成唯一用户私钥,且可以防止合谋攻击
将q(0)=y 下发主密钥中的y属性,生成Di,下发主密钥中ti属性
4.随机数s:保证每次加密的随机性,这个应该是为了保护用户私钥的。
核心还是围绕主密钥中的y展开加解密操作,之上利用ti给y的使用添加了一层迷雾。
访问控制结构树
具体的可以参考视频:
https://www.bilibili.com/video/BV1r94y1o7Jb/?spm_id_from=333.788
叶子结点存储秘密分片,中间节点为门限值。目的是已知部分访问控制树的叶子结点的秘密分片,是否可以会恢复出根节点的秘密。
其中有两个重点,递归秘密分割,以及递归秘密恢复。
###有一个疑问,所有的树结构都可以转化为二叉树,能否优化树结构,提升系统整体的运行效率?
KPABE
这个文献的主要思想就是将访问控制树的思想引入其中。初始化和加密过程同模糊身份基认证相同,用户密钥生成和解密过程引入了两个递归。
可以将模糊身份认证看成没有中间节点的KPABE,是KPABE的一种特例。
CPABE
这个呢,与KPABE有两个不同,其一是将访问控制树改成了LSSS,可能效率之类的更高吧。【后续用的着再继续进行分析】
第二个呢,就是将访问控制策略改到密文之中。在模糊身份认证和 KPabe之中呢,是将y值进行了分割。假如还是利用访问控制树结构的话呢。这里分割对象就是加密明文数据时,生成的那个随机数。
小结:
至此呢,我们了解了
=>双线性映射的基本概念和性质
=>基于双线性映射的BLS签名(练了一下手)
=>再学习了身份基加密
=>进而学习模糊身份基加密
=>KPABE
=>CPABE
以上概念全部理解,并能实现。
看的越多,疑问越多,我们会进一步思考:
1.从访问控制树到LSSS的转化原因是什么?LSSS如何进行实现。
2.哪里可以修改,来提升属性基加密的效率?属性基加密本身的效率和AES和RSA性能对比如何?它所共享的数据主要是对称密钥呢,还是大文件数据呢?=>这个关系到它的主要应用场景
3.基于属性加密的中心化问题是如何进行改进的呢?多中心机构是很容易想到的,但是现今它和区块链技术是怎样进行结合的呢?【我的主要问题】
4.安全性证明是怎么回事?这一部分很难呀
5.之后要使用的使用,首先要再进一步分析双线性的原理,达到用手算小数据复现整体流程的地步。
6.分析各种随机数选取时,所属的具体群环及其原因
…
问题好多
理解,并能实现。
看的越多,疑问越多,我们会进一步思考:
1.从访问控制树到LSSS的转化原因是什么?LSSS如何进行实现。
2.哪里可以修改,来提升属性基加密的效率?属性基加密本身的效率和AES和RSA性能对比如何?它所共享的数据主要是对称密钥呢,还是大文件数据呢?=>这个关系到它的主要应用场景
3.基于属性加密的中心化问题是如何进行改进的呢?多中心机构是很容易想到的,但是现今它和区块链技术是怎样进行结合的呢?【我的主要问题】
4.安全性证明是怎么回事?这一部分很难呀
5.之后要使用的使用,首先要再进一步分析双线性的原理,达到用手算小数据复现整体流程的地步。
6.分析各种随机数选取时,所属的具体群环及其原因
…
问题好多