在随机预言机模型下,将BLS签名的密钥不可泄露规约到DL问题
时间: 2024-04-26 17:21:44 浏览: 146
在随机预言机模型下,将BLS签名的密钥不可泄露规约到DL问题的做法是使用随机预言机并结合离散对数问题。具体来说,BLS签名算法使用了一个特殊的双线性映射,将签名者的私钥(一个整数)映射到一个点上,这个点可以看做是椭圆曲线上的一个点。因此,要保证私钥的安全,就需要证明这个点是离散对数问题的困难实例。在随机预言机模型中,可以使用随机预言机来生成一个随机数,将这个随机数与椭圆曲线上的点相乘,得到一个新的点。为了证明这个新点也是离散对数问题的困难实例,就需要证明这个新点与原来的点之间存在困难实例的关系。这个关系可以用双线性映射来刻画,因此就可以将BLS签名的密钥不可泄露规约到DL问题。
相关问题
BLS 签名和基于 BLS 签名的门限签名
### 回答1:
BLS签名是一种基于双线性映射的签名算法,它能够实现高效的签名和验证,并且具有短签名长度和高安全性的特点。BLS签名算法的安全性基于双线性映射的困难性假设,这是一种广泛被接受的数学假设。
基于BLS签名的门限签名是一种多方签名方案,它允许一个签名被多个参与者分别生成部分签名,然后这些部分签名可以通过一定的算法合并成最终的签名。BLS门限签名可以实现高效的签名和验证,并且具有短签名长度和高安全性的特点,同时具有较好的可扩展性和灵活性,适用于多种应用场景。BLS门限签名的安全性基于BLS签名算法的安全性假设以及其他数学假设,如离散对数难题等。
### 回答2:
BLS签名是一种基于椭圆曲线的数字签名算法,具有高效和安全的特点。它利用配对运算和离散对数问题的困难性来实现签名操作。
BLS签名的过程包括密钥生成、签名和验证三个步骤。首先,生成者利用椭圆曲线上的离散对数问题生成一个私钥,并通过该私钥计算得到对应的公钥。然后,生成者利用私钥和消息进行签名,生成一个数字签名。最后,使用者可以利用公钥、消息和数字签名对签名的有效性进行验证。
基于BLS签名的门限签名是一种多方参与的数字签名方案,其中签名的生成必须依赖多个参与者的私钥,并且只有当达到设定的门限值时,签名才会有效。这种签名方案的好处在于,不需要将所有参与者的私钥集中在一处进行签名操作,从而提高了安全性。
在基于BLS签名的门限签名方案中,首先需要多方参与者各自生成私钥,并通过配对运算将所有的公钥合并成一个公钥。然后,参与者在签名生成过程中分别利用自己的私钥和消息进行签名操作,最终将所有的签名合并成一个有效的签名。验证者可以通过公钥、消息和合并的签名来验证签名的有效性。
总之,BLS签名是一种高效和安全的数字签名算法,而基于BLS签名的门限签名则在多方参与的场景中提供了更高的安全性和灵活性。
在miracl库下用C语言写BLS签名的代码
以下是使用miracl库在C语言中实现BLS签名的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include "miracl.h"
#define BLS_CURVE "BLS381" // 使用的椭圆曲线名称
int main()
{
// 初始化miracl库
miracl* mip = mirsys(1000, 16);
mip->IOBASE = 16;
// 初始化BLS曲线参数
epoint* P = epoint_init();
Big q = mirvar(0);
Big r = mirvar(0);
Big h = mirvar(0);
char* param = BLS_CURVE;
ecurve_init(param, q, r, h, 1);
epoint_copy(&CURVE_G_POINT, P);
// 生成私钥
Big sk = mirvar(0);
strong_bigrand(mip, q, sk);
// 计算公钥
epoint* pk = epoint_init();
ecurve_mult(sk, P, pk);
// 签名消息
char* msg = "hello, world!";
Big m = mirvar(0);
mip->IOBASE = 256;
cinstr(m, msg);
mip->IOBASE = 16;
Big sig = mirvar(0);
ehashit(mip, SHA2, -1, msg, strlen(msg), sig);
epoint* s = epoint_init();
ecurve_mult(sig, P, s);
// 输出结果
printf("private key: %s\n", big_to_str(sk, NULL, 16));
printf("public key: %s\n", epoint_to_str(pk, NULL, 16));
printf("message: %s\n", msg);
printf("signature: %s\n", epoint_to_str(s, NULL, 16));
// 释放资源
mirkill(sk);
mirkill(q);
mirkill(r);
mirkill(h);
epoint_free(P);
epoint_free(pk);
epoint_free(s);
mirkill(sig);
mirkill(m);
mirkill(mip);
return 0;
}
```
该示例中使用的是BLS381曲线,私钥使用随机数生成,公钥通过私钥和基点P的乘法计算得到。签名时,首先使用哈希函数计算消息的哈希值,然后将哈希值作为标量乘以基点P得到签名的点S。最后输出私钥、公钥、消息和签名的点。注意,在实际应用中,为了安全性,应该使用更安全的哈希函数,例如SHA-3。
阅读全文
相关推荐















