生成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
答案 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/。这里和那里都有差距,
但你通常可以通过查看相似和相关的函数来推断缺失的位。