OpenSSL“密封”在 C 中(或通过 shell)

发布于 2024-08-11 09:13:43 字数 622 浏览 2 评论 0原文

我正在努力将一些 PHP 代码移植到 C 语言,以连接 Web API。

我遇到的问题是 PHP 代码使用函数 openssl_seal(),但我似乎找不到任何方法在 C 中甚至通过 openssl 执行相同的操作 在对 system() 的调用中。

来自 openssl_seal() 的 PHP 手册:

int openssl_seal ( 字符串 $data , 字符串 &$sealed_data ,数组 &$env_keys ,数组 $pub_key_ids )

openssl_seal() 密封(加密)数据 通过使用 RC4 和随机生成的 秘密密钥。密钥被加密为 每个关联的公钥 与 pub_key_ids 中的标识符 每个加密密钥都返回在 env_keys 。这意味着一个人可以 将密封数据发送给多个 收件人(前提是已获得 他们的公钥)。每个收件人 必须接收密封数据和 加密的信封密钥 使用接收者的公钥。

实现这一点的最佳方法是什么?出于显而易见的原因,我真的不希望每次都调用 PHP 脚本。

I'm working on porting some PHP code to C, that contacts a web API.

The issue I've come across is that the PHP code uses the function openssl_seal(), but I can't seem to find any way to do the same thing in C or even via openssl in a call to system().

From the PHP manual on openssl_seal():

int openssl_seal ( string $data ,
string &$sealed_data , array
&$env_keys , array $pub_key_ids )

openssl_seal() seals (encrypts) data
by using RC4 with a randomly generated
secret key. The key is encrypted with
each of the public keys associated
with the identifiers in pub_key_ids
and each encrypted key is returned in
env_keys . This means that one can
send sealed data to multiple
recipients (provided one has obtained
their public keys). Each recipient
must receive both the sealed data and
the envelope key that was encrypted
with the recipient's public key.

What would be the best way to implement this? I'd really prefer not to call out to a PHP script every time, for obvious reasons.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

茶花眉 2024-08-18 09:13:43

您正在寻找 OpenSSL 库的 C 接口的 EVP(“信封加密”)部分:(

#include <openssl/evp.h>

int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
                 unsigned char **ek, int *ekl, unsigned char *iv,
                 EVP_PKEY **pubk, int npubk);
int EVP_SealUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
        int *outl, unsigned char *in, int inl);
int EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out,
        int *outl);

在本例中,由于您希望 RC4 与 PHP 代码兼容,因此您可以使用 EVP_rc4() 作为 EVP_SealInit()type 参数)。

You are after the EVP ("Envelope Encryption") part of the C interface to the OpenSSL library:

#include <openssl/evp.h>

int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
                 unsigned char **ek, int *ekl, unsigned char *iv,
                 EVP_PKEY **pubk, int npubk);
int EVP_SealUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
        int *outl, unsigned char *in, int inl);
int EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out,
        int *outl);

(In this case, since you want RC4 for compatibility with the PHP code, you'd use EVP_rc4() as the type parameter to EVP_SealInit()).

忆沫 2024-08-18 09:13:43

如果您被允许使用 C++ 而不仅仅是 C,您可以使用 Crypto++,它将轻松完成您需要的操作。

If you are allowed to use C++ and not just C You can use Crypto++, it will easily do what you need.

不喜欢何必死缠烂打 2024-08-18 09:13:43

仅当您精通 C++ 知识时才考虑 Crypto++。

Consider Crypto++ only if you have proficient knowledge in c++.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文