- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在努力使用 C++ 的 OpenSSL API。我正在使用 EVP 函数生成一个 RSA key 对,然后用它来加密用于加密数据(混合加密)的 AES key 。
key 生成:
EVP_PKEY* keypair = NULL;
EVP_PKEY_CTX* ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
EVP_PKEY_keygen_init(ctx);
EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 4096);
EVP_PKEY_keygen(ctx, &keypair);
EVP_PKEY_CTX_free(ctx);
现在我有了一个 key 对。通过 EVP_SealInit/EVP_SealUpdate/EVP_SealFinal 在我自己的机器上加密消息时没有问题。解密过程相同。我只是将 key 对作为 SealInit/OpenInit 函数的参数。
但考虑到我想生成一个 key 对并将公钥或私钥作为 char* 通过套接字发送给另一个人:我该怎么做?
我在互联网上找到的一种方法是使用 PEM_write_bio_PUBKEY 或 PEM_write_bio_PrivateKey 将 key 转换为 char*。尝试时似乎有效。但我仍然不是 100% 确定。所以请查看我的代码并告诉我这些功能是否可行:
unsigned char* publicKey;
BIO* bio = BIO_new(BIO_s_mem());
PEM_write_bio_PUBKEY(bio, keypair);
RSAmakeString(&publicKey, bio);
unsigned char* privateKey;
BIO* bio = BIO_new(BIO_s_mem());
PEM_write_bio_PrivateKey(bio, keypair, NULL, NULL, 0, 0, NULL);
RSAmakeString(&privateKey, bio);
另一件事是如何将 char* 转换回 EVP_PKEY*?有什么功能吗?因为如果我想在另一台计算机上将 SealInit 与我的公钥一起使用,我必须将它从 char* 转换回 EVP_PKEY*,这样我才能在函数中使用它。有什么建议吗?
最佳答案
But consider that I want to generate a keypair and send the public or private key as a char* over a socket to another person: how do I do that?
您需要一些用于序列化和有线格式或演示格式的东西。您的公钥和加密消息可能包含 0
个字符,这些字符显示为嵌入的 NULL
。因此,您需要同时拥有缓冲区和显式长度。
使用谷歌的 ProtocolBuffers , Binary JSON ,甚至 ASN.1/DER 编码。我认为 Google 的 ProtocolBuffers
是面向消息的,因此在完整消息可用之前它们不会返回消息。
您还可以对其进行十六进制、Base32 或 Base64 编码。但是您仍然需要传达一定的长度,以便接收方知道他们收到了完整的消息。在本地 LAN 上,您可能永远不会遇到问题。在 Internet 上,您可能偶尔会遇到失败,因为您有时会执行简短的读取操作。
您对 PEM_write_bio_PUBKEY
的想法实际上是对 key 进行 Base64 编码,因此它会遇到与 Hex、Base32 或 Base64 编码相同的潜在问题。
how do I convert the char* back to EVP_PKEY
好吧,根据您上面的更改,您可能不会使用 char*
。优化设计后,您可能应该提出一个新问题。
但目前,假设您使用 PEM_write_bio_PUBKEY
和 PEM_write_bio_PrivateKey
保存了 key ,那么您将使用 PEM_read_bio_PUBKEY
或 PEM_read_bio_PrivateKey
,分别。另请参阅 OpenSSL 的 PEM
man page .
与 C++ 相关,以下是使用 OpenSSL 时的一些技巧。如果您使用的是 C++11,那么 unique_ptr
确实可以轻松处理某些 OpenSSL 对象。
关于c++ - 如何发送 EVP_PKEY 给对方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47045979/
在旧程序中,我们有一行代码,如下所示: EVP_PKEY *pKey; /* . . */ if (pkey->type == EVP_PKEY_RSA) doSomething(); 但是在
我想以人类可读的形式显示 EVP_PKEY_keygen 函数的参数“pkey”中包含的公钥和私钥对,也就是说,显示一个编码器 key ,例如:1GERarDJyXsANQqWGGdC3C26GA8K
我正在开发 TLS 实现(使用 OpenSSL 1.0.1s),目前使用 1024 位 RSA key 进行加密和身份验证。出于性能原因,我想升级到 EC,但我需要保持向后兼容。 所以我决定使用 Op
我目前正在努力使用 C++ 的 OpenSSL API。我正在使用 EVP 函数生成一个 RSA key 对,然后用它来加密用于加密数据(混合加密)的 AES key 。 key 生成: EVP_PK
OpenSSL 具有更高级别的 EVP_PKEY_* 函数,适用于所有公钥- key 加密算法。然而,有时 EVP_PKEY* 只有一个公钥。我如何检查 EVP_PKEY* 是否包含私钥?我可以使用
我有一个以 PEM 格式存储的私钥字节,在类型为 LPSTR 的变量中。即 LPSTR pPrivateKeyInPem; 现在我需要使用 pPrivateKeyInPem 生成一个 EVP_PKEY
我需要创建一个包含私钥的 EVP_PKEY key 。最初 PEM 格式的私钥存储在变量 pKey 中。 现在我正在尝试使用 BIO 内存创建一个 EVP_PKEY key 。 EVP_PKEY *
我目前在 .pem 文件中有私钥。在我的应用程序 (iOS) 中,我想将私钥加载到 EVP_PKEY 结构中以签署 X509_REQ。 我目前的问题是我能够加载私钥,但实际上它是一个与我的文件系统中的
我正在使用 OpenSSL 的高级 EVP_*() 函数在我的应用程序中实现加密/解密方案,因此我可以轻松切换实际使用的算法,而无需更改 API 调用。 我可以相对轻松地创建 key 对: // du
我有一个 DER 证书,我正在从中检索 unsigned char 缓冲区中的公钥,如下所示,这是正确的获取方式吗? pStoredPublicKey = X509_get_pubkey(x509);
我有一个关于 RSA_size 的问题。 在 WIN32 上崩溃但在 linux 平台上工作的版本: ... EVP_PKEY* pPublicKey = null; unsigned i
我找到了函数EVP_PKEY_copy_parameters,它可以复制EVP_PKEY。但是一些关于这个函数的文档说它只能用于 DSA/ECC 算法。官方文档(来自openssl.org)没有提到该
我开始学习使用 C/C++ 进行 OpenSSL 编程。我遇到的一个问题是,如何安全地清除私钥的内存? 比如我可能有代码: EVP_PKEY *private_key = PEM_read_bio_P
基本上,这就是我所拥有的: { shared_ptr evpKeyPtr{EVP_PKEY_new(), EVP_PKEY_free}; //get key from file } 这
我有以下代码: void Impl::sign() { assert(!canonicalMessage_.empty()); char* key = b64Decode(secure
我正在使用 Windows CNG API 编写自定义 OpenSSL 引擎。在实现 EVP_PKEY_meths 以生成和使用 ECDH key 时,我遇到了将 key 从 OpenSSL EVP_
我正在使用 OpenSSL 的 c 库生成椭圆曲线 Diffie-Hellman (ECDH) key 对,遵循第一个代码示例 here .它通过以下行掩盖了公钥的实际交换: peerkey = ge
我想验证证书的格式是否有效,所以我写了这段代码,但似乎有错误 if (validConfigFile()) { INIReader reader(CONFIG_FILE); st
在我见过的所有使用 EVP 高级函数通过 OpenSSL 使用椭圆曲线生成 key 的示例中,两个 EVP_PKEY_CTX 和 EVP_PKEY(总共 4 个) 需要变量: 用于参数生成的一对键/上
我是一名优秀的程序员,十分优秀!