我需要多个 EVP_CIPHER_CTX 结构吗?

2024-01-07

我有一个单线程客户端/服务器应用程序,需要对其网络通信进行加密和解密。我计划使用 OpenSSL 的 EVP API 和 AES-256-CBC。

我从几个例子中找到了一些示例伪代码:

// key is 256 bits (32 bytes) when using EVP_aes_256_*()
// I think iv is the same size as the block size, 128 bits (16 bytes)...is it?
1: EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
2: EVP_CipherInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv, 1); //0=decrypt, 1=encrypt
3: EVP_CipherUpdate(ctx, outbuf, &outlen, inbuf, inlen);
4: EVP_CipherFinal_ex(ctx, outbuf + outlen, &tmplen));
5: outlen += tmplen;
6: EVP_CIPHER_CTX_cleanup(ctx);
7: EVP_CIPHER_CTX_free(ctx);

问题出在所有这些例子中,我不确定需要做什么every加密/解密,以及我应该在启动时只执行一次的操作。

具体来说:

  • 在第 1 行,我要创建这个吗EVP_CIPHER_CTX只使用一次并继续重复使用直到应用程序结束?
  • 同样在第 1 行,我可以重复使用相同的吗EVP_CIPHER_CTX对于加密和解密,还是我应该创建其中两个?
  • 在第 2 行,是否应该在我加密的每个数据包上重新设置 IV?或者我只设置 IV 一次,然后让它永远持续下去?
  • 如果我正在加密 UDP 数据包,其中数据包很容易丢失或乱序接收,该怎么办:我认为 CBC 不起作用是否正确,或者这是我需要在每个数据包开始时重置 IV 的地方我发出去?

很抱歉恢复旧线程,但我注意到接受的答案中存在以下错误:

在第 1 行,我是否只创建一次 EVP_CIPHER_CTX 并继续重复使用它,直到应用程序结束?

您每次使用时创建一次。也就是说,当您需要加密时,您使用相同的上下文。如果您需要加密第二个流,您将使用第二个上下文。如果您需要解密第三个流,您将使用第三个上下文。

另外,在第 1 行,我可以重复使用相同的 EVP_CIPHER_CTX 进行加密和解密,还是应该创建其中 2 个?

不,请参阅上文。

这是没有必要的。来自 OpenSSL 的手册页:

新代码应使用 EVP_EncryptInit_ex()、EVP_EncryptFinal_ex()、EVP_DecryptInit_ex()、EVP_DecryptFinal_ex()、 EVP_CipherInit_ex() 和 EVP_CipherFinal_ex() 因为它们可以重用现有上下文,而无需在每次调用时分配和释放它。

