转自  http://blog.csdn.net/qifuchenluo/article/details/45100851

前言

现在网上关于Java版的双线性对算法的实现的代码很少,我在前段时间想找下这方面的代码都找不到,结果只能自己摸索。经过一段时间的摸索,终于配置好了jPBC库并实现了一些代码。所以为了让大家学习双线性算法的实现时少走点弯路,想通过博客的形式将我前段时间的学习成果跟大家分享下,为处于研究双线对密码初级阶段,还不懂得如何用java实现算法的菜鸟们提供一篇技术性的博客。

正文

关于java配对库网址为http://gas.dia.unisa.it/projects/jpbc/index.html#.VTDrLSOl_Cw,在这个网址http://gas.dia.unisa.it/projects/jpbc/docs/pairing.html#.Vz2yzOyEAzB有基本函数的用法,只看这个网址,相信很多对于Pairing-Based Cryptography Library (JPBC)还没入门的同学肯定是看的云里雾里的,看着就烦,其实我当初就是这样的。大家先不用急,学习这个库也是一个循序渐进的过程。关于jPBC库的配置,推荐一篇博客http://blog.csdn.net/liuweiran900217/article/details/23414629,这个博客已经将jPBC的配置写的很详细了,我就不赘述了。JPBC库中函数的基本使用和一些简单的算法实现,现在还没有发现专门介绍java的PBC库的相关书籍,推荐一本李发根,吴威峰著的书——《基于配对的密码学》,这本书详细讲了PBC库中每个函数的使用,还有经典算法的代码实现,这本书是C语言版的,对照这本书来研究JPBC会相对轻松很多。

用JPBC实现的算法实例
BasicIdent的基于身份的加密体制是由Boneh和Franklin在《Identity-Based Encryption fromthe Weil Pairing》提出的,算法的加解密过程大家可以自行参考下这篇论文,过程还是比较简单的。
Ident接口
[java] view plaincopy
  1. package cn.edu.zjut.pbc;
  2. public interface Ident {
  3. void buildSystem();
  4. void extractSecretKey();
  5. void encrypt();
  6. void decrypt();
  7. }

这个类是核心类,包括初始化init(),配对的对称性判断checkSymmetric(),系统建立buildSystem(),密钥提取extractSecretKey(),加密encrypt(),解密decrypt()。

