当前位置: 首页 > 知识库问答 >
问题:

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

督坚白
2023-03-14

我正在处理一些ECC加密问题。

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

有人能帮我澄清一下这个问题吗。我不明白为什么我们需要一个散列(或任何字符串)来生成一个配对密钥,正如我在许多在线解决方案中发现的那样,像这样的解决方案没有必要给出散列。也许这是一个阶段?也许是曲线键或类似的东西。

我认为我们所需要的只是为私钥做这样的事情:
openssl ecparam -genkey -noout -out myprivatekey.pem 和公钥生成: openssl -ec -in myprivatekey.pem -pubout -out mypublickey.pem

问题是:为什么我们需要一个由128个字符组成的散列来生成我们的密钥对?这是出于安全原因的密码吗?如何使用openssl?


共有2个答案

司徒翼
2023-03-14

实际上,这是我自己的代码,您可以对其进行改进并编辑下面的解决方案:

// 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;
}
朱通
2023-03-14
匿名用户

如果你有某种输入的二进制值需要转换成一个键,你可以使用散列。

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

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

 类似资料:
  • 我正在使用Ruby 2.5.x OpenSSL库研究椭圆曲线。我可以很容易地使用 但是给定一个私钥,我想重新生成公钥。 我知道OpenSSL可以做到这一点,因为命令行允许您这样做,Ruby比特币项目也可以做到这一点。但是Ruby比特币项目使用FFI而不是Ruby提供的接口有自己的OpenSSL接口。 Ruby 2.5.x openssl 库是否没有公开足够的 OpenSSL 接口,以便能够从私钥生

  • 如果我在某个地方出错,请纠正我,因为我是加密领域的新手。 我使用以下命令在Java 7中生成EC密钥对: 根据:文件。神谕com/javase/7/docs/technotes/tools/windows/keytool。html#命令 keytools-genkey对-alias MyServerPair-keyalg EC-keysize 571-sigalg SHA512 with ECDS

  • 问题内容: 该BouncyCastle的加密API允许创建和使用的常规验证数字签名包对象,如,和它们的容器。 假设我使用OpenSSL创建一个.pem(或更简单的话是一个.der文件),其中包含要在应用程序中使用的椭圆曲线私钥。例如,它看起来像这样: 如何使用BouncyCastle API获取同时包含此私钥和相应公钥的? 请注意,我要使用BouncyCastle 1.50(在撰写本文时为最新)中

  • BouncyCastle加密API允许使用常规的<code>java创建和验证数字签名。安全性包对象,如,及其容器<code>java.security.KeyPair。 假设我使用OpenSSL创建了一个. pem(或者更简单的. der文件),其中包含了我希望在应用程序中使用的椭圆曲线私钥。例如,它看起来像这样: 我如何使用BouncyCastle APIs来获取包含此私钥和相应公钥的< co

  • 我使用secp192r1曲线生成了ECC公钥和私钥。公共密钥数组长度为75,私有密钥数组长度125。为什么私钥比公钥长?为什么私钥的长度不是公钥的两倍?为什么由于secp192r1私钥不是192位=24字节?

  • 我目前正在从事一个项目,涉及从Vault获取PEM或DER格式的椭圆曲线证书/私钥包,并需要将其导入Java密钥库。我可以找到大量关于使用keytools执行此操作的信息,但无法找到有关如何成功将DER编码字符串转换为以将其插入密钥库的信息。 下面是我的非工作代码