PBC Library Manual(PBC库手册)翻译(五)_rbits:160 qbits:512-程序员宅基地

技术标签: c语言  PBC Library  密码学  

目录

 

5.参数(Param)函数

 5.1 Param生成


5.参数(Param)函数

Pairing是由 pairing parameter初始化得到,这些参数是pbc_param_t类型的对象。一些应用程序可以忽略此数据类型,因为pairing_init_set_str()函数在后台处理了这类数据:这个函数读取了一个字符串作为一个pbc_param_t,然后使用这些参数初始化了pairing。

// 从字符串s初始化pairing参数,成功则返回0,其他情况返回1
int pbc_param_init_set_str(pbc_param_t par, const char *s)

// 同样的,但是最多读取len个字节。如果len为0,这个函数和上面的函数相同
// 成功则返回0,其他情况返回1
int pbc_param_init_set_buf(pbc_param_t par, const char *s, size_t len)

// 以文本格式将pairing参数写入“stream”文件句柄
void pbc_param_out_str(FILE *stream, pbc_param_t p)

// 释放p。当p不再用时释放它
void pbc_param_clear(pbc_param_t p)

 5.1 Param生成

在param子目录中的这些参数用于准备示例参数。

我们大致按照发现的顺序用大写字母来标记pairing族,以便我们查阅。A类型是最快的。当元素需要很短且速度较慢时,D类型是一个不错的选择。F类型元素更短,但是速度也更慢。速度差异依赖于硬件,并且使用预处理时也会发生变化。B类型和C类型未实现。

pbc_cm_t数据类型保存用于生成D类型和G类型曲线的CM参数。

// 初始化cm
void pbc_cm_init(pbc_cm_t cm)

// 释放cm
void pbc_cm_clear(pbc_cm_t cm)

int pbc_cm_search_d(int(*callback)(pbc_cm_t, void*), void *data, unsigned int D, unsigned int bitlimit)

对于给定的判别式D,搜索适合于密码学的D类型pairing(嵌入度为6的MNT曲线)。群的阶数最多是bitlimit位。对于找到的每一组CM参数,调用带有pbc_cm_t和给定的void*的callback函数。如果callback返回非0,停止查找并且返回那个值,否则返回0。


int pbc_cm_search_g(int(*callback)(pbc_cm_t, void*), void *data, unsigned int D, unsigned int bitlimit)

 对于给定的判别式D,查找适合于密码学的G类型pairing(Freeman曲线)。群的阶数最多是bitlimit位。对于找到的每一组CM参数,调用带有pbc_cm_t和给定的void*的callback函数。如果callback返回非0,停止查找并且返回那个值,否则返回0。


void pbc_param_init_a_gen(pbc_param_t par, int rbits, int qbits)

 生成A类型pairing参数,并存储在par中,其中群的阶数r为 rbits 长,并且基域q的阶数为 qbits 长。元素以 qbits 来代表。

为了安全起见,一般的离散对数算法在阶r的群中必须不可行(infeasible),有限域离散对数算法在阶 q^2 的有限域中必须不可行, 例如,rbits = 160,qbits = 512。

param/a.param文件包含适合密码学使用的类型A的参数。


void pbc_param_init_i_gen(pbc_param_t par, int group_size)

 生成I类型pairing参数,并存储在par中,其中群阶数至少为2^group_size。

要像64位对称加密一样的安全,group_sie 可以是150。为了获得128位对称加密算法的安全级别,group_size可以是694。

param/i.param文件包含适合密码学使用的类型I的参数。


void pbc_param_init_a1_gen(pbc_param_t param, mpz_t n)

生成A1类型的pairing参数并存储在param中。群的阶数为n。基域的阶数要稍微长一些。为了安全起见,一般的离散对数算法必须在阶数n的群中不可行,有限域离散对数算法在阶大约为n^2的有限域中不可行。此外,n应该很难因数分解。

例如:n是两个素数的乘积,每个素数至少512位。

param/a1.param文件包含A1类型pairing的样本参数,但是它仅用于基准测试:如果没有n(群的阶数)的分解因数是没有用的。


void pbc_param_init_d_gen(pbc_param_t p, pbc_cm_t cm)

 D型曲线是使用复数乘法(complex multiplication, CM)方法生成的。这个函数将p设置为来自于CM参数 cm 的D类型pairing的参数其他库调用搜索适当的CM参数,结果可以传递给这个函数。