[java] view plaincopy
  1. package cn.edu.zjut.pbc;
  2. import it.unisa.dia.gas.jpbc.*;
  3. import it.unisa.dia.gas.plaf.jpbc.pairing.PairingFactory;
  4. import java.lang.reflect.Proxy;
  5. import java.util.Calendar;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Date;
  8. public class BasicIdent2 implements Ident {
  9. private Element s, r, P, Ppub, Su, Qu, V, T1, T2;
  10. private Field G1, Zr;
  11. private Pairing pairing;
  12. public BasicIdent2() {
  13. init();
  14. }
  15. /**
  16. * 初始化
  17. */
  18. private void init() {
  19. pairing = PairingFactory.getPairing("a.properties");//
  20. PairingFactory.getInstance().setUsePBCWhenPossible(true);
  21. checkSymmetric(pairing);
  22. //将变量r初始化为Zr中的元素
  23. Zr = pairing.getZr();
  24. r = Zr.newElement();
  25. //将变量Ppub,Qu,Su,V初始化为G1中的元素,G1是加法群
  26. G1 = pairing.getG1();
  27. Ppub = G1.newElement();
  28. Qu = G1.newElement();
  29. Su = G1.newElement();
  30. V = G1.newElement();
  31. //将变量T1,T2V初始化为GT中的元素,GT是乘法群
  32. Field GT = pairing.getGT();
  33. T1 = GT.newElement();
  34. T2 = GT.newElement();
  35. }
  36. /**
  37. * 判断配对是否为对称配对,不对称则输出错误信息
  38. *
  39. * @param pairing
  40. */
  41. private void checkSymmetric(Pairing pairing) {
  42. if (!pairing.isSymmetric()) {
  43. throw new RuntimeException("密钥不对称!");
  44. }
  45. }
  46. @Override
  47. public void buildSystem() {
  48. System.out.println("-------------------系统建立阶段----------------------");
  49. s = Zr.newRandomElement().getImmutable();// //随机生成主密钥s
  50. P = G1.newRandomElement().getImmutable();// 生成G1的生成元P
  51. Ppub = P.mulZn(s);// 计算Ppub=sP,注意顺序
  52. System.out.println("P=" + P);
  53. System.out.println("s=" + s);
  54. System.out.println("Ppub=" + Ppub);
  55. }
  56. @Override
  57. public void extractSecretKey() {
  58. System.out.println("-------------------密钥提取阶段----------------------");
  59. Qu = pairing.getG1().newElement().setFromHash("IDu".getBytes(), 0, 3)
  60. .getImmutable();// //从长度为3的Hash值IDu确定用户U产生的公钥Qu
  61. Su = Qu.mulZn(s).getImmutable();
  62. System.out.println("Qu=" + Qu);
  63. System.out.println("Su=" + Su);
  64. }
  65. @Override
  66. public void encrypt() {
  67. System.out.println("-------------------加密阶段----------------------");
  68. r = Zr.newRandomElement().getImmutable();
  69. V = P.mulZn(r);
  70. T1 = pairing.pairing(Ppub, Qu).getImmutable();// 计算e(Ppub,Qu)
  71. T1 = T1.powZn(r).getImmutable();
  72. System.out.println("r=" + r);
  73. System.out.println("V=" + V);
  74. System.out.println("T1=e(Ppub,Qu)^r=" + T1);
  75. }
  76. @Override
  77. public void decrypt() {
  78. System.out.println("-------------------解密阶段----------------------");
  79. T2 = pairing.pairing(V, Su).getImmutable();
  80. System.out.println("e(V,Su)=" + T2);
  81. int byt = V.getLengthInBytes();// 求V的字节长度,假设消息长度为128字节
  82. System.out.println("文本长度" + (byt + 128));
  83. }
  84. public static void main(String[] args) {
  85. BasicIdent2 ident = new BasicIdent2();
  86. // 动态代理,统计各个方法耗时
  87. Ident identProxy = (Ident) Proxy.newProxyInstance(
  88. BasicIdent2.class.getClassLoader(),
  89. new Class[] { Ident.class }, new TimeCountProxyHandle(ident));
  90. identProxy.buildSystem();
  91. identProxy.extractSecretKey();
  92. identProxy.encrypt();
  93. identProxy.decrypt();
  94. }
  95. }

最后使用了动态代理(java自带的代理模式)用来统计各个阶段的耗时。

[java] view plaincopy
  1. package cn.edu.zjut.pbc;
  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. /**
  5. * 时间统计处理机,用于统计各方法耗时
  6. * @author Administrator
  7. *
  8. */
  9. public class TimeCountProxyHandle implements InvocationHandler {
  10. private Object proxied;
  11. public TimeCountProxyHandle(Object obj) {
  12. proxied = obj;
  13. }
  14. @Override
  15. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  16. long begin = System.currentTimeMillis();
  17. Object result = method.invoke(proxied, args);
  18. long end = System.currentTimeMillis();
  19. System.out.println(method.getName() + "耗时:" + (end - begin) + "ms");
  20. return result;
  21. }
  22. }

运行结果展示


由于电脑配置的不同,运行耗时会有差异,大家对于这篇博客如有任何问题,欢迎在CSDN上与我讨论。

