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 ...
随机推荐
- [这可能是最好的Spring教程!]Maven的模块管理——如何拆分大项目并且用parent继承保证代码的简介性
问题的提出 在软件开发中,我们为了减少软件的复杂度,是不会把所有的功能都塞进一个模块之中的,塞在一个模块之中对于软件的管理无疑是极其困难且复杂的.所以把一个项目拆分为模块无疑是一个好方法 ┌ ─ ─ ...
- [TAD] Triangles of Absolute Differences-反帕斯卡三角形
[IMO2018] Triangles of Absolute Differences-反帕斯卡三角形 前言 叠甲 笔者不是学数竞的,在此感谢我的数竞生为我讲解题目. 笔者学艺不精,且知识面浅薄. 所 ...
- Air780E软件指南:UDP应用示例
一.UDP概述 UDP(用户数据报协议,UserDatagramProtocol)是一种无连接的.不可靠的传输层协议,主要用于实现网络中的快速通讯.以下是UDP通讯的主要特点: 1.1 无连接通讯: ...
- delphi Image 32 动画演示1
Image 32 自带的Demo,添加一些注解. unit uFrmAnimation; interface uses Winapi.Windows, Winapi.Messages, System. ...
- TPC-H、TPC-H、TPC-DS部署测试
TPC-H.TPC-H.TPC-DS部署测试 概述 TPC-C TPC-C是业界常用的一套Benchmark,用于评估在线事务处理(OLTP)系统性能的基准测试.它模拟了一个商品批发公司的销售模型,包 ...
- 一文详解:项目如何从Docker慢慢演变成了K8s部署
今天,我们将深入探讨一个项目部署的演变过程.在这篇文章中,为了紧扣主题,我们将从 Docker 开始讲解,分析为什么一个传统的项目逐步演变成了今天流行的 Kubernetes(K8s)集群部署架构.我 ...
- luasql使用问题记录:module 'luasql.mysql' not found
安装版本 # lua -v Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio # apisix version /usr/local/openres ...
- Javascript 常用封装(二)
1.字符串占位宽度 计算占位宽度:字符串的占位宽度除了涉及到具体的字符串内容,还与字体大小有关,可以将其放入Dom中来获取实际占位宽度 //计算字符串的占位宽度 function getTextWid ...
- 语音转文字-Microsoft Azure Speech Service与Web Speech API实战
简介 在现代技术驱动的世界中,语音识别已成为人机交互的重要方式.Microsoft Azure Speech Service 提供了强大的语音转文本功能,允许开发者轻松地将语音数据转换为文本.本文将指 ...
- 19号CSS学习
一.CSS的复合选择器 更高效的选择目标元素. 后代选择器.子选择器.并集选择器.伪类选择器等. 1.后代选择器 可以选择父元素里的子元素. 又称包含选择器. 必须是空格,必须是后代,ul li {c ...