Openssl 如何生成相同的EC“U密钥”;";时代

Openssl 如何生成相同的EC“U密钥”;";时代,openssl,Openssl,要生成EC_密钥,我可以使用以下pgm(它工作得非常好) 但是每次我执行它时,它都会生成不同的EC密钥(这是完全正常的)。我需要的是生成相同EC_密钥的pgm,无论我执行它多少次,如何执行??正如您所说,generate创建一个新密钥。如果要重用密钥,请生成它 然后存储该键并根据需要重新使用。在一个程序执行(过程)内 这很简单,所以我假设您希望在同一程序的后续执行中重用它, 属于不同的程序,或在不同的系统上。要做到这些,您需要写出 然后读入键 OpenSSL用于大多数事情(包括ECC密钥)的一种

要生成EC_密钥,我可以使用以下pgm(它工作得非常好)


但是每次我执行它时,它都会生成不同的EC密钥(这是完全正常的)。我需要的是生成相同EC_密钥的pgm,无论我执行它多少次,如何执行??正如您所说,generate创建一个新密钥。如果要重用密钥,请生成它 然后存储该键并根据需要重新使用。在一个程序执行(过程)内 这很简单,所以我假设您希望在同一程序的后续执行中重用它, 属于不同的程序,或在不同的系统上。要做到这些,您需要写出 然后读入

OpenSSL用于大多数事情(包括ECC密钥)的一种存储格式是ASN.1DER, 最简单的函数都是从
i2d
d2i
开始的,这意味着从内部到外部和从内部到外部。对于ecu密钥,这些是
{i2d,d2i}{ecu{Private,Public}密钥
。私有格式实际上包括公共值,但公共格式排除了私有值,因此只能用于公共操作,但可以安全地分发。 这些基本的例程写入一个内存缓冲区,你可以把它存储在某个地方 可检索,或从检索到的内存缓冲区读取

对于ECC(与其他公钥/私钥不同),有两种方法对参数进行编码 使用的组中,通常(尽管不精确)称为曲线。对于标准曲线 (就像您使用的secp192k1一样)ASN.1OID被分配并序列化 表单可以简单地使用OID;这称为“命名”形式。或者,参数 (素数基础场的模或“二元”基础场的多项式,曲线) 方程系数、生成坐标或基点坐标、阶数和余因子)可以 明确编码;这称为“显式”形式命名形式几乎总是最好的; 它更短,更易于使用,对于某些目的(特别是SSL/TLS),OpenSSL可以 仅使用命名形式,其他一些系统可能只接受命名形式。但现在还没有 OpenSSL默认设置,因此您应该
EC_GROUP_set_asn1_标志(GROUP,OpenSSL_EC_NAMED_CURVE)
在序列化之前。(反序列化时自动设置。)

一种基本的存储方法是磁盘文件。有
{i2d,d2i}{uu*\u fp
使用
fopen()
或等效工具在C中打开的
文件*
中进行写入和读取的函数。 OpenSSL也有自己的名为BIO的I/O方案,还有
{i2d,d2i}\ubio
写入和读取BIO的函数,尽管除了内存和文件以外的BIOs很少对密钥有用。或者你可以把这个小水滴放在其他的地方 用于您的程序,如数据库、文件服务器、web服务器、“云”等

您可能更喜欢PEM格式。一些常用和共享的加密对象 例如,X.509证书使用最初为PEM设计的方案 (尽管PEM本身已被搁置一旁)。这种格式对二进制数据进行编码 以64为基数,以方便的大小换行(通常为64或76个字符) 并添加格式为
----beginobjecttype-----
的标题行和尾行 格式为
----END OBJECTTYPE-----
。创建PEM格式是为了允许二进制数据 通过几年前可能出现的电子邮件系统进行处理而不会丢失或损坏 不处理二进制数据;今天,它仍然具有可以展示的优势 在任何编辑器或终端/控制台/任何东西中保持一致,并且可以复制和粘贴 在文件或系统之间无丢失或损坏。OpenSSL扩展了PEM 方案可用于许多其他对象,包括密钥,以及许多OpenSSL命令行 PEM格式的操作至少更方便,有时也是必需的。 在程序中,有以PEM_read_和PEM_write_开头的函数, 在这种情况下,
PEM{read,write}{EC{Private,Public}密钥
用于写入或读取
文件*
, 或者是写或读一个bio的相同的PEM{read,write}bio

您也可以考虑<强>通用格式和证书>,特别是如果您 希望与其他程序共享或交换这些密钥。大多数密码系统 今天需要处理多种算法,或者至少能够;最佳实践是 使用通用格式,以组合一致的方式处理所有需要的算法。 OpenSSL使用

EVP_KEY
结构和相关函数来实现这一点;执行副总裁*可以处理 RSA密钥和do RSA、DSA或DH密钥和do DSA或DH、ECC密钥和do ECDSA或ECDH等

对于私钥,通用格式为PKCS#8
。 这基本上是由ASN.1结构
算法识别器
它标识算法和适用参数,并加上包含算法相关密钥信息的不透明八位字符串。其功能如下:
{i2d,d2i}{u PrivateKey
{i2d,d2i}{u PKCS8PrivateKey{u bio,{u fp}
(对于“歇斯底里的葡萄干”稍微不一致) 和
PEM{read,write}{,{u bio}{u PKCS8PrivateKey
。 PKCS#8 PrivateKey可以加密,以防止密钥泄漏,前提是您使用的存储方法本身不具备良好的安全性,而特定于算法的DER表单根本无法加密,OpenSSL中特定于算法的PEM表单只支持一种旧的、弱的加密形式

对于公钥,通用格式由X.509的一小部分组成, 更方便地在 并在中扩展了ECC等算法。 这种格式同样有一个算法标识符加上一个包含算法特定键的不透明位字符串。 EVP_PKEY i2d/d2i和PEM的功能是
*PUBKEY*
。 也有使用该基因的便利功能
    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);