基于属性加密原理

文章说明

本数学基础为JPBC库中的,本文章主要解析基于属性加密的数学基础,特别指向双线性映射。需要达到的效果和 rsa加密中达到的效果一样。不关注其性能等,只关注计算过程的完整性和准确性。【基本理解它的意思了,但是没有去分析那个100+页的论文,以后用的上再分析吧】

想要完全理解,预计需要两天左右时间,请做好准备。

基础概念
pairing参数概念

在双线性对密码学中,双线性对(也称为双线性映射或配对)是一种特殊的数学运算,它在密码学方案中扮演了关键角色。为了实现这些方案,需要选定一组特定的参数,这些参数称为配对参数(pairing parameters)。【双线性映射中的参数】

pairing参数五元组

【我不知道这个参数P和g之间的区别,可以仔细斟酌一下】

<P,G1,G2,GT,e>

安全参数:λ

p:大素数,和安全参数λ相关

G1,G2,GT:阶为p的乘法循环群

e:双线性映射 :G1× G2GT

性质

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.分析各种随机数选取时,所属的具体群环及其原因

问题好多

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值