RELIC库学习
《RELIC库学习》
了解
RELIC是由Diego F. Aranha开发的高效、灵活的开源密码原语工具箱,包含多精度整数运算、有限域(包含素数域和二元域)运算、椭圆曲线、双线性映射和扩域运算、密码协议(如RSA、Rabin、ECDSA、BLS短签名、BB短签名、Paillier同态加密方案等),支持不同安全等级、多种优化实现方法和多平台运行,在学术界和工业界均得到了广泛应用。
只依赖于GMP库
2022年11月7日,武汉大学密码学与区块链技术实验室向开源项目RELIC贡献了国密算法代码。
具体贡献:
- 增加了该项目对SM2椭圆曲线参数的支持
- 修正了SM9算法参数下双线性映射的实现代码
实验结果:
配置64位Ubuntu操作系统、Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz、14GB内存的主机上,基于GMP库,使用RELIC实现SM2/9算法中核心运算的性能如下:


以上是SM2和SM9的测试结果。
安装
环境:Centos7
依赖:安装GMP库,参考:https://www.cnblogs.com/pam-sh/p/16750646.html
git clone https://github.com/relic-toolkit/relic.git
cd relic
mkdir build
cd build
cmake ..
make
测试
测试:demo/psi-client-server
- Added several laconic Private Set Intersection (PSI) protocols from https://eprint.iacr.org/2022/529
# 修改makefile文件

make
./receiver
./sender
测试:paillier算法(demo/general-paillier)
static int paillier(void) {
int code = RLC_ERR;
bn_t a, b, c, d, s, pub, prv;
int result;
bn_null(a);
bn_null(b);
bn_null(c);
bn_null(d);
bn_null(pub);
bn_null(prv);
RLC_TRY {
bn_new(a);
bn_new(b);
bn_new(c);
bn_new(d);
bn_new(pub);
bn_new(prv);
/* Generate 2048-bit public and private keys (both integers). */
result = cp_ghpe_gen(pub, prv, 2048);
assert(result == RLC_OK);
printf("Public key:\n");
bn_print(pub);
printf("Private key:\n");
bn_print(prv);
for (int s = 1; s <= 2; s++) {
util_print("Testing generalized paillier for (s = %d)\n", s);
// 加解密测试
/* Generate plaintext smaller than n^s. */
bn_rand(a, RLC_POS, s * (bn_bits(pub) - 1)); //明文随机数a
/* Encrypt, decrypt and check if the result is the same. */
assert(cp_ghpe_enc(c, a, pub, s) == RLC_OK); //密文c
assert(cp_ghpe_dec(b, c, pub, prv, s) == RLC_OK); //解密测试b
assert(bn_cmp(a, b) == RLC_EQ);
//同态性测试:Dec(c*d)=a+b
/* Generate new plaintexts smaller than n^s. */
bn_rand(a, RLC_POS, s * (bn_bits(pub) - 1)); //明文a
bn_rand(b, RLC_POS, s * (bn_bits(pub) - 1)); //明文b
/* Encrypt both plaintexts using the same public key. */
assert(cp_ghpe_enc(c, a, pub, s) == RLC_OK); //密文c
assert(cp_ghpe_enc(d, b, pub, s) == RLC_OK); //密文d
/* Now compute c = (d * c) mod n^(s + 1). */
bn_mul(c, c, d);
bn_sqr(d, pub);
if (s == 2) {
bn_mul(d, d, pub);
}
bn_mod(c, c, d);
/* Decrypt and check if result is (a + b) mod n^s. */
assert(cp_ghpe_dec(c, c, pub, prv, s) == RLC_OK);
bn_add(a, a, b);
bn_copy(d, pub);
if (s == 2) {
bn_mul(d, d, pub);
}
bn_mod(a, a, d);
assert(bn_cmp(a, c) == RLC_EQ);
}
}
RLC_CATCH_ANY {
RLC_ERROR(end);
}
code = RLC_OK;
end:
bn_free(a);
bn_free(b);
bn_free(c);
bn_free(d);
bn_free(prv);
bn_free(pub);
return code;
}