使用JPBC实现双线性对加密算法(BasicIdent体制的java实现)相关推荐

  1. 即时通讯学习笔记006---认识学习OpenFire服务器用的加密算法Blowfish_以及用java实现Blowfish算法

    这个算法: 有个在线工具,可以进行加密解密 http://tool.chacuo.net/cryptblowfish 个人认为目前比较安全的加密算法:Blowfish. 上代码之前,先说几点Blowf ...

  2. RSA - 非对称加密算法简要介绍与JAVA实现

    [1]RSA简介 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年 ...

  3. 基于JPBC的SM9算法的java实现与测试

    文章目录 源码下载 确定参数 R-ate双线性对 定义曲线 辅助方法 密钥结构与算法结果值结构 密钥生成中心KGC SM9算法实现 测试<GMT 0044-2016 SM9标识密码算法:第5部分 ...

  4. JPBC参数介绍Element,Field,Point等

    文章目录 1.java doc 2.生成椭圆曲线和群 3.Element类型 3.Field类型 4.Point类型 JPBC库是一个功能很强大的数学库,用于生成椭圆曲线,双线性等,但网上参考资料很少 ...

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

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

  6. playfair密码和凯撒密码加密算法的Java实现

    文章目录 一.实现广义的凯撒密码加密算法 二.实现广义的playfair密码的加密算法 总结 加密原理: 一.实现广义的凯撒密码加密算法 //实现广义的凯撒密码//凯撒密码的加密String plai ...

  7. RSA加密算法原理及其Java实现

    RSA加密算法原理及其Java实现 RSA加密算法的基本原理 主要步骤 解密过程证明 java实现 简单介绍了RSA加密算法的原理及其Java实现:原文过长时,进行了分段加密. RSA加密算法的基本原 ...

  8. RC4算法原理、Java实现RC4加密算法、DES AES RC4算法比较

    DES AES RC4算法比较 根据密钥类型的不同,加密算法分为对称和非对称两种.对称加密系统是指加密和解密均采用同一把密钥. 对称加密算法是最常用的加密算法,优势在于算法公开,计算量小,加密效率高. ...

  9. 公钥密码学与伪随机数

    公钥算法是基于数学函数而不是基于替换和置换 公钥密码是非对称的 公钥密码仅用于密钥管理和签名 关于公钥密码的误解: 从密码分析的角度看,公钥密码比传统密码更安全 公钥密码是一种通用的方法,所以传统密码 ...

最新文章

  1. python访问多个网站_Python多并发访问网站
  2. 演讲实录:MySQL 8.0 中的复制技术
  3. centos解压分卷rar_centos解压和压缩rar格式文件
  4. java中未解决的编译问题_java – 我遇到了这个异常:未解决的编译问题
  5. kafka安装使用说明
  6. javascript中insertRow(index) 和insertCell(index)
  7. mscaffe 训练minist数据
  8. 推荐3个好用的Excel项目管理甘特图模板
  9. MPush开源实时消息推送系统
  10. android 分辨率转换器,Nevercenter Pixelmash(图片像素转换器) v202010 官方版
  11. 网络层 --- 路由器工作原理
  12. 机器学习 --- 朴素贝叶斯分类器
  13. 判断是否为奇数时:除以2余数等于1.(充分而不必要)
  14. GNU C++ 智能指针5-- 解析_Sp_counted_deleter类
  15. 小米总监说软件测试分为这及类
  16. Tcp TimeWait处理流程
  17. HDCTF-2nd复盘
  18. ARM Cortex-A 系列编程指南之ARMv8-A(AArch64浮点与NEON)
  19. Eclipse+Maven+Nexus+Tomcat远程搭建CentOS web server
  20. element---组件--form

热门文章

  1. sql server XML中value(),exists(),nodes()方法
  2. python repl_Python自学第二天 REPL+基础语法
  3. android短信接收处理和发送
  4. 关于jupyter notebook闪退问题【我真真的够了,大家以后不要乱捣鼓电脑了,绝了】
  5. iOS 启动优化和安装包瘦身
  6. itpt_TCPL 第五章:指针和数组 - 第八章:UNIX系统接口
  7. linux系统无线网卡驱动安装,在linux上怎么安装无线网卡驱动?
  8. (个人记录)安装pycocotools库出现Could not build wheels for pycocotools which use PEP 517 and cannot be install
  9. 冒泡排序和快速排序的效率比较
  10. 数学重要公式--笔记