Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cryptography 使用椭圆曲线生成私有/公共密钥对_Cryptography_Elliptic Curve - Fatal编程技术网

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

Cryptography 使用椭圆曲线生成私有/公共密钥对,cryptography,elliptic-curve,Cryptography,Elliptic Curve,我正在研究小ECC加密问题 目标是用C或bash编写一个程序,该程序将采用由128个十六进制字符组成的哈希作为输入 (示例:8A9A35145C4EA5260DF9972C804FE2D3F9F3D7A2AC01A6BEB21C82BB30957B3952273AC9166B90C1207347A925780F84A1D2359E7AA05201C674D2B9746FCA07) 它将从输入哈希生成椭圆曲线类型的私钥和公钥,并显示生成的密钥对 有人能给我澄清一下这个问题吗。我不明白为什么我们需

我正在研究小ECC加密问题

目标是用C或bash编写一个程序,该程序将采用由128个十六进制字符组成的哈希作为输入
(示例:8A9A35145C4EA5260DF9972C804FE2D3F9F3D7A2AC01A6BEB21C82BB30957B3952273AC9166B90C1207347A925780F84A1D2359E7AA05201C674D2B9746FCA07)
它将从
输入哈希生成椭圆曲线类型的私钥和公钥,并显示生成的密钥对

有人能给我澄清一下这个问题吗。我不明白为什么我们需要一个散列(或任何字符串)来生成一个配对密钥,正如我在许多在线解决方案中发现的,比如ther's's not need to give a hash。也许这是一个阶段?也许是曲线键或类似的东西

我认为我们所需要的就是对私钥执行类似的操作:
openssl ecparam-genkey-noout-out myprivatekey.pem
对于公钥生成:

openssl-ec-in-myprivatekey.pem-publiout-out-mypublickey.pem


问题是:为什么我们需要一个由128个哈希组成的输入来生成密钥对?这是出于安全原因的密码短语吗?openssl是如何做到这一点的?

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

您可以使用散列作为私钥的输入。要转换它,您应该首先将其转换为一个数字,然后对其执行模运算
n
,其中
n
是ECC域参数的顺序。结果值可以称为
s
,然后您可以通过执行
s*G
,即与基点进行点乘,从中计算公钥


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

事实上,这是我自己的代码,您可以改进它并编辑以下解决方案:

// 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;
}
//gcc-Wall ecdsapubkey.c-o ecdsapubkey-lcrypto
#包括
#包括
#包括
#包括
#包括
int main()
{
EC_KEY*eckey=NULL;
EC_点*pub_键=NULL;
const EC_GROUP*GROUP=NULL;
BIGNUM*开始;
BIGNUM*res;
BN_CTX*CTX;
开始=BN_new();
ctx=BN_ctx_new();//ctx是一个可选的缓冲区,可以节省在需要时分配和释放内存的时间
res=开始;
BN_hex2bn(&res,“8A9A35145C4EA5260DF9972C804FE2D3F9F3D7A2AC01A6BEB21C82BB30957B39552273AC9166B90C1207347A925780F84A1D2359E7AA05201C674D2B9746FCA07”);
eckey=eckey新曲线名称(NID secp256k1);
组=eckey组(eckey);
pub_key=EC_POINT_new(组);
printf(“私钥”);BN_print_fp(stdout,res);printf(“\n”);
EC_密钥_设置_私钥(eckey,res);
/*pub_key是一个新的未初始化的'EC_POINT*`。priv_key res是一个'BIGNUM*`*/
if(!EC_POINT_mul(组、发布键、res、NULL、NULL、ctx))
printf(“EC点错误。\n”);
EC_KEY_set_public_KEY(eckey,pub_KEY);
char*cc=EC_POINT_point2hex(组,发布键,4,ctx);
char*c=cc;
int i;
printf(“公钥:”);

对于(i=0;iNo),我不提供代码示例,请先自己尝试。