如何使用 Botan 库和特定的密码套件加密数据?
How to encrypt data using Botan library and a specific cipher suite?
我曾使用 Botan::TLS::Callbacks
和 Botan::TLS::Client
Botan::TLS::Server
来获得客户端和服务器之间的安全通道。此外,为了 encrypt-decrypt 数据,我使用了 <botan/pubkeys.h>
<botan/pk_keys.h>
和其他包括 Botan 库中的 headers。
我的问题是:
为什么Botan::PK_Encryptor_EME
objects没有得到双方协商的加密算法作为[=35中的密码套件 =].他们只是将 Public 密钥、随机数生成器和最佳加密填充算法作为输入。提到算法没有被明显和真实的密钥所采用(算法我的意思是像AES-128
这样的批量加密算法)。
如何保护 tls 通道?正如我通过源代码发现的那样,有一个函数 Botan::TLS::Callbacks tls_emit_data(const uint8_t[], size_t)
将通过安全通道发送数据!即使客户端和服务器之前已经协商并交换了非对称密钥,数据也应该使用双方同意的对称密钥进行加密。
Botan::TLS::Client
/ Botan::TLS::Server
类 实现TLS协议操作。具体来说,他们会为您处理加密操作。但是,他们对传输层一无所知,例如从套接字读取/写入。这部分必须由你来实现。
在典型的实现中,建立连接后,您将调用 client.send(buf, len)
并提供一些要发送到服务器的数据。客户端在内部构建 TLS 记录并调用您的 tls_emit_data
回调以将它们发送到传输层,因此您可以将其写入某个套接字。在服务器端,您将监听套接字并读取此 TLS 记录。然后你会把它传递给 server.received_data(buf, len)
。服务器在内部从 TLS 记录中提取实际数据,并通过 tls_record_received
回调将其提供给您。
可以在 Botan API documentation 中找到更多详细信息。
关于您的问题:
我不确定你指的是代码的哪一部分。我在 Botan tls 模块中可以找到的 PK_Encryptor_EME
的唯一用法是 here during the client key exchange. The key exchange does not involve encryption with the block cipher used for transmitting data. This happens e.g. here.
tls_emit_data
将在 client/server 构建 TLS 记录时调用。加密已在内部处理,您只需将 TLS 记录传递给传输层。
示例实现
Botan 包含基本 TLS client/server 的示例实现: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
here, the Botan::TLS::Server
is created here。
Botan::TLS::Policy
可用于限制,例如可以使用哪些 TLS 版本和密码模式:Link
- 客户端从 stdin here. It constructs TLS records internally and passes them to the
tls_emit_data
callback, defined here 读取数据,用于将 TLS 记录写入套接字。
- 从套接字读取TLS记录并传递给服务器here。
- 服务器在内部从 TLS 记录中提取数据并将其传递给
tls_record_received
here。
我曾使用 Botan::TLS::Callbacks
和 Botan::TLS::Client
Botan::TLS::Server
来获得客户端和服务器之间的安全通道。此外,为了 encrypt-decrypt 数据,我使用了 <botan/pubkeys.h>
<botan/pk_keys.h>
和其他包括 Botan 库中的 headers。
我的问题是:
为什么
Botan::PK_Encryptor_EME
objects没有得到双方协商的加密算法作为[=35中的密码套件 =].他们只是将 Public 密钥、随机数生成器和最佳加密填充算法作为输入。提到算法没有被明显和真实的密钥所采用(算法我的意思是像AES-128
这样的批量加密算法)。如何保护 tls 通道?正如我通过源代码发现的那样,有一个函数
Botan::TLS::Callbacks tls_emit_data(const uint8_t[], size_t)
将通过安全通道发送数据!即使客户端和服务器之前已经协商并交换了非对称密钥,数据也应该使用双方同意的对称密钥进行加密。
Botan::TLS::Client
/ Botan::TLS::Server
类 实现TLS协议操作。具体来说,他们会为您处理加密操作。但是,他们对传输层一无所知,例如从套接字读取/写入。这部分必须由你来实现。
在典型的实现中,建立连接后,您将调用 client.send(buf, len)
并提供一些要发送到服务器的数据。客户端在内部构建 TLS 记录并调用您的 tls_emit_data
回调以将它们发送到传输层,因此您可以将其写入某个套接字。在服务器端,您将监听套接字并读取此 TLS 记录。然后你会把它传递给 server.received_data(buf, len)
。服务器在内部从 TLS 记录中提取实际数据,并通过 tls_record_received
回调将其提供给您。
可以在 Botan API documentation 中找到更多详细信息。
关于您的问题:
我不确定你指的是代码的哪一部分。我在 Botan tls 模块中可以找到的
PK_Encryptor_EME
的唯一用法是 here during the client key exchange. The key exchange does not involve encryption with the block cipher used for transmitting data. This happens e.g. here.tls_emit_data
将在 client/server 构建 TLS 记录时调用。加密已在内部处理,您只需将 TLS 记录传递给传输层。
示例实现
Botan 包含基本 TLS client/server 的示例实现: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
here, theBotan::TLS::Server
is created here。 Botan::TLS::Policy
可用于限制,例如可以使用哪些 TLS 版本和密码模式:Link- 客户端从 stdin here. It constructs TLS records internally and passes them to the
tls_emit_data
callback, defined here 读取数据,用于将 TLS 记录写入套接字。 - 从套接字读取TLS记录并传递给服务器here。
- 服务器在内部从 TLS 记录中提取数据并将其传递给
tls_record_received
here。