我正在考虑使用 AES256 CBC + HMAC SHA-256 作为确保机密性和身份验证的消息的构建块。
特别是,考虑这种情况:
- Alice 拥有属于 Bob 的公钥(密钥交换和算法超出了本问题的范围)。Alice 有一个识别密钥 K,也与 Bob 共享,她可以用它来识别自己。只有 Alice 和 Bob 知道密钥 K。
- Alice 使用 Bob 的公钥加密 (nonce || K)。
- Bob 解密数据包,现在有 K 和 nonce。
- Bob 使用 SHA-256 和 SHA256(K || nonce) 来产生 256 位的 K(e)。
- Bob 使用 SHA-256 和 SHA256(K || nonce + 1) 来产生 256 位的 K(s)。
现在对于 Bob 希望发送给 Alice 的每个数据包,他执行以下操作:
- 创建一个新的随机 128 位 IV
- 使用 IV 和 K(e) 作为密钥加密消息。
- 创建一个 SHA-256 HMAC,其中 K(s) 作为密钥,(IV || Encrypted message) 作为数据。
- 最后将 (IV || HMAC || Ciphertext) 发送给 Alice
Alice 还计算了 K(e) 和 K(s),并在接收 Bob 的数据时遵循以下过程:
- 将消息拆分为 IV、密文和 HMAC。
- 使用 K(s)、IV 和密文计算 HMAC。
- 将 HMAC 与发送的 HMAC 进行比较。如果匹配,Alice 认为这个消息被认证为 Bob 发送的消息,否则被丢弃。
- Alice 使用 K(e) 解密消息
这个协议是否确保 Alice 只解密来自 Bob 的消息,假设除了 Bob 之外没有人可以读取 Alice 发送给他的使用他的公钥加密的加密消息?
即以这种方式构建的消息是否确保机密性和身份验证?
注意:如果协议要求 Bob 发送多条消息,该方案需要稍作修改以避免重放攻击。
PS 我知道 AES-GCM/CCM,但这个方案适用于大多数加密包中的基本 AES、SHA 和 HMAC 算法。这个解决方案也可能会更慢,但这也超出了问题的范围。