LoginSignup
2
1

More than 3 years have passed since last update.

グループ署名方式を実装する(libgroupsig)

Last updated at Posted at 2020-08-12

グループ署名方式とは

グループ署名方式とは署名者がグループに含まれることを証明する署名方式です。
グループ署名についての説明はこちら にあります。

想定する環境

  • Ubuntu 20.04

インストール

1. 必要なパッケージをインストール

以下のコマンドで事前に必要なプログラムをインストールしておきます。

$ sudo apt update
$ sudo apt install git build-essential cmake libssl-dev

2. libgroupsigのインストール

以下のコマンドでlibgroupsigをインストールします。

$ git clone https://github.com/IBM/libgroupsig
$ cd libgroupsig
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install

プログラムの作成

1. プログラムの記述

以下のようなプログラムを書き、sign_gl19.cという名前で保存します。

#include <groupsig/groupsig.h>

int main (int argc, char *argv[]) {

  groupsig_config_t *cfg;
  groupsig_key_t *grpkey, *isskey, *cnvkey, *memkey;
  groupsig_signature_t *sig;
  message_t *msg, *m1, *m2, *m3, *m4;
  uint8_t b;

  /* Initialize environment for GL19 */
  cfg = groupsig_init(GROUPSIG_GL19_CODE, 0);

  /** Create the group **/

  /* Initialize the group and manager keys */
  grpkey = groupsig_grp_key_init(GROUPSIG_GL19_CODE);
  isskey = groupsig_mgr_key_init(GROUPSIG_GL19_CODE);
  cnvkey = groupsig_mgr_key_init(GROUPSIG_GL19_CODE);

  /* Run the Issuer part of the setup */
  groupsig_setup(GROUPSIG_GL19_CODE, grpkey, isskey, NULL, cfg);

  /* Run the Converter part of the setup */
  groupsig_setup(GROUPSIG_GL19_CODE, grpkey, cnvkey, NULL, cfg);

  /** Add a member to the group **/

  /* Initialize the member key */
  memkey = groupsig_mem_key_init(GROUPSIG_GL19_CODE);

  /* Simulate the issue-join interactive process */
  m1 = m2 = m3 = m4 = NULL;
  groupsig_join_mgr(&m1, NULL, isskey, 0, NULL, grpkey);
  groupsig_join_mem(&m2, memkey, 1, m1, grpkey);
  groupsig_join_mgr(&m3, NULL, isskey, 2, m2, grpkey);
  groupsig_join_mem(&m4, memkey, 3, m3, grpkey);

  /** Sign a message **/

  /* Prepare the message */
  msg = message_from_string("Hello, World!");

  /* Initialize the signature object */
  sig = groupsig_signature_init(GROUPSIG_GL19_CODE); 
  groupsig_sign(sig, msg, memkey, grpkey, 0);

  /** Verify the signature **/
  groupsig_verify(&b, sig, msg, grpkey);

  if (b) {
    fprintf(stdout, "VALID signature.\n");
  } else {
    fprintf(stdout, "WRONG signature.\n");
  }

  /* Free memory */
  groupsig_clear(GROUPSIG_GL19_CODE, cfg); cfg = NULL;
  groupsig_grp_key_free(grpkey); grpkey = NULL;
  groupsig_mgr_key_free(isskey); isskey = NULL;
  groupsig_mgr_key_free(cnvkey); cnvkey = NULL;
  groupsig_mem_key_free(memkey); memkey = NULL;
  groupsig_signature_free(sig); sig = NULL;
  message_free(msg); msg = NULL;
  message_free(m1); m1 = NULL;
  message_free(m2); m2 = NULL;
  message_free(m3); m3 = NULL;
  message_free(m4); m4 = NULL;

  return 0;

}

2. コンパイル&実行

以下のコマンドで、コンパイルと実行を行います。

$ gcc sign_gl19.c -o sign_gl19 -lgroupsig -lmcl -Wl,-rpath=/usr/local/lib
$ ./sign_gl19

VALID signature と表示されれば成功です。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1