为了安全起见,一般的离散对数算法在阶r的群中必须不可行(infeasible),有限域离散对数算法在阶 q^6 的有限域中必须不可行。对于通常的CM参数,r比q小几个比特。

使用D类型的pairing允许群G1的元素非常的短,通常为170位。由于某种技巧,G2群的元素只需要3倍长,也就是大约510位,而不是6倍长。这不像F型pairing那么短,但是速度快很多。

我有时把D型曲线称为数字的三元组:判别式、素数q中的比特数、素数r中的比特数。gen/listmnt程序打印出了这几个数。

在捆绑的D型曲线的参数为曲线9563-201-181,62003-159-158和496659-224-224,分别缩写为param/d201.param, param/d159.param, 和param/d225.param。

有关如何生成D类型的pairing参数,参照gen/listmnt.c和gen/gendparam.c。


void pbc_param_init_e_gen(pbc_param_t p, int rbits, int qbits)

 生成E类型的pairing参数并存储在p中,其中群的阶数r为 rbits长,基域的阶数q为 qbits长。为了安全起见,一般的离散对数算法在阶r的群中必须不可行(infeasible),有限域离散对数算法在阶 q 的有限域中必须不可行, 例如,rbits = 160,qbits = 1024。

这个pairing只是一种好奇:它完全可以素数阶的域中实现,也就是说,只需要素数取算数模。并且不需要拓展一个域。

如果离散对数在域拓展中被发现比以前认为的更容易解决,或者离散对数在椭圆曲线中可以像在有限域中一样容易解决,那么这个pairing类型会变得有用。


void pbc_param_init_f_gen(pbc_param_t p, int bits)

 生成F类型的pairing参数并存储在p中。群的阶数r和基域的阶数q都大致为bits位的数字。为了安全起见,一般的离散对数算法在阶r的群中必须不可行(infeasible),有限域离散对数算法在阶 q^12 的有限域中必须不可行,例如bits = 160。

当最小化带宽最重要时(如短签名),应该使用F类型。目前F类型的实现使其很缓慢。

如果有限域离散对数算法进一步改进,D类型的pairing将不得不使用更大的域,但是F类型在一定程度上仍然可以保持很短。


void pbc_param_init_g_gen(pbc_param_t p, pbc_cm_t cm)

 G型曲线可以使用复数乘法(CM)方法生成。这个函数将从CM参数 cm 设置p为G类型pairing的参数。嵌入度为10。

为了安全起见,一般的离散对数算法在阶r的群中必须不可行(infeasible),有限域离散对数算法在阶 q^6 的有限域中必须不可行。对于通常的CM参数,r比q要小几位。

目前它的速度很慢,所以F型是更好的选择。

param/g149.param文件包含一个群和域都是149位的G类型 pairing参数。

 

注:由于本章的内容自己理解的较浅,且涉及到一些不懂得数学知识,翻译的不是很通顺和标准,有误之处请指出。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40115871/article/details/107586310

智能推荐

利用nc测试服务器之间端口之间的连通性_nc udp端口测试 多次连接-程序员宅基地

文章浏览阅读4.7k次,点赞2次,收藏5次。1. nc安装方法一:yum -y install nc方法二:下载离线安装rpm安装包,下载地址:http://vault.centos.org/6.6/os/x86_64/Packages/nc-1.84-22.el6.x86_64.rpm安装命令:rpm -iUv nc-1.84-22.el6.x86_64.rpm2.TCP端口测试如监测两台机器:192.168.130.1 ..._nc udp端口测试 多次连接

网页开发学习(一):制作一份邀请函_邀请函编程-程序员宅基地

文章浏览阅读4.6k次,点赞15次,收藏27次。网页开发设计是在面试创新实验室时面试官给的二面试题,让自己设计实现一个简单的网页。所以我决定来做一个邀请函网页,并将开发过程写在博客上供有需要的朋友们查看。 网页开发工具有很多,我使用的是对新手较为友好的Dreamweaver,其优点在于简便、直观、功能丰富,简称为“傻瓜化”。下载请点击这里。1.1 创建首个HTML5页面在准备好的开发工具中,首先输入第一行HTML代码,如下:..._邀请函编程

时间序列分析这件小事(一)--基本概念与R-studio入门_rstudio滞后一期输入l-程序员宅基地

