身份基加密 (Identity based Encryption)算法

视频地址 https://www.bilibili.com/video/BV1Rq4y117Zw?share_source=copy_web
代码地址 https://github.com/hjlpb/IBE.git

Setup

  1. 生成pairing相关公共参数 <e,G1,GT,Zr><e,G_1, G_T,Z_r><e,G1​,GT​,Zr​>
  2. 选取随机数x∈Zrx\in Z_rx∈Zr​ 作为系统主密钥mskmskmsk
  3. 选取随机元素g∈G1g\in G_1g∈G1​作为生成元,计算公共参数gxg^xgx。因此,有系统公钥pk=<g,gx>pk=<g,g^x>pk=<g,gx>
  4. 选取公共哈希函数 H1:{0,1}∗→G1∗H_1:\{0,1\}^*\rightarrow G_1^*H1​:{0,1}∗→G1∗​,H2:GT→{0,1}nH_2:G_T \rightarrow \{0,1\}^nH2​:GT​→{0,1}n

KeyGen

  1. 给定用户身份 ID∈{0,1}∗ID\in \{0,1\}^*ID∈{0,1}∗,将其映射为群G1G_1G1​上的元素。即计算 QID=H1(ID)Q_{ID}=H_1(ID)QID​=H1​(ID)
  2. 由系统主密钥xxx计算此IDIDID对应的私钥为sk=QIDxsk=Q_{ID}^xsk=QIDx​

Encrypt

  1. 针对目标用户身份ID∈{0,1}∗ID\in \{0,1\}^*ID∈{0,1}∗,计算 QID=H1(ID)Q_{ID}=H_1(ID)QID​=H1​(ID)
  2. 选取随机数r∈Zrr\in Z_rr∈Zr​,计算密文组件C1=grC_1=g^rC1​=gr
  3. 计算gID=e(QID,gx)rg_{ID}=e(Q_{ID},g^x)^rgID​=e(QID​,gx)r
  4. 计算密文组件C2=M⊕H2(gID)C_2=M \oplus H_2(g_{ID})C2​=M⊕H2​(gID​),其中M∈{0,1}nM \in \{0,1\}^nM∈{0,1}n是明文数据
  5. 最终的密文为<C1,C2><C_1,C_2><C1​,C2​>

Decrypt

  1. 解密的关键在于恢复gIDg_{ID}gID​
  2. e(sk,C1)=e(QIDx,gr)=e(QID,g)xr=gIDe(sk,C_1)=e(Q_{ID}^x,g^r)=e(Q_{ID},g)^{xr}=g_{ID}e(sk,C1​)=e(QIDx​,gr)=e(QID​,g)xr=gID​
  3. 恢复明文 M=C2⊕H2(e(sk,C1))M=C_2 \oplus H_2(e(sk,C_1))M=C2​⊕H2​(e(sk,C1​))

代码实现注意事项

1.选择用Properties保存是因为支持键值读取,比如密文可能包含多个组件,方便分别读取每个组件。
2.方法SetProperties的第二个参数必须为String类型,因此需要先将要保存的元素转换为String类型后存储。

//写入文件
Properties pkProp = new Properties();
//pkProp.setProperty("g", new String(g.toBytes()));  //可以用这种方式将g转换为字符串后写入,但文件中会显示乱码
//为了避免乱码问题,统一采用Base64编码为可读字符串形式
pkProp.setProperty("g", Base64.getEncoder().encodeToString(g.toBytes()));
pkProp.setProperty("gx", Base64.getEncoder().encodeToString(gx.toBytes()));
storePropToFile(pkProp, pkFileName);  //从文件读取
Properties pkProp = loadPropFromFile(pkFileName);
String gString = pkProp.getProperty("g");
Element g = bp.getG1().newElementFromBytes(Base64.getDecoder().decode(gString)).getImmutable();
String gxString = pkProp.getProperty("gx");
Element gx = bp.getG1().newElementFromBytes(Base64.getDecoder().decode(gxString)).getImmutable();

3.bp.getG1().newElementFromBytes()bp.getG1().newElementFromHash()用法。前者一般用于将一个恢复一个通过bytes到处的元素,比如上图的代码中用于恢复ggx。后者用于从一个hash得到的字节数组中构造一个新元素,如下代码中用于将ID映射为群元素。

byte[] idHash = sha1(id);
Element QID = bp.getG1().newElementFromHash(idHash, 0, idHash.length).getImmutable();

4.算法实现过程中,遵从原文,密文组件的计算采用了异或方式,即C2=M⊕H2(gID)C_2=M \oplus H_2(g_{ID})C2​=M⊕H2​(gID​)。在后面的ABE方案中,一般都是直接计算C2=M⋅gIDC_2=M \cdot g_{ID}C2​=M⋅gID​,这样仿真起来会更简单一些。

