3

好的,所以我打包了一个专有的二进制格式。这基本上是几个不同栅格数据集的松散包装。无论如何,过去只是阅读本文并打开包装是一件容易的事。但是现在在下一个版本中,光栅 xml 数据现在将使用 AES-256 加密(不是我的选择,我们也没有选择)。

现在我们基本上收到了 AES 密钥以及他们正在使用的 SALT,因此我们可以修改我们的解包器。

注意这些不是键,只是一个例子:

它们都是 63 字节长的 ASCII 字符:

Key: "QS;x||COdn'YQ@vs-`X\/xf}6T7Fe)[qnr^U*HkLv(yF~n~E23DwA5^#-YK|]v."
Salt: "|$-3C]IWo%g6,!K~FvL0Fy`1s&N<|1fg24Eg#{)lO=o;xXY6o%ux42AvB][j#/&"

我们基本上想使用 C++ CryptoAPI 来解密这个(我也是这周唯一的程序员,明天就会上线。不是我们的错)。我环顾四周寻找实现这一点的简单教程。不幸的是,我什至找不到他们分别拥有盐和密钥的教程。基本上,我现在真正拥有的只是一个接收 BYTE 数组的小函数。连同它的长度。我怎样才能做到这一点?

我早上大部分时间都在尝试制作cryptoAPI的正面/反面。但它并不顺利时期:(

编辑

所以我问他们如何加密它。他们使用 C#,并使用 RijndaelManaged,据我所知,这并不等同于 AES。

编辑2

好的,终于知道发生了什么,他们给我们发错了钥匙。

他们正在做以下事情:

Padding = PKCS7 CipherMode = CBC 密钥定义为一组 32 字节的十六进制。IV 也被定义为一组 32 字节的十六进制。

当我问他们时,他们拿走了盐。

使用 wincrypt.h 头文件在 CryptoAPI 中设置这些东西有多难?

4

2 回答 2

5

AES-256 使用 256 位密钥。理想情况下,系统中的每个键都应该具有相同的可能性。一个 63 字节的字符串将是 504 位。您首先需要弄清楚 63 个字符的字符串需要如何转换为 256 位(您提供的示例不是 base64 编码的)。接下来,“盐”不是 AES 的固有部分。您可能指的是 Cipher-Block-Chaining 模式下的初始化向量 (IV),或者您可能指的是以某种方式更新密钥。

如果我猜的话,我假设“SALT”是指 IV,特别是 CBC 模式。

使用 CAPI 函数(例如,解密)时,您将需要了解所有这些。

如果所有这些听起来令人困惑,那么最好更改您的设计,这样您就不必担心如何正确处理所有这些问题。加密很难。一个错误的步骤可能会使所有安全性失效。考虑在我的Stick Figure Guide to AES上查看此评论

更新:您可以查看此内容以获得 C++ CAPI 的粗略起点。您需要一个 64 字符的十六进制字符串来获得 256 位(256 位/(4 位/字符)== 64 字符)。您可以自己将字符转换为位。

再一次,我必须提醒,快速和松散地使用 IV 和键可能会产生灾难性的后果。我已经深入研究了 AES/Rijndael 到数学和门级,甚至编写了自己的实现。但是,在我的生产代码中,如果可能的话,我会坚持使用经过良好测试的 TLS 实现来处理传输中的数据。即使对于静态数据,最好使用更高级别的库

于 2009-10-06T14:04:42.963 回答
-5

Rijndael 是AES的算法名称

于 2009-10-06T14:34:12.793 回答