我们如何将一个通行阶段的哈希sha256转换为EC_key私钥?

时间:2018-08-14 03:26:07

标签: c hash openssl cryptography

我有一个问题,我最近才练习C和OpenSSL,请注意,这是创建EC_Key的常用方法:

    EC_KEY *eckey = EC_KEY_new();
    EC_GROUP *ecgroup= EC_GROUP_new_by_curve_name(NID_secp192k1);
    int set_group_status = EC_KEY_set_group(eckey,ecgroup);
    int gen_status = EC_KEY_generate_key(eckey);

此方法基于随机整数生成EC_key。我是否可以问是否有任何代码可以声明一个通行阶段的哈希sha256并将其设置为我们刚刚创建的EC_key的私钥,因为我读到EC_key的私钥与hash256的格式相同?

//Example
char* exam = "somewhere over the rainbow";
unsigned char output[32];
SHA256(exam, strlen(exam), output);

1 个答案:

答案 0 :(得分:1)

不直接针对该曲线。

ECC私钥实际上是一个小于整数的随机整数,它小于基点的顺序,或者等效地等于基点生成的组的顺序。

尽管并非所有ECC曲线(组)都适用,但是生成了X9 / Certicom / NIST prime 曲线,因此生成的组顺序等于曲线阶(形式上,辅助因子= 1),并且曲线阶始终与基础场阶接近,对于这些曲线,场阶被选择为非常接近2 N 。 因此, 256位主曲线的私钥,例如P-256 / secp256r1(通常在TLS和SSH及某些其他应用程序中使用)或secp256k1(在比特币和某些衍生硬币中使用)几乎是一个随机的256位字符串-足够接近以至于实际上可以使用。

类似地,对于secp192k1,随机的 192位字符串足够接近,可以通过获取SHA-256输出的前192位(或最后一个,或中间值(如果您愿意),只要它是根据具有足够熵的输入(您的密码)来提供所需安全性即可。

如果用通行短语表示您是一个人选择的短语,则不可以。有大量证据表明,即使尝试尝试,人们也不会随机选择,并且人们选择的密码和口令通常会被破坏,而不是通过密码“强化”您的方法无法做到的。举例来说,this was tried in the Bitcoin community a few years ago under the name 'brain wallet'-即您的私人密钥(可以访问您的比特币)在您的大脑中。这些密钥很多都被破坏了,比特币被盗了。

如果您的意思是由计算机随机生成的一系列单词(不是真正有意义的短语),它们具有足够的熵,或者由其他一些随机的过程(例如滚动骰子)生成,则是。比特币当前的“种子短语”标准是2048个列表中的12个单词,给出128位的熵和4位的冗余;对于您的曲线,您仅需要96位熵,因此9个这样的单词将起作用(尽管这不是标准的)。这些年来,已经开发并使用了许多其他类似的方案。实际上,您可能必须写下这个“短语”和/或将其存储在某个位置,然后适当地保护该存储。

相关问题