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