如何找到用于AES加密我的数据的初始化向量CAPICOM?

问题描述:

我有一个用传统ASP编写的应用程序,它通过CAPICOM加密数据并将其存储在数据库中。加密的代码看起来是这样的(经典的ASP,VB简化一点赘述。):如何找到用于AES加密我的数据的初始化向量CAPICOM?

set encryptObject = Server.CreateObject("CAPICOM.EncryptedData") 

encryptObject.Algorithm.Name = 4 ' 4 is AES 
encryptObject.Algorithm.KeyLength = ' 0 is MAX 
encryptObject.SetSecret(sharedSecret) ' sharedSecret was set earlier 
encryptObject.Content = stringToEncrypt 

encryptedString = encryptObject.Encrypt() 

现在,我有需要读取这些数据,并对其进行解密.NET应用程序。在使用RijndaelManaged类之前,我在.NET中完成了与AES兼容的加密/解密,我希望我可以使用相同的方法来解密这些数据。但是,我无法弄清楚如何使它与CAPICOM的加密数据一起工作,因为RijndaelManaged要求您在调用RijndaelManaged.CreateEncryptor时传递一个密钥AND初始化向量,并且CAPICOM不采用初始化向量。我假设CAPICOM必须使用初始化向量,但不能公开它。我怎样才能找到那个矢量?

+0

好奇,如果你找到了解决方案。我处于同样的情况,并且正忙于解密工作! – Dave 2014-01-11 21:07:42

+0

@Dave - 我从来没有这个工作,我们最终采取了另一种方法。但我确实发现CAPICOM在Classic ASP中吐出的值不仅包含加密值,还用其他属性加密了整个复杂对象。任何解密例程都需要解析整个对象才能正常工作。 – 2014-01-13 05:56:56

首先将全零IV传递给.NET解密例程。

如果整个邮件解密正常,那么原始加密也使用空IV。

它很可能会得到一个损坏的第一个块(16个字节)和可读的第二个和后续块。

如果第二个块看起来好像是消息的实际开始,那么原始IV将作为加密消息的第一个块传递。这是一种非常常见的技术。

如果没有,那么你将不得不询问谁加密了消息,他们使用了什么IV。或者没有消息的前16个字节。

+0

作为一个小小的说明,您将需要创建一个完全块大小的字节的空 - 四,对于AES是16字节。 – 2012-01-02 13:43:57