JPBC库应用之身份基加密IBE相关推荐

  1. 身份基加密(IBE)

    文章目录 背景及意义 一.身份基加密详细过程 二.双线性映射 总结 背景及意义 身份基加密(Identity-Based Encrypted,IBE)最早提出是在1984年,想要实现一个公钥机密方案, ...

  2. JPBC库实现基于身份的签名体制

    JPBC库实现基于身份的签名体制---Hess体制 Hess算法: 代码: Hess类: import it.unisa.dia.gas.jpbc.Element; import it.unisa.d ...

  3. 属性基加密——模糊身份基加密(FIBE)

    目录 引言 模糊身份基加密 相关补充 引言 在身份基加密被提出以后,又出现了模糊身份基加密(FIBE),也可以说是属性基加密雏形.在FIBE中,将身份看作是一组描述性属性.它允许具有身份的用户去解密用 ...

  4. 身份基加密方案的安全性证明

    在上一篇博客中,介绍了Boneh-Franklin的基于身份的加密方案,准确地说,是介绍了Boneh-Franklin论文[1]中最基础的方案--BasicIdent.在这篇博客中,主要论述Basic ...

  5. JPBC库(基于配对的密码学)入门和避坑指南

    视频地址:https://www.bilibili.com/video/BV1o5411Y77r/ 1. JPBC简介 Java Pairing-Based Cryptography Library ...

  6. 基于身份的加密(IBE)——使用PBC库实现 Identity Based Encryption(IBE) - Pairings Based Crypto (PBC) library

    基于身份的加密(IBE)--使用PBC库实现 Identity Based Encryption(IBE) - Pairings Based Crypto (PBC) library 前言: 近期在学 ...

  7. 【属性基加密】Ubuntu下CP-ABE库安装及调用教程详解

    目录 一.前言 二.CP-ABE 1.啥是CP-ABE 2.CP-ABE流程 三.CP-ABE库安装 1.下载 2.安装依赖项 3.gmp安装 4.pbc安装 5.libbswabe安装 6.cpab ...

  8. ibe加密原理_解析基于身份加密IBE

    基于身份加密(IBE)是一种公共密钥加密方法,在这种加密方法中第三方服务器使用简单的识别符:邮件地址.社会保险号等来生成用于加密和解密电子信息的公共密钥.与传统的公共密钥加密方法相比较,这种加密方法为 ...

  9. 属性基加密仿真及代码实现(CP-ABE)论文:Ciphertext-Policy Attribute-Based Encryption

    1.仿真论文:Ciphertext-Policy Attribute-Based Encryption 2.使用库:JPBC + lombok 3.目录结构: 3.1 essay:论文 3.2 lib ...

最新文章

  1. Serializable Clonable
  2. https://www.threatminer.org/domain.php?q=blackschickens.xyz ——域名的信誉查询站点 还可以查IP...
  3. 为什么 K8s 在阿里能成功?| 问底中国 IT 技术演进
  4. boost::callable_traits下qualified_class_of的测试程序
  5. S3C2440 SPI驱动框架
  6. idea 格式化代码 快捷键
  7. 数字信号处理-01- 数字信号处理基础知识
  8. 【转】中专生的C++之路!
  9. Emacs-057-hippie-expand使用
  10. python pcm 静音_使用静音检测分割音频文件
  11. 点餐微信小程序【源码好又多】
  12. python网球比赛模拟主持稿_模拟课堂比赛主持人稿
  13. ESP32/ESP8266
  14. android swf 播放器代码,Android Flash swf播放器源码(2019)
  15. 设计模式 -- 工厂
  16. 定位教程3---固定相机,先拍后抓
  17. idea 参数显示s: o:
  18. [unity3D]什么是预制体(Prefab)?如何制作预制体?如何导出预制体?预制体变体是什么?
  19. 电脑表格日期怎么修改原有日期_表格里日期格式怎么改
  20. joycon无法连接主机_Joy-Con与主机配对方法

热门文章

  1. file对象转换为Muti文件对象工具类
  2. [Kerberos基础]-- kerberos认证原理---讲的非常细致,易懂
  3. vue打开新的标签页
  4. CSP-J冲刺 P1359 租用游艇
  5. 项目推送到远程gitLab库时一般需要排除什么文件及其如何排除?
  6. ‘真三国无双5’完美存档修改
  7. 【华为OD机试真题 JAVA】机器人走迷宫
  8. linux不能删除文件命令,无法删除文件的解决办法(rm命令的使用)
  9. Paul叔纯正美式发音②~发音技巧(二)
  10. u盘win7纯净版_如何制作纯净版WIN7启动U盘