2009-10-06 46 views
3

好吧,所以我打包了一个专有的二进制格式。这基本上是几个不同栅格数据集的松散打包。无论如何,只要阅读本文并拆包是一件容易的事。但现在在下一个版本中,栅格xml数据现在要使用AES-256进行加密(不是我的选择,也没有选择)。AES和CryptoAPI解密?当你知道钥匙/盐

现在我们基本上发送了AES密钥和他们正在使用的SALT,所以我们可以修改我们的解包器。

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

他们是每个63字节长的ASCII字符:

Key: "QS;x||COdn'[email protected]`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中设置这些内容有多难?

+0

只要你的块大小为128位和你坚持到128位,192位或256位密钥算法的名称,你可以合理假设RijndaelManaged的== AES在具体细节http://blogs.msdn.com/shawnfa/archive/2006/10/09/The-Differences-Between-Rijndael-and-AES.aspx – 2009-10-06 14:27:41

+0

即使你的编辑,你仍然需要知道他们的编码方案'将任意字节转换为可打印字符。另外,您需要确认密码模式。密码分组链接(CBC)? – 2009-10-06 14:29:26

回答

4

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

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

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

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

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

再说一次,我必须警告,用IV和钥匙快速松动会产生灾难性的后果。我深入研究了AES/Rijndael,直到数学和门级,甚至编写了我自己的实现。但是,在我的生产代码中,如果可能的话,我仍然坚持使用经过良好测试的TLS实现。即使对于静止的数据,最好使用higher level library

+0

谢谢,示例代码工作正常。它现在只是一个巨大的绷带。但它会让我们满意明天,直到我们可以评估一个真正的选择。 – UberJumper 2009-10-06 22:47:09

-5

Rijndael算法是AES

+0

但是Rijndael不是AES! AES将块大小限制为128位,Rijndael允许从128位到256位进行块化。 – bkausbk 2013-11-26 07:56:03

+0

我站好了。 AES是否基于Rijndael会公平吗? – Calyth 2013-11-27 14:54:11