使用PBC将元素散列到另一个元素中

时间:2016-03-27 15:38:47

标签: c encryption serialization hash cryptography

我想在元素上应用哈希函数,并将哈希结果转换为另一个元素。现在我发现from-hash元素存在问题。也就是说,如果我使用element_to_bytes导出元素,我有时无法使用element_from_bytes将其转换回来,结果为零。请注意,每次原始的from-hash元素看起来都没问题。

这是我的代码

#include <pbc/pbc.h>
#include <openssl/ssl.h>
#include <openssl/sha.h>

static unsigned char IB_buffer[] = "type a\nq 8780710799663312522437781984754049815806883199414208211028653399266475630880222957078625179422662221423155858769582317459277713367317481324925129998224791\nh 12016012264891146079388821366740534204802954401251311822919615131047207289359704531102844802183906537786776\nr 730750818665451621361119245571504901405976559617\nexp2 159\nexp1 107\nsign1 1\nsign0 1";

static unsigned char ElGamal_buffer[] = "type a\nq 3482532951481000628301986563829128446394498473733574256155354161179984756582489073071203726645550500511910754640237238097789178205610570264167893261510851\nh 4765691481319237166326209176561481743805302555086541889992911935937234088304840923602596606875066432645316\nr 730750818665451459101842416367364881864821047297\nexp2 159\nexp1 63\nsign1 1\nsign0 1";

void Hash_function_2(element_t IB_e_GT_in,
                       element_t IB_e_G1_out)
{
  unsigned char buffer[130];
  unsigned char buffer_sha512[130];

  memset(buffer_sha512, '\0', 128);
  element_to_bytes(buffer, IB_e_GT_in);
  SHA512(buffer,
         element_length_in_bytes(IB_e_GT_in),
         buffer_sha512);
  element_from_bytes_x_only(IB_e_G1_out, buffer_sha512);
}

int main(int argc, char *argv[])
{
  unsigned char buffer[128];

  pairing_t IB_pairing;
  pairing_t ElGamal_pairing;

  element_t ElGamal_G1_g_1;
  element_t IB_G1_g2s_f_aux;

  if(pairing_init_set_str(IB_pairing, IB_buffer) == 1)
    {
      printf("init IB_pairing failed\n");
      return 0;
    }

  if(pairing_init_set_str(ElGamal_pairing, ElGamal_buffer) == 1)
    {
      printf("init ElGamal_pairing failed\n");
      return 0;
    }

  OpenSSL_add_all_algorithms();
  pbc_random_set_file("/dev/urandom");

  element_init_G1(ElGamal_G1_g_1, ElGamal_pairing);
  element_init_G1(IB_G1_g2s_f_aux, IB_pairing);
  for(int i = 0; i <= 7; i ++)
    {
      element_random(ElGamal_G1_g_1);
      Hash_function_2(ElGamal_G1_g_1, IB_G1_g2s_f_aux);
      element_printf("%B\n-------------------------------------\n",
                     IB_G1_g2s_f_aux);
      element_to_bytes(buffer, IB_G1_g2s_f_aux);
      element_from_bytes(IB_G1_g2s_f_aux, buffer);

      element_printf("%B\n\n", IB_G1_g2s_f_aux);
    }

  element_clear(ElGamal_G1_g_1);
  element_clear(IB_G1_g2s_f_aux);
}
程序IB_pairing中的

是从未压缩的pbc文件夹中复制的a.param初始化的,ElGamal_pairing是从我在gen中找到的genaparam生成的内容初始化的文件夹,它是pbc文件夹的子目录。现在,代码输出如:

[5242744931973888357810214698891575268968713403287687987582661419271346701723916645766967288858537828347386228320848038004460401621466729428359602848496423, 118298437701476879252590762137102463858584189697768090565747590297711649473408814747936054487138480275170041397143791824953512356308426007693466456179168]
-------------------------------------
[5242744931973888357810214698891575268968713403287687987582661419271346701723916645766967288858537828347386228320848038004460401621466729428359602848496423, 118298437701476879252590762137102463858584189697768090565747590297711649473408814747936054487138480275170041397143791824953512356308426007693466456179168]

