6

私は自分の問題を示すためにこのサンプルアプリケーションを提供しています

#include <stdio.h>
#include <stdlib.h>
#include <openssl/ec.h>
#include <openssl/bn.h>

int main()
{
     EC_KEY *pkey = NULL;
     EC_POINT *pub_key = NULL;
     const EC_GROUP *group = NULL;
     BIGNUM start;
     BIGNUM *res;
     BN_CTX *ctx;

     BN_init(&start);
     ctx = BN_CTX_new();

     res = &start;
     BN_hex2bn(&res,"3D79F601620A6D05DB7FED883AB8BCD08A9101B166BC60166869DA5FC08D936E");
     pkey = EC_KEY_new_by_curve_name(NID_secp256k1);
     group = EC_KEY_get0_group(pkey);
     pub_key = EC_POINT_new(group);

     EC_KEY_set_private_key(pkey, res);

     assert(EC_POINT_bn2point(group,res, pub_key, ctx)); // Null here

     EC_KEY_set_public_key(pkey, pub_key);


    return 0;
}

私がやろうとしているのは、秘密鍵から公開鍵を表示することです(楕円形の秘密鍵である必要があります)。同様の問題に遭遇するまで、私はそれを行う方法を知りませんでした

ECDSA署名で使用するためにOpenSSLランダムデータをフィードするにはどうすればよいですか?

これは、公開鍵を取得し、OpenSSLソースに従って内部的にBN_hex2bnを実行するhex2pointの代わりにEC_POINT_bn2pointを使用する方法を自分自身に指摘したところです。

では、なぜEC_POINT_bn2pointがNULLを返すのですか?私はOpenSSLを再コンパイルし、それが失敗する理由を理解するためにいくつかのデバッグルーチンを配置することを真剣に検討しています。

4

2 に答える 2

14

ECDSA秘密鍵d(整数)と公開鍵Q (点)は、 Q = dGによって計算されます。ここで、Gは非秘密ドメインパラメーターです。SuiteB実装者ガイドFIPS186-3(ECDSA)では、ECDSAについて詳しく説明しています。

OpenSSLは、ECDSA_generate_keyを使用してキーペアを生成します。秘密鍵をランダムに生成し、Q=dG乗算を実行して公開鍵を計算します。

/* pub_key is a new uninitialized `EC_POINT*`.  priv_key is a `BIGNUM*`. */
if (!EC_POINT_mul(ecdsa->group, pub_key, priv_key, NULL, NULL, ctx)) goto err;

だからあなたは同じことをすることができます。EC_KEY秘密鍵がある場合は、または構造体の秘密鍵として設定しますECDSA。次に、ドメインパラメータを設定します。そして最後にEC_POINT_mul、公開鍵を取得するために実行します。

于 2012-09-18T17:54:17.987 に答える
4

実例:

// using figures on: https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses
// gcc -Wall ecdsapubkey.c -o ecdsapubkey -lcrypto
#include <stdio.h>
#include <stdlib.h>
#include <openssl/ec.h>
#include <openssl/obj_mac.h>
#include <openssl/bn.h>

int main()
{
     EC_KEY *eckey = NULL;
     EC_POINT *pub_key = NULL;
     const EC_GROUP *group = NULL;
     BIGNUM start;
     BIGNUM *res;
     BN_CTX *ctx;

     BN_init(&start);
     ctx = BN_CTX_new(); // ctx is an optional buffer to save time from allocating and deallocating memory whenever required

     res = &start;
//     BN_hex2bn(&res,"3D79F601620A6D05DB7FED883AB8BCD08A9101B166BC60166869DA5FC08D936E");
     BN_hex2bn(&res,"18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725");
     eckey = EC_KEY_new_by_curve_name(NID_secp256k1);
     group = EC_KEY_get0_group(eckey);
     pub_key = EC_POINT_new(group);

     EC_KEY_set_private_key(eckey, res);

     /* pub_key is a new uninitialized `EC_POINT*`.  priv_key res is a `BIGNUM*`. */
     if (!EC_POINT_mul(group, pub_key, res, NULL, NULL, ctx))
       printf("Error at EC_POINT_mul.\n");

//     assert(EC_POINT_bn2point(group, &res, pub_key, ctx)); // Null here

     EC_KEY_set_public_key(eckey, pub_key);

     char *cc = EC_POINT_point2hex(group, pub_key, 4, ctx);

     char *c=cc;

     int i;

     for (i=0; i<130; i++) // 1 byte 0x42, 32 bytes for X coordinate, 32 bytes for Y coordinate
     {
       printf("%c", *c++);
     }

     printf("\n");

     BN_CTX_free(ctx);

     free(cc);

     return 0;
}

ライブラリについては、 http://wiki.openssl.org/index.php/Elliptic_Curve_Cryptographyも参照してください。

http://www.nsa.gov/ia/_files/ecdsa.pdf-アルゴリズム用

http://cs.ucsb.edu/~koc/ccs130h/notes/ecdsa-cert.pdf-数学用

于 2013-06-12T09:31:05.397 に答える