0

C++ 河豚支持加密少于 8 个字母的块,而 .NET 不支持。为什么?

-->C# NET Blowfish<-- -->C++ Blowfish<--

在 C++ 和 C# 应用程序中,我加密了以下数组

    byte response[6] = 
    {
        0x00, 0x80, 0x01, 0x61, 0x05, 0x06
    };

在 C++ 和 C# 应用程序中,我使用相同的参数调用 Encrypt 函数。

C++
Blowfish.Encrypt((LPBYTE)responce + 2,(LPBYTE)responce + 2, 4);

C#
Blowfish.Encrypt(responce, 2, responce, 2, responce.Length - 2);

但是,在 C++ 中,我得到了加密的数据,但不是在 C# 中。

C# NET Blowfish中的第 45,47 和 49行是有问题的行,在第 45 行计算后 - 结果变为 0。第 47 行变为 2 + 0 = 2 并且第 49 行 2 不小于 2,因此没有循环。

C ++河豚中有一些填充,但是当我尝试理解它时我迷路了。

我的问题是,在 C# 中,填充必须与 C++ 中的完全相同,所以我得到了一个有效的答案。我不能使用随机填充然后在解密后删除无用的字节,因为我发送加密数组的服务器是不是我的。

您能否指出 C++ 河豚中使用了哪些填充以及如何在 C# NET 中实现它。

//注意我不需要多次发送这个数据包,只需一次。

提前致谢!

4

1 回答 1

2

您粘贴的代码(顺便说一下,不推荐用于 SO,因为如果一段时间内没有人阅读它,您的粘贴将被删除,从而使这个问题被打破)在其标题评论中说:

/// Note that the number of bytes must be adjusted to the block size of the algorithm.

(第 3 行和第 4 行)。因此,如果它忽略您的数据不足,它似乎表现得符合规范。

C++ 代码似乎用空字节填充,评论说:

// pad end of data with null bytes to complete encryption

GetOutputLength()查看 C++ 函数,了解它如何处理尺寸过小的输入会很有帮助。我猜它向上舍入,但很高兴验证。

于 2009-04-01T07:33:08.013 回答