【问题标题】:How can we turn hash sha256 of a passphase into an EC_key private key?我们如何将密码的哈希 sha256 转换为 EC 密钥私钥?
【发布时间】:2019-01-20 19:56:42
【问题描述】:

我有一个问题,我最近刚刚练习 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 的私钥与哈希 sha256 具有相同的格式?

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

【问题讨论】:

    标签: c hash openssl cryptography


    【解决方案1】:

    不直接用于该曲线。

    一个ECC私钥实际上是一个小于基点阶数的随机整数,或者等价于基点生成的组的阶数。

    虽然并非所有 ECC 曲线(组)都是如此,但生成了 X9/Certicom/NIST prime 曲线,因此生成的组阶等于 曲线 阶(正式地,辅因子 = 1),并且曲线阶始终接近基础场阶,对于这些曲线,其选择非常接近 2N。 因此 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 个这样的词就可以工作(尽管它不是标准的)。多年来,已经开发和使用了许多其他类似的方案。在实践中,您可能必须将此“短语”写下来和/或将其存储在某处,然后适当地保护该存储。

    【讨论】:

    • 不用担心安全问题,我只是尝试编程。那么有什么具体的方法吗?
    • 忘了说,我的问题是基于大脑钱包的想法
    • 如果您需要存储它,那么您不妨加密一个随机私钥。这样就无法猜到私钥;攻击者需要访问加密的私钥来测试可能的密码(当然,密码应该仍然很强大)。
    • @MaartenBodewes 我知道,但有代码吗?
    • 私钥在以(加密的)PKCS#8 或格式(只是私钥)或 PKCS#12 格式(私钥和证书)存储时都被加密。但是您可能需要确保从密码中派生加密密钥的代码使用的是强算法,例如 PBKDF2 和高迭代次数......
    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多