文章浏览阅读1.1w次,点赞8次,收藏44次。无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。教程链接:https://www.cbedai.net/qtlyx数据处理,python其实比R有很多优势,但是,单纯的做一些实验和研究,其实R更加合适,特别是时间序列分析,R的包很完备。1.时间序列基本概念首先,我们讲一下什么是时间..._rstudio滞后一期输入l

EBS OAF 部署第三方Jar包-程序员宅基地

文章浏览阅读431次。【声明】:转载请注明出处!进行OAF开发时有时需引入第三方Jar包,并部署到服务器。步骤如下:step1: 将Jar包上传到以下路径$FND_TOP/java/3rdparty/stdalonestep2: 将Jar包绝对路径添加到下面文件中$ORA_CONFIG_HOME/10.1.3/j2ee/oacore/application-deployment..._oracle ebs oaf的第三方jar包要怎么引入系统

windows ping 端口测试_ping 80端口-程序员宅基地

文章浏览阅读1.6w次,点赞4次,收藏4次。前言 项目中存在能ping通IP地址,但是打不开web应用程序,这时需要测试端口能否ping通。解决方法 测试是否能够ping通192.168.0.1的80端口 telnet 192.168.0.1 80遇到问题 ‘telnet’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。解决方法..._ping 80端口

【Linux】糟糕,是心动的感觉——与Linux的初次相遇-程序员宅基地

文章浏览阅读1.6k次,点赞39次,收藏45次。【Linux】初识Linux——了解操作系统的发展历史以及初次体验Linux编程环境

随便推点

三种方式实现双飞翼布局_flex实现双飞翼布局-程序员宅基地

文章浏览阅读289次。双飞翼布局的三种方式_flex实现双飞翼布局

driud和JDBCTemplate问题:java.lang.NoClassDefFoundError: org/springframework/dao/DataAccessException-程序员宅基地

文章浏览阅读173次。错误描述: java.lang.NoClassDefFoundError: org/springframework/dao/DataAccessException解决方案:在正确路径下建立 lib 包。路径为:WEB-INF 目录下的 lib 目录,目录名不能写成别的,加个 s 都不行。

php常用调试工具_php常用的调试-程序员宅基地

文章浏览阅读437次。1.常用调试函数:echo:是命令,不能返回值。echo后面可以跟很多个参数,之间用分号隔开;print:可以返回一个值,只能有一个参数;print_r():显示关于一个变量的易于理解的信息。如果给出的是 string、integer 或 float,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素。object 与数组类似。print_r() 将把数组的指_php常用的调试

android锁屏唤醒并解锁屏幕_macrodroid屏幕开-程序员宅基地

文章浏览阅读1.2w次。1、这个方法是实现锁屏状态下唤醒手机,亮屏并解锁屏幕: public static void wakeUpAndUnlock(Context context){ //屏锁管理器 KeyguardManager km= (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); Keygua_macrodroid屏幕开

实现线程同步之线程锁以及理解_线程锁的作用-程序员宅基地

文章浏览阅读1.1k次。线程锁的作用: 当多个线程同时进行任务时,为保证不会有多个线程对同一个数据进行操作造成不可预料的后果,加个锁,将此时的线 程变为单线程进行操作。当多个线程同时执行lock.acquire时,只有一个线程能成功地获取锁,然后继续执行代码,其他线程就继续等待直到获得 锁为止。 获得锁的线程用完后一定要释放锁,否则那些苦苦等待锁的线程将永远等待下去,成为死线程。线程锁..._线程锁的作用

文件-单位转换_从文件in162.txt中连续读入10个以磅为单位的重量值,将其转换为以千克为单位的值并-程序员宅基地

文章浏览阅读3.1k次,点赞14次,收藏16次。项目场景:文件操作问题描述:提示:这里描述项目中遇到的问题:从文件in162.txt中连续读入10个以磅为单位的重量值,将其转换为以千克为单位的值并求和,将计算所得的和sum输出到文件out162.txt中。说明:一磅等于0.454千克。原因分析:提示:这里填写问题的分析:将文件中第一行读取出来,遍历相加即可解决方案:提示:这里填写该问题的具体解决方案:fd1 = open("in162.txt", "r")sum = 0count = 0line = fd1.re_从文件in162.txt中连续读入10个以磅为单位的重量值,将其转换为以千克为单位的值并