C++ - 在没有加密大小的情况下解密

标签 c++ cng

我找了一段时间,没有找到解决这个问题的办法。我正在使用 BCryptDecrypt 来解密我的加密数据,但它需要 EncryptedData 的大小,您如何在不知道大小的情况下解密?

我知道 BCryptEncrypt 会在成功加密数据后为您提供长度,我知道的唯一方法是将其与加密数据/IV 一起发送。

例如:假设我要加密数据,然后通过带有 IV 的套接字将其发送到我的 WinSock 服务器,该服务器将解密数据。该服务器如何在不知道大小的情况下解密它?即使它知道 key 和 IV。

谢谢

最佳答案

如果需要大小,我看到两种获取方式:

  • 将其与加密数据一起显式发送。
  • 在服务器端缓冲所有数据,直到它被完全接收。跟踪您收到的字节数。

首先,你可以尝试这样的事情:

<number of bytes to follow><separator symbol><message data>

其次要求您能够正确检测到消息的结尾。您可以通过特定的消息结束序列检测到这一点。然而,如果出现的话,您需要在消息中转义这样的序列。类似于 C/C++/Java/C# 中字符的转义方式...如果不选择第一种方法,这对我来说是最简单的,这就是我可能更喜欢下面的变体...

另一种方法可能是在消息完成后关闭连接。然后,但是,您需要检测连接是否定期关闭或是否断开,因为在后一种情况下,您不能尝试解码...

您甚至可以将这两种方法结合起来:

<message start sequence>
<number of bytes to follow>
<separator symbol>
<encrypted data>
<message end sequence>

消息开始序列和消息结束序列都必须被转义。如果您在加密数据中检测到消息开始序列,或者在读取字节数之前检测到消息结束序列,您就会知道在服务器端出现了严重错误...

关于C++ - 在没有加密大小的情况下解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39314596/

相关文章:

c++ - 有没有办法从另一个进程中找出完整的文件路径?

c++ - 如何根据特定对象的类型调用特定函数

c# - CNG 从文件导入 ECC 公钥/私钥

c++ - CNG:何时使用 BCrypt* 与 NCrypt* 系列函数

c++ - 使用 CryptoAPI Next Generation (CNG) 加密数据的直接示例

c++ - 类之外的运算符重载!

Java JNI JAWT 错误未解析的外部符号 __imp__JAWT_GetAWT@8

c++ - 有没有一种通用的方法可以在 C++ 中的堆栈上保留状态变量?

c++ - 将原始函数与存储在 Microsoft KSP 中的 key 一起使用

c# - 与 ECDsaCng 算法一起使用的 key 必须具有 ECDsa 算法组