c++ - 如何使用 Botan 库和特定的密码套件加密数据?

标签 c++ ssl network-programming botan

我用过Botan::TLS::Callbacks还有Botan::TLS::Client Botan::TLS::Server为了在客户端和服务器之间获得安全通道。同样为了加密解密数据,我使用了 <botan/pubkeys.h> <botan/pk_keys.h>和其他包括 Botan 库中的 header 。

我的问题是:

  1. 为什么 Botan::PK_Encryptor_EME对象不会在 Server_Hello_Message 中获得双方协商的加密算法作为密码套件。他们只是将公钥、随机数生成器和最佳加密填充算法作为输入。提到该算法未被明显且真实的 key 所采用(算法我指的是批量加密算法,如 AES-128 )。

  2. 如何保护 tls channel ?正如我通过源代码发现的那样,有一个函数 Botan::TLS::Callbacks tls_emit_data(const uint8_t[], size_t)这将通过安全通道发送数据!即使客户端和服务器之前已经协商并交换了非对称 key ,数据也应该使用双方同意的对称 key 进行加密。

最佳答案

Botan::TLS::Client/Botan::TLS::Server 类实现了 TLS 协议(protocol)操作。具体来说,他们会为您处理加密操作。但是,他们对传输层一无所知,例如从套接字读取/写入。这部分必须由您实现。

在一个典型的实现中,建立连接后,您将调用 client.send(buf, len) 并发送一些您想要发送到服务器的数据。客户端在内部构建 TLS 记录并调用您的 tls_emit_data 回调以将它们发送到传输层,因此您可以将其写入某个套接字。在服务器端,您将监听套接字并读取此 TLS 记录。然后将其传递给 server.received_data(buf, len)。服务器在内部从 TLS 记录中提取实际数据,并通过 tls_record_received 回调将其提供给您。

更多详细信息可以在 Botan API documentation 中找到.

关于您的问题:

  1. 我不确定您指的是代码的哪一部分。我可以在 Botan tls 模块中找到的 PK_Encryptor_EME 的唯一用法是 here在客户端 key 交换期间。 key 交换不涉及使用用于传输数据的分组密码进行加密。这发生在例如here .

  2. tls_emit_data 将在客户端/服务器构建 TLS 记录时调用。加密已在内部处理,您只需将 TLS 记录传递给传输层。

示例实现

Botan 包含一个基本 TLS 客户端/服务器的示例实现:tls_server , tls_client .

这可以通过 Botan 命令行界面进行测试:

  • 生成 CA 证书:
$ mkdir certdir
$ botan keygen > ca_key.pem
$ botan gen_self_signed --ca ca_key.pem my_root_authority > certdir/ca_cert.pem
  • 生成服务器证书:
$ botan keygen > server_key.pem
$ botan gen_pkcs10 server_key.pem localhost > server_csr.pem
$ botan sign_cert certdir/ca_cert.pem ca_key.pem server_csr.pem > server_cert.pem
  • 启动 TLS 服务器(可能需要特权用户):
# botan tls_server server_cert.pem server_key.pem
  • 启动 TLS 客户端:
$ botan tls_client localhost --trusted-cas=certdir
Certificate validation status: Verified
Handshake complete, TLS v1.2 using CECPQ1_RSA_WITH_CHACHA20_POLY1305_SHA256
Session ID ...

示例代码中的一些兴趣点:

  • Botan::TLS::Client 已创建 hereBotan::TLS::Server 已创建 here .
  • Botan::TLS::Policy 可用于限制,例如可以使用哪些 TLS 版本和密码模式:Link
  • 客户端从标准输入中读取数据 here .它在内部构造 TLS 记录并将它们传递给 tls_emit_data 回调,定义为 here用于将 TLS 记录写入套接字。
  • TLS 记录从套接字中读取并传递给服务器here .
  • 服务器在内部从 TLS 记录中提取数据并将其传递给 tls_record_received here .

关于c++ - 如何使用 Botan 库和特定的密码套件加密数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57542040/

相关文章:

docker - SSL 证书验证适用于 Docker,而不适用于 Kubernetes

android - Nativescript 应用程序不适用于 Android API 17

java - 在 setSoTimeout 中等待的合理时间是多少

node.js - 我应该发送多少个并发 http 请求?

c - 伯克利套接字,运行简单的客户端和服务器连接

c++ - 如何强制对模板参数类型进行签名?

C++ 创建一个类的实例?

c++ - C++字符串表达式求解器运行冲突

c++ - 在 Release 模式下访问时 vector 大小为 0

scala - 以编程方式为 WSClient 指定证书