[193714737889486499072115953742998424769489264653955710164208541956541631696577272694010272524888373065658088394836551869833950180668987684845705117682787, 8322151652329772861037196194168895802696002124303037838979551092936828926180405726470751856790581079911562675895636010857792037405706584773714399060440286]
-------------------------------------
[193714737889486499072115953742998424769489264653955710164208541956541631696577272694010272524888373065658088394836551869833950180668987684845705117682787, 8322151652329772861037196194168895802696002124303037838979551092936828926180405726470751856790581079911562675895636010857792037405706584773714399060440286]

[495047649790927154331600875943865603224939234468985749770584820482607323401569786408964940026933317685852491403307110240933283586727130743485260801306123, 627545795052423626580420805178631952553532694027088981206234423727093343832432384258118298986203220359581564990411022919298680177610751000388025394726311]
-------------------------------------
O

[4542621263375384263129179574241340967482607815987619234619001482840218784253522899638100115797770929051314594382110531705620048072005886520744474015548799, 4384016080218277894585596328932412426136126888519161287653688238921459073535259513521348441520090835443816442403976291911942079711511656142926876657574119]
-------------------------------------
O

[934929446085781431564145952513276901891994909515246349081484727464551419226172557408608926404886531004238987014488635110816400458081240110773838222735035, 5961256556272620299959818693083876773102158266860051729037463651374484980756089251260880171468476182599983428188035231226059179410518065718227845688839716]
-------------------------------------
[934929446085781431564145952513276901891994909515246349081484727464551419226172557408608926404886531004238987014488635110816400458081240110773838222735035, 5961256556272620299959818693083876773102158266860051729037463651374484980756089251260880171468476182599983428188035231226059179410518065718227845688839716]

[1224204982207723555590429339348622427566172381990610842080105056584418105637718525873987892092288009728542005861184194378722664576353556137763270960705678, 8697105603647319842683626319102469751603864170995390173683250409145042732890778489498574501879021283552905344140881861126112678686800294724427908393544229]
-------------------------------------
O

[1342315162981173575284474712688478558555924987160295354118525538511370674248831922332142524449197361143668635693752430389149660122747527319388460244716267, 5267811295598008357011271549336672278507286122051296965376347558098881407861455461777989115869240838665983404311822513990301968904409996934757904037469081]
-------------------------------------
O

[4491486047832261748660536800950738994321386405877875101997492071615864965243872556818616142835048233636100898376016387452858412191123428562316075309820872, 2667680711633239882081053356855222638213416843899362660435808202909280287640739981804569477623527608695636418075471578632318931368061236784727949670086843]
-------------------------------------
[4491486047832261748660536800950738994321386405877875101997492071615864965243872556818616142835048233636100898376016387452858412191123428562316075309820872, 2667680711633239882081053356855222638213416843899362660435808202909280287640739981804569477623527608695636418075471578632318931368061236784727949670086843]

顺便说一句,我使用的是Ubuntu 14.04 x64,pbc-0.5.14。

1 个答案:

答案 0 :(得分:1)

我想我找到了自己提出的这个问题的关键,但我仍然不知道发生了什么。也许就像Artjom B.所说的那样:

  

也许你以某种方式设法将这些元素置于曲线之外。

我将Hash_funcrion_2更改为:

void Hash_function_2(element_t IB_e_GT_in,
                     element_t IB_e_G1_out)
{
  unsigned char buffer[130];
  unsigned char buffer_sha512[130];
  int x = 0xFF;
  memset(buffer_sha512, '\0', 128);
  element_to_bytes(buffer, IB_e_GT_in);
  SHA512(buffer,
         element_length_in_bytes(IB_e_GT_in),
         buffer_sha512);

  element_from_hash(IB_e_G1_out, buffer_sha512, 64);
}

一切正常。