各种签密算法链接

BF签密算法Java实现(JPBC)

BF加密

Ident.java

package com.xyl.yes;public interface Ident { void buildSystem();void extractSecretKey();void encrypt();void decrypt();}

BasicIdent2.java

package com.xyl.yes;import java.lang.reflect.Proxy;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 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() {PairingFactory.getInstance().setUsePBCWhenPossible(true);pairing = PairingFactory.getPairing("a.properties");//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("密钥不对称!");}}@Overridepublic void buildSystem() {System.out.println("-------------------系统建立阶段----------------------");s = Zr.newRandomElement().getImmutable();// //随机生成主密钥sP = G1.newRandomElement().getImmutable();// 生成G1的生成元PPpub = P.mulZn(s);// 计算Ppub=sP,注意顺序System.out.println("P=" + P);System.out.println("s=" + s);System.out.println("Ppub=" + Ppub);}@Overridepublic void extractSecretKey() {System.out.println("-------------------密钥提取阶段----------------------");Qu = pairing.getG1().newElement().setFromHash("IDggjjhjkkku".getBytes(), 0, 3).getImmutable();// //从长度为3的Hash值IDu确定用户U产生的公钥QuSu = Qu.mulZn(s).getImmutable();System.out.println("Qu=" + Qu);System.out.println("Su=" + Su);}@Overridepublic 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);}@Overridepublic 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();}}

TimeCountProxyHandle.java

package com.xyl.yes;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class TimeCountProxyHandle implements InvocationHandler {private Object proxied;public TimeCountProxyHandle(Object obj) {proxied = obj;}@Overridepublic 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;}
}

验证双线性

package com.xyl.jpbctest;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 JPBCTest {public static void main(String[] args) {Pairing bp = PairingFactory.getPairing("a.properties");Field G1 = bp.getG1();Field Zr = bp.getZr();Element g = G1.newRandomElement();Element a = Zr.newRandomElement();Element b = Zr.newRandomElement();Element g_a = g.duplicate().powZn(a);Element g_b = g.duplicate().powZn(b);Element egg1 = bp.pairing(g_a, g_b);Element egg2 = bp.pairing(g, g);Element ab = a.duplicate().mul(b);Element egg3 = egg2.duplicate().powZn(ab);if(egg1.isEqual(egg3)){System.out.println(true);}else{throw new RuntimeException("双线性验证不成功");}}
}

BLS签名

