代码之家  ›  专栏  ›  技术社区  ›  famas23

使用椭圆曲线ECC生成私有/公共对密钥

  •  1
  • famas23  · 技术社区  · 6 年前

    目标是用C或bash编写一个程序,该程序将接受由128个十六进制字符组成的散列作为输入
    (Example: 8A9A35145C4EA5260DF9972C804FE2D3F9F3D7A2AC01A6BEB21C82BB30957B3952273AC9166B90C1207347A925780F84A1D2359E7AA05201C674D2B9746FCA07) input hash 类型的私钥和公钥 并显示生成的密钥对。

    this one 没必要胡说。也许这是一个阶段?可能是曲线键或类似的东西。

    我想我们只需要为私钥做这样的事情:
    openssl ecparam -genkey -noout -out myprivatekey.pem openssl -ec -in myprivatekey.pem -pubout -out mypublickey.pem

    问题是:为什么我们需要一个由128组成的散列来生成成对的密钥?是出于安全原因的密码吗?openssl是怎么做到的?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Maarten Bodewes    6 年前

    如果有某种需要转换为密钥的输入二进制值,可以使用哈希。

    可以使用哈希作为私钥的输入。要转换它,你应该先将它转换成一个数字,然后执行一个计算模 n n个 是ECC域参数的顺序。结果值可以调用 s 然后您可以通过执行 s * G ,即与基点相乘。

    OpenSSL不是一个低级的加密库,所以您必须对它进行编程,可能需要使用OpenSSL API和它附带的BN(大数)库。不是的 那个 很棘手,但是如果你仍然在谈论128个字符而不是64个字节,那么你可能有很多学习要做。

        2
  •  0
  •   famas23    6 年前

    // 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;
    
         start = BN_new();
         ctx = BN_CTX_new(); // ctx is an optional buffer to save time from allocating and deallocating memory whenever required
    
         res = start;
         BN_hex2bn(&res,"8A9A35145C4EA5260DF9972C804FE2D3F9F3D7A2AC01A6BEB21C82BB30957B3952273AC9166B90C1207347A925780F84A1D2359E7AA05201C674D2B9746FCA07");
         eckey = EC_KEY_new_by_curve_name(NID_secp256k1);
    
         group = EC_KEY_get0_group(eckey);
         pub_key = EC_POINT_new(group);
    
    
        printf("private key : "); BN_print_fp(stdout, res); printf("\n");
        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");
    
         EC_KEY_set_public_key(eckey, pub_key);
    
         char *cc = EC_POINT_point2hex(group, pub_key, 4, ctx);
    
         char *c=cc;
    
         int i;
    
         printf("public key : ");
         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;
    }