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

Ube*_*per 3 c++ cryptoapi rijndaelmanaged

好的,所以我有一个专有的二进制格式.这基本上是几个不同栅格数据集的松散包装.无论如何,过去只是阅读这个和拆包是一件容易的事.但是现在在下一个版本中,光栅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#/&"
Run Code Online (Sandbox Code Playgroud)

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

我早上大部分时间都在尝试制作cryptoAPI的头/尾.但它的进展并不顺利:(

编辑

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

EDIT2

好吧,终于得到了正在发生的事情,他们给了我们错误的钥匙.

他们正在做以下事情:

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

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

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

Jef*_*ser 5

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

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

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

如果所有这些听起来令人困惑,那么最好改变你的设计,这样你就不必担心这一切都是正确的.加密很难.一个糟糕的步骤可能使所有安全性无效.考虑一下我对AES棒图指南的评论.

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

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