使用JPBC实现双线性对加密算法(BasicIdent体制的java实现)
转自 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实现的算法实例
- package cn.edu.zjut.pbc;
- public interface Ident {
- void buildSystem();
- void extractSecretKey();
- void encrypt();
- void decrypt();
- }
这个类是核心类,包括初始化init(),配对的对称性判断checkSymmetric(),系统建立buildSystem(),密钥提取extractSecretKey(),加密encrypt(),解密decrypt()。
- package cn.edu.zjut.pbc;
- import it.unisa.dia.gas.jpbc.*;
- import it.unisa.dia.gas.plaf.jpbc.pairing.PairingFactory;
- import java.lang.reflect.Proxy;
- import java.util.Calendar;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- public class BasicIdent2 implements Ident {
- private Element s, r, P, Ppub, Su, Qu, V, T1, T2;
- private Field G1, Zr;
- private Pairing pairing;
- public BasicIdent2() {
- init();
- }
- /**
- * 初始化
- */
- private void init() {
- pairing = PairingFactory.getPairing("a.properties");//
- PairingFactory.getInstance().setUsePBCWhenPossible(true);
- checkSymmetric(pairing);
- //将变量r初始化为Zr中的元素
- Zr = pairing.getZr();
- r = Zr.newElement();
- //将变量Ppub,Qu,Su,V初始化为G1中的元素,G1是加法群
- G1 = pairing.getG1();
- Ppub = G1.newElement();
- Qu = G1.newElement();
- Su = G1.newElement();
- V = G1.newElement();
- //将变量T1,T2V初始化为GT中的元素,GT是乘法群
- Field GT = pairing.getGT();
- T1 = GT.newElement();
- T2 = GT.newElement();
- }
- /**
- * 判断配对是否为对称配对,不对称则输出错误信息
- *
- * @param pairing
- */
- private void checkSymmetric(Pairing pairing) {
- if (!pairing.isSymmetric()) {
- throw new RuntimeException("密钥不对称!");
- }
- }
- @Override
- public void buildSystem() {
- System.out.println("-------------------系统建立阶段----------------------");
- s = Zr.newRandomElement().getImmutable();// //随机生成主密钥s
- P = G1.newRandomElement().getImmutable();// 生成G1的生成元P
- Ppub = P.mulZn(s);// 计算Ppub=sP,注意顺序
- System.out.println("P=" + P);
- System.out.println("s=" + s);
- System.out.println("Ppub=" + Ppub);
- }
- @Override
- public void extractSecretKey() {
- System.out.println("-------------------密钥提取阶段----------------------");
- Qu = pairing.getG1().newElement().setFromHash("IDu".getBytes(), 0, 3)
- .getImmutable();// //从长度为3的Hash值IDu确定用户U产生的公钥Qu
- Su = Qu.mulZn(s).getImmutable();
- System.out.println("Qu=" + Qu);
- System.out.println("Su=" + Su);
- }
- @Override
- public void encrypt() {
- System.out.println("-------------------加密阶段----------------------");
- r = Zr.newRandomElement().getImmutable();
- V = P.mulZn(r);
- T1 = pairing.pairing(Ppub, Qu).getImmutable();// 计算e(Ppub,Qu)
- T1 = T1.powZn(r).getImmutable();
- System.out.println("r=" + r);
- System.out.println("V=" + V);
- System.out.println("T1=e(Ppub,Qu)^r=" + T1);
- }
- @Override
- public void decrypt() {
- System.out.println("-------------------解密阶段----------------------");
- T2 = pairing.pairing(V, Su).getImmutable();
- System.out.println("e(V,Su)=" + T2);
- int byt = V.getLengthInBytes();// 求V的字节长度,假设消息长度为128字节
- System.out.println("文本长度" + (byt + 128));
- }
- public static void main(String[] args) {
- BasicIdent2 ident = new BasicIdent2();
- // 动态代理,统计各个方法耗时
- Ident identProxy = (Ident) Proxy.newProxyInstance(
- BasicIdent2.class.getClassLoader(),
- new Class[] { Ident.class }, new TimeCountProxyHandle(ident));
- identProxy.buildSystem();
- identProxy.extractSecretKey();
- identProxy.encrypt();
- identProxy.decrypt();
- }
- }
最后使用了动态代理(java自带的代理模式)用来统计各个阶段的耗时。
- package cn.edu.zjut.pbc;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- /**
- * 时间统计处理机,用于统计各方法耗时
- * @author Administrator
- *
- */
- public class TimeCountProxyHandle implements InvocationHandler {
- private Object proxied;
- public TimeCountProxyHandle(Object obj) {
- proxied = obj;
- }
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- long begin = System.currentTimeMillis();
- Object result = method.invoke(proxied, args);
- long end = System.currentTimeMillis();
- System.out.println(method.getName() + "耗时:" + (end - begin) + "ms");
- return result;
- }
- }
运行结果展示
由于电脑配置的不同,运行耗时会有差异,大家对于这篇博客如有任何问题,欢迎在CSDN上与我讨论。
使用JPBC实现双线性对加密算法(BasicIdent体制的java实现)相关推荐
- 即时通讯学习笔记006---认识学习OpenFire服务器用的加密算法Blowfish_以及用java实现Blowfish算法
这个算法: 有个在线工具,可以进行加密解密 http://tool.chacuo.net/cryptblowfish 个人认为目前比较安全的加密算法:Blowfish. 上代码之前,先说几点Blowf ...
- RSA - 非对称加密算法简要介绍与JAVA实现
[1]RSA简介 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年 ...
- 基于JPBC的SM9算法的java实现与测试
文章目录 源码下载 确定参数 R-ate双线性对 定义曲线 辅助方法 密钥结构与算法结果值结构 密钥生成中心KGC SM9算法实现 测试<GMT 0044-2016 SM9标识密码算法:第5部分 ...
- JPBC参数介绍Element,Field,Point等
文章目录 1.java doc 2.生成椭圆曲线和群 3.Element类型 3.Field类型 4.Point类型 JPBC库是一个功能很强大的数学库,用于生成椭圆曲线,双线性等,但网上参考资料很少 ...
- JPBC库(基于配对的密码学)入门和避坑指南
视频地址:https://www.bilibili.com/video/BV1o5411Y77r/ 1. JPBC简介 Java Pairing-Based Cryptography Library ...
- playfair密码和凯撒密码加密算法的Java实现
文章目录 一.实现广义的凯撒密码加密算法 二.实现广义的playfair密码的加密算法 总结 加密原理: 一.实现广义的凯撒密码加密算法 //实现广义的凯撒密码//凯撒密码的加密String plai ...
- RSA加密算法原理及其Java实现
RSA加密算法原理及其Java实现 RSA加密算法的基本原理 主要步骤 解密过程证明 java实现 简单介绍了RSA加密算法的原理及其Java实现:原文过长时,进行了分段加密. RSA加密算法的基本原 ...
- RC4算法原理、Java实现RC4加密算法、DES AES RC4算法比较
DES AES RC4算法比较 根据密钥类型的不同,加密算法分为对称和非对称两种.对称加密系统是指加密和解密均采用同一把密钥. 对称加密算法是最常用的加密算法,优势在于算法公开,计算量小,加密效率高. ...
- 公钥密码学与伪随机数
公钥算法是基于数学函数而不是基于替换和置换 公钥密码是非对称的 公钥密码仅用于密钥管理和签名 关于公钥密码的误解: 从密码分析的角度看,公钥密码比传统密码更安全 公钥密码是一种通用的方法,所以传统密码 ...
最新文章
- python访问多个网站_Python多并发访问网站
- 演讲实录:MySQL 8.0 中的复制技术
- centos解压分卷rar_centos解压和压缩rar格式文件
- java中未解决的编译问题_java – 我遇到了这个异常:未解决的编译问题
- kafka安装使用说明
- javascript中insertRow(index) 和insertCell(index)
- mscaffe 训练minist数据
- 推荐3个好用的Excel项目管理甘特图模板
- MPush开源实时消息推送系统
- android 分辨率转换器,Nevercenter Pixelmash(图片像素转换器) v202010 官方版
- 网络层 --- 路由器工作原理
- 机器学习 --- 朴素贝叶斯分类器
- 判断是否为奇数时:除以2余数等于1.(充分而不必要)
- GNU C++ 智能指针5-- 解析_Sp_counted_deleter类
- 小米总监说软件测试分为这及类
- Tcp TimeWait处理流程
- HDCTF-2nd复盘
- ARM Cortex-A 系列编程指南之ARMv8-A(AArch64浮点与NEON)
- Eclipse+Maven+Nexus+Tomcat远程搭建CentOS web server
- element---组件--form
热门文章
- sql server XML中value(),exists(),nodes()方法
- python repl_Python自学第二天 REPL+基础语法
- android短信接收处理和发送
- 关于jupyter notebook闪退问题【我真真的够了,大家以后不要乱捣鼓电脑了,绝了】
- iOS 启动优化和安装包瘦身
- itpt_TCPL 第五章:指针和数组 - 第八章:UNIX系统接口
- linux系统无线网卡驱动安装,在linux上怎么安装无线网卡驱动?
- (个人记录)安装pycocotools库出现Could not build wheels for pycocotools which use PEP 517 and cannot be install
- 冒泡排序和快速排序的效率比较
- 数学重要公式--笔记