换句话说,每次使用上下文之前都需要重新初始化它,但是您当然可以一遍又一遍地使用相同的上下文,而无需创建(分配)新的上下文。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我需要多个 EVP_CIPHER_CTX 结构吗? 的相关文章

  • fsockopen() 和 SSL 出错,“无法启用加密”

    我正在尝试连接到 Nominet EPP 测试台 但收到 无法启用加密 的消息 这似乎是一个罕见的错误 没有记录的解决方案或原因 用行 socket fsockopen ssl testbed epp nominet org uk 700
  • AES 在汇编中的实现 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 大家好 我正在尝试构建一个代码来演示
  • 用 C++ 解密文件,该文件使用 openssl -aes-128-cbc 加密

    我正在尝试用 C 解密文件 该文件使用以下命令加密 openssl enc nosalt aes 128 cbc pass pass test in test txt out test enc txt p 控制台显示key 098F6BCD
  • 无法使用 OpenSSL 验证服务器证书

    我已经使用 OpenSSL 编写了一个 SOAP 客户端 在 Ubuntu 12 04 上用 C 编写 但它目前无需检查服务器安全证书即可运行 这是我用来设置连接和检查证书的函数 bool bInitialiseSSL SSL CTX ct
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • OpenSSL 真的需要 openssl.conf 的路径吗?

    我想在 PHP 5 x 中创建自签名证书 使用我自己的 替代 openssl 配置 该配置应该由我的 PHP 代码定义 PHP 脚本将在不同的环境 共享托管网络服务器 上运行 官方PHP手册 http php net manual en f
  • 使用 OpenSSL 解码/提取 smime.p7m 文件内容(带有嵌入文件的电子邮件)?

    我们有一个旧的进程 VBScript 它读取一个公共邮箱并将某些电子邮件处理到数据库中 新法规要求所有带附件的邮件都经过数字签名 该进程现在仅提取一个文件 smime p7m 使用基于 GUI 的查看器 我可以查看嵌入的文件并毫无问题地提取
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • 未定义的符号:SSLv2_client_method

    我正在尝试将 openssl 1 0 1e 更新到 1 0 1s 这是源码编译的 当我完成以下步骤后 cd openssl 1 0 1s config 共享 make 进行安装 apachectl 配置测试 我收到错误 httpd usr
  • 如何显示证书的主题备用名称?

    我发现的最接近的答案是使用 grep gt openssl x509 text noout in cert pem grep DNS 有更好的方法吗 我只喜欢命令行 Thanks 较新版本的 openssl 有一个 ext 选项 允许您仅打
  • AES BadPaddingException

    如果我使用错误的密钥或错误的盐进行解密 则会引发 BadPaddingException 我希望返回一个不正确的字符串 doFinal 导致解密方法出现异常 信息 This is just an example Unfug S F V s
  • H2数据库:如何进行加密保护,而不暴露文件加密密钥

    我们在服务器模式下使用Java H2数据库 因为我们不希望用户访问数据库文件 为了对数据库文件添加更多保护 我们计划使用 AES 加密 将 CIPHER AES 添加到数据库 URL 以防存储被盗 但是 每个用户在连接时还需要提供文件保护密
  • iOS 目标 c 中的 AES/CBC/PKCS5Padding 结果与 Android 不同

    我在 Android 应用程序中使用 AES CBC PKCS5Padding 代码就像 private static String TRANSFORMATION AES CBC PKCS5Padding private static St
  • 将 PHP mcrypt 与 Rijndael/AES 结合使用

    我正在尝试使用 php 中的 mcrypt 和密码 Rijndael 加密一些文本消息 但我不确定 MCRYPT MODE modename 根据 PHP 手册 这些可用 ecb cbc cfb ofb nofb 或 stream 但我读到
  • 为 Raspberry Pi 2 交叉编译 rust-openssl

    我在一台 Debian 机器上 我想为我的 Raspberry Pi 2 交叉编译一个项目 我已经设法使用 rustup 为一个简单的 hello world 做到了这一点 但不知道如何交叉编译 rust openssl crate 我已经
  • xampp openssl 调用 openssl_pkey_new() 时出错;

    所以我试图让 openssl 在我的 Windows 安装的 xampp 1 7 3 上工作 它是用 OpenSSL 0 9 8l 构建的 这只是我第二次在 amp 安装上安装 openssl 但第一次进展顺利 这是在同一台机器上的 wam
  • 如何解释 openssl 速度输出?

    I ran openssl speed在我的 Ubuntu 计算机上 一些结果 Doing md4 for 3s on 16 size blocks 9063888 md4 s in 3 00s Doing md4 for 3s on 64
  • “volatile void function( ... )” 做了什么?

    我见过从语法角度来看 C 函数中 volatile 关键字有多少种用法 https stackoverflow com questions 7643528 how many usage does volatile keyword have
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • 使用 PHP 的 openssl_pkcs7_sign 签署 pdf 时出错

    我正在使用 TCPDF 生成 pdf 文档并对其进行签名 TCPDF 本身只是调用 PHP 的openssl pkcs7 sign函数 在我看来 它正在调用 C 的PKCS7 sign函数基于源代码 https github com php

随机推荐