如何生成相同的EC_KEY“n”次

时间:2015-08-14 08:45:10

标签: openssl

生成EC_KEY我可以使用以下pgm(它完美地工作)。

    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键(这是正常的)。我需要的是一个生成相同EC_KEY的pgm,无论我执行它多少次,怎么做?日Thnx

1 个答案:

答案 0 :(得分:3)

正如您所说,generate会创建一个新密钥。如果要重用密钥,请生成密钥 然后存储该密钥并根据需要重新使用它。在一个程序执行(进程)内 这很简单,所以我假设你想在以后的同一程序执行中重用它, 不同的程序,或在不同的系统上。要做到这些,你需要写出来 然后读入密钥。

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

对于ECC(与其他公钥/私钥不同),有两种编码方式 使用的组,通常(虽然不精确)称为曲线。对于标准曲线 (如您使用的secp192k1)ASN.1 OID已分配并已序列化 表格可以简单地使用OID;这被称为"命名为#34;形成。或者,参数 (主要基础场的模数或"二进制"基础场,曲线的多项式 方程系数,生成或基点坐标,顺序和辅助因子)可以 明确编码;这被称为"显式"形成。 命名表单几乎总是最好; 它更短更容易使用,出于某些目的(特别是SSL / TLS)OpenSSL可以 仅使用命名表单,而其他一些系统可能只接受命名表单。但它还没有 OpenSSL默认值,所以你应该EC_GROUP_set_asn1_flag(group,OPENSSL_EC_NAMED_CURVE) 在序列化之前。 (反序列化时自动设置。)

一种基本存储方法是磁盘文件。有{i2d,d2i}_*_fp 使用FILE*或等效文件写入和读取在C中打开的fopen()的函数。 OpenSSL也有自己的名为BIO的I / O方案,有{i2d,d2i}_*_bio 写入和读取BIO的函数,尽管除了内存和文件之外的BIO对密钥很少有用。或者您可以将DER blob放在其他存储中 由您的程序使用,例如数据库,文件服务器,Web服务器,"云"等。

您可能更喜欢 PEM 格式。一些常用和共享的加密对象 例如X.509证书使用最初为PEM设计的方案 (虽然PEM本身已经被淘汰了)。此格式对二进制DER进行编码 使用方便大小(通常为64或76个字符)的换行符为64 并添加一个-----BEGIN OBJECTTYPE-----形式的标题行和一个预告片行 形式为-----END OBJECTTYPE-----。创建PEM格式以允许二进制数据 通过几年前可以通过电子邮件系统处理而不会丢失或损坏 不处理二进制数据;今天它仍然具有可以显示的优势 始终在任何编辑器或终端/控制台/无论什么,可以复制和粘贴 文件或系统之间没有丢失或损坏。 OpenSSL扩展了PEM 计划到许多其他对象,包括密钥,以及许多OpenSSL 命令行 操作PEM格式至少更方便,有时需要。 从程序中可以看到以PEM_read_PEM_write_开头的函数, 在这种情况下PEM_{read,write}_EC{Private,Public}Key写{读} FILE*, 或PEM_{read,write}_bio_$same写或读BIO。

您也可以考虑通用格式和证书,尤其是如果您 想与其他程序共享或交换这些密钥。大多数加密系统 今天需要处理多种算法或者至少能够处理;最佳做法是 使用通用格式,以组合和一致的方式处理所有需要的算法。 OpenSSL使用EVP_KEY结构和相关函数实现此功能; EVP *可以处理 RSA密钥并执行RSA,DSA或DH密钥并执行DSA或DH,ECC密钥以及执行ECDSA或ECDH等。

对于私钥,通用格式为 PKCS#8 aka rfc5208。 这基本上由ASN.1结构AlgorithmIdentifier组成 它标识算法和适用的参数以及包含依赖于算法的密钥信息的不透明OCTETSTRING。这个功能是 {i2d,d2i}_PrivateKey{i2d,d2i}_PKCS8PrivateKey{_bio,_fp}("歇斯底里的葡萄干和#34;略有不一致) 和PEM_{read,write}{,_bio}_PKCS8PrivateKey。 PKCS#8私钥可以加密,以防止密钥泄露,如果您使用的存储方法本身并不能提供良好的安全性,而特定于算法的DER表单则不能加密,OpenSSL中特定于算法的PEM表单只支持旧的和弱的加密形式。

对于公钥,通用格式是X.509的(小)部分, 更方便rfc5280 并在rfc3279中扩展了ECC等算法。 此格式类似地具有AlgorithmIdentifier加上包含特定于算法的键的不透明BITSTRING。 EVP_PKEY i2d / d2i和PEM函数为*PUBKEY*。 还有便利功能使用通用外部格式和特定​​内部类型, 对于ECC,*EC_PUBKEY*

对于使用公钥加密的许多方案,包括ECC,公钥都是分布式的, 以 X.509 证书的形式存储和使用,其中包含公钥 上面描述的格式,结合主题名称和其他相关属性, 由证书颁发机构加密签名。 OpenSSL具有(许多)功能 用于X.509证书和相关事项,如CRL,CSR和OCSP。但这是一个更大的问题。

这些例程中的大多数在安装了OpenSSL的任何Unix系统上都有手册页, 或者在 https://www.openssl.org/docs/crypto/ 在线将2017移至https://www.openssl.org/docs/manmaster/man3/。这里和那里都有差距, 但你通常可以通过查看相似和相关的函数来推断缺失的位。