用AES和CryptoAPI解密?当你知道KEY / SALT时

时间:2009-10-06 13:38:46

标签: c++ rijndaelmanaged cryptoapi

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

现在我们基本上发送了AES密钥以及他们正在使用的SALT,因此我们可以修改我们的unpackager。

注意这些不是钥匙只是一个例子:

它们每个都是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。

EDIT2

好的,最后得到了正在发生的事情,他们给了我们错误的钥匙。

他们正在做以下事情:

填充= PKCS7 CipherMode = CBC 密钥定义为一组32字节(十六进制)。 IV也定义为一组32字节(十六进制)。

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

使用wincrypt.h头文件在CryptoAPI中设置这些内容有多难。?

2 个答案:

答案 0 :(得分:5)

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

如果我猜测,我假设“SALT”你的意思是IV,特别是CBC模式。

使用CAPI功能(例如decrypt)时,您需要了解所有这些。

如果所有这些听起来令人困惑,那么最好改变您的设计,这样您就不必担心这一切都是正确的。加密很难。一个糟糕的步骤可能使所有安全性无效。考虑查看this comment上的Stick Figure Guide to AES

更新:您可以look at this for a rough starting指向C ++ CAPI。你需要一个64字符的十六进制字符串来获得256位(256位/(4位/字符)== 64个字符)。您可以自己将字符转换为位。

同样,我必须提醒一下,用IV和钥匙快速松动可能会带来灾难性的后果。我已经深入研究了AES / Rijndael到数学和门级,甚至编写了我自己的实现。但是,在我的生产代码中,如果可能的话,我会坚持使用经过充分测试的TLS实现来传输数据。即使对于静止的数据,最好使用higher level library

答案 1 :(得分:-5)

Rijndael是AES

的算法名称