package com.xyl.jpbctest;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;import java.util.Scanner;public class BLSTest {public static void main(String[] args) {System.out.println("*************************密钥生成*************************");Pairing pairing = PairingFactory.getPairing("a.properties");//由工厂类生成Pairing对象Field G1 = pairing.getG1();//Pairing对象获取G1循环加法群Field Zr = pairing.getZr();//Pairing对象获取Zr群,用于随机选取私钥Element g = G1.newRandomElement();//G1随机生成G1的生成元Element x = Zr.newRandomElement();//Zr群中随机选取一个元素作为生成元xElement g_x = g.duplicate().powZn(x);//公钥System.out.println("G1="+G1);System.out.println("Zr="+Zr);System.out.println("g="+g);System.out.println("私钥"+x);System.out.println("公钥g_x="+g_x);System.out.println("***************************签名***************************");System.out.println("请输入要加密的消息:");Scanner scanner = new Scanner(System.in);String m = scanner.next();//String m="message";//明文byte[] bytes = Integer.toString(m.hashCode()).getBytes();//哈希明文,将整数转为字符串进而调用字符串获取字节数组的方法Element h = G1.newElementFromHash(bytes, 0, bytes.length);//将明文m映射为G1群中的元素Element s = h.duplicate().powZn(x);//x对m的签名System.out.println("h="+h);System.out.println("s="+s);System.out.println("***************************验签***************************");Element pairing1 = pairing.pairing(g, s);Element pairing2 = pairing.pairing(h, g_x);System.out.println("pairing1="+pairing1);System.out.println("pairing2="+pairing2);if (pairing1.isEqual(pairing2)){System.out.println("验签成功");}else{throw new RuntimeException("验签失败!");}/*// InitializationPairing bp = PairingFactory.getPairing("a.properties");Field G1 = bp.getG1();Field Zr = bp.getZr();Element g = G1.newRandomElement();Element x = Zr.newRandomElement();Element g_x = g.duplicate().powZn(x);System.out.println("G1="+G1);System.out.println("Zr="+Zr);System.out.println("g="+g);System.out.println("x="+x);System.out.println("g_x="+g_x);//SigningString m = "message";byte[] m_hash = Integer.toString(m.hashCode()).getBytes();Element h = G1.newElementFromHash(m_hash, 0, m_hash.length);Element sig = h.duplicate().powZn(x);System.out.println("h="+h);System.out.println("sig="+sig);//VerificationElement pl = bp.pairing(g, sig);Element pr = bp.pairing(h, g_x);System.out.println("pl="+pl);System.out.println("pr="+pr);if (pl.isEqual(pr))System.out.println("Yes");elseSystem.out.println("No");*/}
}

持续更新ing

数字签密算法JPBC实现相关推荐

  1. oracle ecc 是什么意思,使用ECC的身份混合签密方案

    1997年,郑玉良教授[提出的签密能够在一个合理的逻辑步骤内同时实现公钥加密和数字签名两项功能,且其计算量和通信成本远远低于传统的先签名后加密的方法.此后,签密[得到了快速发展,成为密码学研究领域的重 ...

  2. 主流CA吊销俄罗斯数字证书启示:升级国密算法SSL证书,助力我国网络安全自主可控

    随着国际和民间黑客组织的加入,俄乌的战争快速蔓延成一场全球化的网络信息战.国际上主流CA机构不再为俄罗斯提供数字证书服务,甚至吊销俄罗斯相关的一些国家基础设施网站的证书.这让俄罗斯不得不开始建立国家C ...

  3. 国家医保移动支付国密算法SM2签名验签、SM4加解密DLL

    国家医保移动支付国密算法SM2签名验签.SM4加解密DLL 支持医保移动支付(国家统一版), 已知省份有广西.贵州.安徽.河北.黑龙江.湖南.吉林.江苏.四川.新疆等各地方. DLL,非.net开发, ...

  4. 国密算法SM2加解密_签名验签图形化例子

    点击上方蓝字可直接关注!方便下次阅读.如果对你有帮助,麻烦点个在看或点个赞,感谢~ 国密SM2概述 对国密算法有了解的朋友看到SM2可能会先想到非对称加密,之前的SM4是对称加密.SM4加解密使用的是 ...

  5. java 数字信封_使用加密狗的国密算法实现B/S架构数字信封

    一.程序逻辑 加密-上传 浏览器发起A用户的上传请求 服务端生成会话密钥Ks,用A用户的公钥Ka进行SM2加密为密钥Ks',发给浏览器 浏览器收到加密后的会话 密钥Ks',用A用户的私钥Ka'进行SM ...

  6. 加解密算法及国密算法介绍

    图片内容参看我的网站:www.waltersun.cn 引言 随着信息化的推进,信息安全越来越受到人们的重视.这篇文章简单介绍了常用的密码算法.原理.使用场景,简单比较国密算法,可作为业务使用的入门指 ...

  7. 密码学系列 - 国密算法

    国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4,SM9.密钥长度和分组长度均为128位. 国密算法种类 SM1 为对称加密.其加密强度与AES相当.该算法不公开,调用该算法时 ...

  8. SM2 (含SM3、SM4)国密算法工具QT版,彻底搞懂sm2算法的使用

    网上有很多网友问算法SM2怎么使用?什么是压缩公钥和非压缩公钥?xB和yB这参数是什么?怎么使用SM2做加解密?如何签名和验签?有没有工具来验证下? 这里分享个自己用QT造的一个小工具,简单好用,同时 ...

  9. GmSSL制作国密算法自签证书和 HTTPS 配置

    GmSSL 是一个开源(遵循 BSD 协议)的密码工具箱,支持 SM2 / SM3 / SM4 / SM9 / ZUC 等国密(国家商用密码)算法.SM2 国密数字证书及基于 SM2 证书的 SSL ...

最新文章

  1. R语言构建xgboost模型:使用xgboost模型训练tweedie回归模型,特征工程(dataframe转化到data.table、独热编码、缺失值删除、DMatrix结构生成)
  2. Apache软件历史版本下载地址
  3. 支付宝支付 第二集:傻瓜式教程->获取支付的RSA公钥和私钥
  4. Linux 软件包管理命令
  5. build vue 静态化_页面静态化
  6. python学习(四)--POST请求
  7. python如何读取数据保存为新格式_Python Numpy中数据的常用保存与读取方法
  8. 交叉验证和超参数调整:如何优化您的机器学习模型
  9. 【转】ABP源码分析四十一:ZERO的Audit,Setting,Background Job
  10. OpenResty 安装,收集日志保存到文本文件
  11. 必看总结!深度学习时代您应该阅读的10篇文章了解图像分类!
  12. 用户不在sudoers文件中,此事将被报告
  13. 基于Jupyter完成Iris数据集的 Fisher线性分类,学习数据可视化技术
  14. 20220527_数据库过程_语句留档
  15. DOE实验设计操作手册
  16. Node图片识别文字
  17. 数据分析/运营——数据异常的排查方法
  18. 一路狂奔的“幸运咖”,再造下一个“蜜雪冰城”?
  19. leetcode 17. 电话号码的字母组合
  20. tomcat 6x and 7x https配置

热门文章

  1. nodeJS之repl
  2. thinkPHP6报错:Failed to listen on 0.0.0.0:8000 (reason: һַȨ޲“
  3. iphone微信用计算机隐身,苹果手机使用微信不能换行?原来隐藏键在这,网友:冷知识...
  4. Telephone--短信发送/接收流程
  5. SimpleFOC之ESP32(二)—— 开环控制
  6. java猴子分桃问题_通俗易懂、简单粗暴得解决猴子分桃问题
  7. latex 调整图片大小
  8. 2020北京邮电大学计算机学院803初试经验分享
  9. 微信摇一摇周边 红包
  10. miniGUI-4.0.2 交叉编译