PBC在Windows上-无法保存元素
PBC on Windows - Unable to save element
我在Windows上使用PBC,当我使用以下代码时,无论是字节方法还是人类可读的字符串方法,我都无法保存元素gx(注意它是一个幂:g^x)。注意到上面的代码是BLS,BLS公钥包括gx,但不包括x(它是私有的),我该如何处理它?
#include <stdlib.h>
#include <string.h>
#include <pbc.h>
// BLS structures
struct bls_sys_param_s {
pairing_ptr pairing;
element_t g;
int signature_length;
};
typedef struct bls_sys_param_s bls_sys_param_t[1];
typedef struct bls_sys_param_s *bls_sys_param_ptr;
struct bls_private_key_s {
bls_sys_param_ptr param;
element_t x;
};
typedef struct bls_private_key_s bls_private_key_t[1];
typedef struct bls_private_key_s *bls_private_key_ptr;
struct bls_public_key_s {
bls_sys_param_ptr param;
element_t gx;
};
typedef struct bls_public_key_s bls_public_key_t[1];
typedef struct bls_public_key_s *bls_public_key_ptr;
void bls_sign(unsigned char *sig, unsigned int hashlen, unsigned char *hash,
bls_private_key_t sk)
{
element_t h;
element_init_G1(h, sk->param->pairing);
element_from_hash(h, hash, hashlen);
element_pow_zn(h, h, sk->x);
element_to_bytes_x_only(sig, h);
element_clear(h);
}
int bls_verify(unsigned char *sig, unsigned int hashlen, unsigned char *hash,
bls_public_key_t pk)
{
//have to mess with internals since we are only given the x-coord
element_t hx;
element_t h;
int res;
pairing_ptr pairing = pk->param->pairing;
element_init_G1(h, pairing);
element_from_hash(h, hash, hashlen);
element_init_G1(hx, pairing);
element_from_bytes_x_only(hx, sig);
res = is_almost_coddh(h, hx, pk->param->g, pk->gx, pk->param->pairing);
element_clear(hx);
element_clear(h);
return res;
}
void bls_clear_sys_param(bls_sys_param_t param)
{
element_clear(param->g);
}
void bls_clear_public_key(bls_public_key_t pk)
{
element_clear(pk->gx);
}
void bls_clear_private_key(bls_private_key_t sk)
{
element_clear(sk->x);
}
int main() {
pairing_t pairing;
bls_sys_param_t param;
bls_public_key_t pk;
bls_private_key_t sk;
unsigned char *sig;
const char p[] = "";
int n;
unsigned char *gen_x;
printf("reading data...n");
// Pairing Initialization
pairing_init_set_str(pairing, p);
// Parameter Initialization
param->pairing = pairing;
param->signature_length = pairing_length_in_bytes_x_only_G1(pairing);
element_init_G2(param->g, pairing);
element_random(param->g);
//element_out_str(stdout, 32, param->g);
// Public/Private Key Initialization
pk->param = sk->param = param;
element_init_G2(pk->gx, param->pairing);
element_init_Zr(sk->x, param->pairing);
element_random(sk->x);
//element_out_str(stdout, 32, sk->x);
element_pow_zn(pk->gx, param->g, sk->x);
//element_out_str(stdout, 32, pk->gx);
n = element_length_in_bytes(pk->gx);
gen_x = (unsigned char *)malloc(n*sizeof(unsigned char));
printf("%d %dn", n, element_to_bytes(gen_x, pk->gx));
sig = (unsigned char *)pbc_malloc(param->signature_length);
printf("signing...n");
bls_sign(sig, 11, (unsigned char *) "hello world", sk);
printf("verifying...n");
if (bls_verify(sig, 11, (unsigned char *) "hello world", pk)) {
printf("signature verifiesn");
}
else {
printf("signature does not verifyn");
}
pbc_free(sig);
bls_clear_public_key(pk);
bls_clear_private_key(sk);
bls_clear_sys_param(param);
pairing_clear(pairing);
return 0;
}
很抱歉,但我无法透露我正在使用的参数,但您可以执行以下操作:使用"gengparam.exe>>gm.param"(或其他生成,如"genaparam.exe")生成一个配对,然后将gm.param内容复制到p常量表中(注意用"\n"替换新行,前后不带任何空格,仅限已存在的行)。注意,这里,g和x是随机元素。。。
我只是想以某种方式保存gx,以便将其作为公钥常量的一部分提供,正如我已经提到的,x不能是公钥的一部分。
也许您可以尝试element_printf(),例如
element_printf("%Bn", pk->gx);
如果您想序列化任何元素,请考虑使用element_to_bytes()和element_from_bytes()函数。更多详细信息请点击此处。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- std::矢量保存 只推送最后一个元素
- clang格式:如何将构造函数的初始值设定项列表的每个元素保存在单独的行上
- 如何将INT保存在字符串中到数组中的元素
- 在基于对话框的MFC应用程序中保存和恢复元素的状态
- 将排序的元素保存在文本文件 C++ 中
- 将结构的 c++ 数组保存到文件和问题中以向其添加新元素
- 用于将枚举元素名称和值保存到文件的 C++ 宏
- 将包含子元素的整个QGraphicScene保存到一个文件中
- PBC在Windows上-无法保存元素
- 指针的元素保存为乱码
- 是否可以保存std::list中新插入元素的迭代器,然后使用该迭代器安全地擦除该元素?
- 是数组中连续保存在内存中的元素