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

# 修改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库学习的更多相关文章

  1. python 操作exls学习之路1-openpyxl库学习

    这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...

  2. dlib库学习之一

    dlib库学习之一 1.介绍 跨平台 C++ 通用库 Dlib 发布 ,带来了一些新特性,包括概率 CKY 解析器,使用批量同步并行计算模型来创建应用的工具,新增两个聚合算法:中国低语 (Chines ...

  3. python_库学习_01

    一.python的库学习之 财经数据接口包 1.安装ThShare 直接pip install tushare 可能会出现缺少依赖库的情况,依次安装,大概有lxml,pandas,bs4,reques ...

  4. numpy, matplotlib库学习笔记

    Numpy库学习笔记: 1.array()   创建数组或者转化数组 例如,把列表转化为数组 >>>Np.array([1,2,3,4,5]) Array([1,2,3,4,5]) ...

  5. python爬虫解析库学习

    一.xpath库使用: 1.基本规则: 2.将文件转为HTML对象: html = etree.parse('./test.html', etree.HTMLParser()) result = et ...

  6. 【mmall】Guava库学习Collections

    参考链接 Guava库学习:学习Collections(三)Sets

  7. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  8. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

  9. muduo网络库学习笔记(三)TimerQueue定时器队列

    目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...

  10. Libev库学习

    Libev库学习 https://www.cnblogs.com/wunaozai/p/3950249.html Libev库学习(1)https://www.cnblogs.com/wunaozai ...

随机推荐

  1. [这可能是最好的Spring教程!]Maven的模块管理——如何拆分大项目并且用parent继承保证代码的简介性

    问题的提出 在软件开发中,我们为了减少软件的复杂度,是不会把所有的功能都塞进一个模块之中的,塞在一个模块之中对于软件的管理无疑是极其困难且复杂的.所以把一个项目拆分为模块无疑是一个好方法 ┌ ─ ─ ...

  2. [TAD] Triangles of Absolute Differences-反帕斯卡三角形

    [IMO2018] Triangles of Absolute Differences-反帕斯卡三角形 前言 叠甲 笔者不是学数竞的,在此感谢我的数竞生为我讲解题目. 笔者学艺不精,且知识面浅薄. 所 ...

  3. Air780E软件指南:UDP应用示例

    一.UDP概述 UDP(用户数据报协议,UserDatagramProtocol)是一种无连接的.不可靠的传输层协议,主要用于实现网络中的快速通讯.以下是UDP通讯的主要特点: 1.1 无连接通讯: ...

  4. delphi Image 32 动画演示1

    Image 32 自带的Demo,添加一些注解. unit uFrmAnimation; interface uses Winapi.Windows, Winapi.Messages, System. ...

  5. TPC-H、TPC-H、TPC-DS部署测试

    TPC-H.TPC-H.TPC-DS部署测试 概述 TPC-C TPC-C是业界常用的一套Benchmark,用于评估在线事务处理(OLTP)系统性能的基准测试.它模拟了一个商品批发公司的销售模型,包 ...

  6. 一文详解:项目如何从Docker慢慢演变成了K8s部署

    今天,我们将深入探讨一个项目部署的演变过程.在这篇文章中,为了紧扣主题,我们将从 Docker 开始讲解,分析为什么一个传统的项目逐步演变成了今天流行的 Kubernetes(K8s)集群部署架构.我 ...

  7. 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 ...

  8. Javascript 常用封装(二)

    1.字符串占位宽度 计算占位宽度:字符串的占位宽度除了涉及到具体的字符串内容,还与字体大小有关,可以将其放入Dom中来获取实际占位宽度 //计算字符串的占位宽度 function getTextWid ...

  9. 语音转文字-Microsoft Azure Speech Service与Web Speech API实战

    简介 在现代技术驱动的世界中,语音识别已成为人机交互的重要方式.Microsoft Azure Speech Service 提供了强大的语音转文本功能,允许开发者轻松地将语音数据转换为文本.本文将指 ...

  10. 19号CSS学习

    一.CSS的复合选择器 更高效的选择目标元素. 后代选择器.子选择器.并集选择器.伪类选择器等. 1.后代选择器 可以选择父元素里的子元素. 又称包含选择器. 必须是空格,必须是后代,ul li {c ...