C# 使用CryptDecrypt解密RijndaelManaged加密字符串 OK,我尝试使用C++中的Win32加密API来解密一个用RijnDaelM托管类加密的C(2)中加密的字符串。但我一点运气都没有,我得到了jibberish或坏数据Win32错误代码。我所有的钥匙,静脉注射和盐匹配,我已经在手表上找到了这两个测试应用。我花了我所有的时间去看它,我正式地被卡住了

C# 使用CryptDecrypt解密RijndaelManaged加密字符串 OK,我尝试使用C++中的Win32加密API来解密一个用RijnDaelM托管类加密的C(2)中加密的字符串。但我一点运气都没有,我得到了jibberish或坏数据Win32错误代码。我所有的钥匙,静脉注射和盐匹配,我已经在手表上找到了这两个测试应用。我花了我所有的时间去看它,我正式地被卡住了,c#,c++,aes,rijndaelmanaged,rijndael,C#,C++,Aes,Rijndaelmanaged,Rijndael,不管怎样,这是C# C++对其进行解密是: keyBlob.hdr.bType = PLAINTEXTKEYBLOB; keyBlob.hdr.bVersion = CUR_BLOB_VERSION; keyBlob.hdr.reserved = 0; keyBlob.hdr.aiKeyAlg = CALG_AES_256;

不管怎样,这是C#

<> C++对其进行解密是:

                                    keyBlob.hdr.bType = PLAINTEXTKEYBLOB;
                keyBlob.hdr.bVersion = CUR_BLOB_VERSION;
                keyBlob.hdr.reserved = 0;
                keyBlob.hdr.aiKeyAlg = CALG_AES_256;
                keyBlob.cbKeySize = KEY_SIZE;
                keyBlob.rgbKeyData = &byKey[0];

                if ( CryptImportKey( hProv, (const LPBYTE) &keyBlob, sizeof(BLOBHEADER) + sizeof(DWORD) + KEY_SIZE, 0, CRYPT_EXPORTABLE, &hKey ) )
                {

                    if ( CryptSetKeyParam( hKey, KP_IV, (const BYTE *) &byIV, 0))
                    {
                        DWORD dwLen = iDestLen;
                        if ( CryptDecrypt( hKey, 0, TRUE, 0, pbyData, &dwLen))
                        {

                            if ( dwLen < (DWORD) *plOutSize)
                            {
                                memcpy_s(pbyOutput, *plOutSize, pbyData, dwLen);

                                *plOutSize = dwLen;

                                bRet = TRUE; 
                            }
                        }
                        else
                        {
                            // Log
                            DWORD dwErr = ::GetLastError();
                            int y =0;
                        }
                    }
                }
keyBlob.hdr.bType=PLAINTEXTKEYBLOB;
keyBlob.hdr.bVersion=CUR_BLOB_版本;
keyBlob.hdr.reserved=0;
keyBlob.hdr.aiKeyAlg=CALG_AES_256;
keyBlob.cbKeySize=键大小;
keyBlob.rgbKeyData=&byKey[0];
if(CryptImportKey(hProv,(常量LPBYTE)和keyBlob,sizeof(BLOBHEADER)+sizeof(DWORD)+KEY_SIZE,0,CRYPT_EXPORTABLE和hKey))
{
if(CryptSetKeyParam(hKey,KP_IV,(常量字节*)和byIV,0))
{
DWORD dwLen=iDestLen;
if(加密解密(hKey、0、TRUE、0、pbyData和dwLen))
{
如果(dwLen<(DWORD)*plOutSize)
{
memcpy_s(pbyOutput、*plOutSize、pbyData、dwLen);
*plOutSize=dwLen;
bRet=真;
}
}
其他的
{
//日志
DWORD dwErr=::GetLastError();
int y=0;
}
}
}

我成功地打电话给CryptAcquireContext,我的C++执行得很好。有人能看出我的错误吗。它开始让我感到沮丧,知道:(

我看到您正在使用CBC链接模式来加密纯文本

您确定使用相同的链接模式解密密码文本吗


(很抱歉,我无法从代码中理解这一点)

由于一些代码(声明等)缺失,您需要检查一些内容:

  • 块大小-这通常应该与密钥大小相同,我认为它甚至可能是默认的,因为您不在C++侧指定它。将它设置为C 256的边,我想最好是在C++中显式指定它。
  • 填充-托管类将PKCS7作为默认填充,我认为这也是cryptoAPI函数的默认填充,但我不确定
  • 我假设GetPassPhrase,GETIV等给你你在C++方面使用的相同的键?
  • 不清楚加密数据是如何在程序之间传递的,是否可能存在某种翻译错误?例如base64、URL编码等

OK,我没有在C++中包含KEYBROB的Struts DEF,结果是需要一个带有标题的密钥的连续数据块,但是我使用的是MSDN例子,它有一个指向键数据的指针。这是错误的!< /P>根据MSDN,AES的缺省值是CBC。虽然它可能是错误的。

                                    keyBlob.hdr.bType = PLAINTEXTKEYBLOB;
                keyBlob.hdr.bVersion = CUR_BLOB_VERSION;
                keyBlob.hdr.reserved = 0;
                keyBlob.hdr.aiKeyAlg = CALG_AES_256;
                keyBlob.cbKeySize = KEY_SIZE;
                keyBlob.rgbKeyData = &byKey[0];

                if ( CryptImportKey( hProv, (const LPBYTE) &keyBlob, sizeof(BLOBHEADER) + sizeof(DWORD) + KEY_SIZE, 0, CRYPT_EXPORTABLE, &hKey ) )
                {

                    if ( CryptSetKeyParam( hKey, KP_IV, (const BYTE *) &byIV, 0))
                    {
                        DWORD dwLen = iDestLen;
                        if ( CryptDecrypt( hKey, 0, TRUE, 0, pbyData, &dwLen))
                        {

                            if ( dwLen < (DWORD) *plOutSize)
                            {
                                memcpy_s(pbyOutput, *plOutSize, pbyData, dwLen);

                                *plOutSize = dwLen;

                                bRet = TRUE; 
                            }
                        }
                        else
                        {
                            // Log
                            DWORD dwErr = ::GetLastError();
                            int y =0;
                        }
                    }
                }