RELIC库学习的更多相关文章
- python 操作exls学习之路1-openpyxl库学习
这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...
- dlib库学习之一
dlib库学习之一 1.介绍 跨平台 C++ 通用库 Dlib 发布 ,带来了一些新特性,包括概率 CKY 解析器,使用批量同步并行计算模型来创建应用的工具,新增两个聚合算法:中国低语 (Chines ...
- python_库学习_01
一.python的库学习之 财经数据接口包 1.安装ThShare 直接pip install tushare 可能会出现缺少依赖库的情况,依次安装,大概有lxml,pandas,bs4,reques ...
- numpy, matplotlib库学习笔记
Numpy库学习笔记: 1.array() 创建数组或者转化数组 例如,把列表转化为数组 >>>Np.array([1,2,3,4,5]) Array([1,2,3,4,5]) ...
- python爬虫解析库学习
一.xpath库使用: 1.基本规则: 2.将文件转为HTML对象: html = etree.parse('./test.html', etree.HTMLParser()) result = et ...
- 【mmall】Guava库学习Collections
参考链接 Guava库学习:学习Collections(三)Sets
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...
- muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制
目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...
- muduo网络库学习笔记(三)TimerQueue定时器队列
目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...
- Libev库学习
Libev库学习 https://www.cnblogs.com/wunaozai/p/3950249.html Libev库学习(1)https://www.cnblogs.com/wunaozai ...
随机推荐
- JAVA 使用注解lombok@Builder和@Data,primary not found default constructor
由于添加@Builder会将@Data让类缺失无参构造器 应手动在实体中写构造函数并增加: @Tolerate 实体类名(){} 网上很多讲解 这里给一个我觉得讲的比较好的链接 https://www ...
- 源码开放:WebSocket应用示例
1 WebSocket概述 WebSocket是HTML5下一种新的协议(本质上是一个基于TCP的协议),它实现了浏览器与服务器之间的全双工通信,能够节省服务器资源和带宽,达到实时通讯的目的.WebS ...
- .NET +Vue 开发的高级报表工具
前言 本文介绍一款基于 .NET 6 开发的高级报表工具.该工具支持多种数据源(如数据库.Excel 文件.API 服务等),并具备强大的数据处理和可视化功能.通过内置的集合函数和类 Excel 界面 ...
- AI运动小程序开发常见问题集锦一
截止到现在写博文时,我们的AI运动识别小程序插件已经迭代了23个版本,成功应用于健身.体育.体测.AR互动等场景:为了让正在集成或者计划进行功能扩展优化的用户,少走弯路.投入更少的开发资源,我们归集了 ...
- ubuntu的apt源更新后只能装php8新版本,无法安装php7老版本了
新电脑更新apt源以后,发现新装的都是php8.1,而且apt源update后,search也找不到php7了. 于是找到了这篇文章 然后按照他说的做 sudo apt-get update sudo ...
- CSS3实现放大镜效果
市面上基本上所有的购物平台.商城上的商品详情页,对于商品的图片都是有放大功能.那么这个功能主要是怎么实现的呢?CSS3实现放大镜效果主要依赖于CSS的一些高级特性,如transform.transit ...
- Linux下使用谷歌输入法
Linux的中文输入法一直太烂,scim终于出来对googlePinyin的支持了. 安装步骤: 1.安装scim: sudo apt-get install scim 2.从git上checkout ...
- golang之常用开发工具
汇总平常开发中较为常用的工具 [sql2struct] 将MySQL快速生成struct github: https://github.com/idoubi/sql2struct
- golang之常用标准库汇总
1. import "runtime/debug" func Stack func Stack() []byte Stack 返回格式化的go程的调用栈踪迹. 对于每一个调用栈,它 ...
- element table 合并同类项并输出后台返回数据
table的样式如下 后台返回的数据格式是按照横着来的,因为表头是经过处理的,而且是作为独立出来的数据返给前端的,所以当我们进行数据填充的时候需要用到后台返回的完整的数据,要想一一对应的话,我们需要进 ...