Question

Ok je suis en train d'utiliser l'API Win32 Crypto en C ++ pour décrypter une chaîne cryptée en C # (.NET 2) avec la classe RijndaelManaged. Mais je vais avoir pas de chance je reçois charabia ou une mauvaise données code d'erreur Win32. Toutes mes clés, IV et match de sel, j'ai regardé dans la montre pour les applications de test. J'ai passé tout dire regarder et je suis coincé officielement.

est ici le C De toute façon #

            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(GetPassPhrase(), salt, 1000);
        RijndaelManaged rijndael = new RijndaelManaged();
        rijndael.BlockSize = 128;
        rijndael.KeySize = 256;
        rijndael.Mode = CipherMode.CBC;

        rijndael.Key = pdb.GetBytes(m_KeySize);
        rijndael.IV = GetIV(iv);

        ICryptoTransform encryptor = rijndael.CreateEncryptor(); 
        MemoryStream msEncrypt = new MemoryStream();
        CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
        Byte[] encryptedBytes = null;
        Byte[] toBeEncrypted = UnicodeEncoding.Unicode.GetBytes(value);

        csEncrypt.Write(toBeEncrypted, 0, toBeEncrypted.Length);
        csEncrypt.FlushFinalBlock();
        encryptedBytes = msEncrypt.ToArray();

C ++ pour le décrypter est:

                                    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;
                        }
                    }
                }

Je vous appelle avec succès CryptAcquireContext et mon C ++ exécute bien. Quelqu'un peut-il repérer l'erreur dans mes voies. Il commence à me déprimer sais: (

Était-ce utile?

La solution

Ok ma faute, je ne comprend pas la définition struct pour le keyblob dans le C ++ et il se trouve que vous avez besoin d'un bloc Contigous de données pour la clé avec l'en-tête mais j'utilisait l'exemple MSDN qui avait un pointeur vers les données clés. Ce qui est faux!

Autres conseils

Je vois que vous utilisez le mode CBC Enchaînement pour chiffrer le texte brut.

Êtes-vous sûr que vous utilisez le même mode de chaînage pour déchiffrer le texte Cypher?

(Je suis désolé. Je ne suis pas en mesure de comprendre que du code)

Il y a une poignée de choses que vous devriez vérifier, car une partie du code (déclarations, etc.) sont manquants:

  • Taille du bloc - ceci ne devrait normalement être la même que la taille de clé, je pense qu'il pourrait même être la valeur par défaut puisque vous ne spécifiez-le sur le côté C. Réglez-256 sur le côté C #, je suppose qu'il valait mieux que vous spécifiez explicitement dans C ++ aussi.
  • Rembourrage -. Les classes gérées ont PKCS7 leur remplissage par défaut, I pense son par défaut pour les fonctions de cryptoapi aussi, mais je ne suis pas sûr
  • Je suppose que GetPassPhrase, etc GetIV vous donnent même il les clés que vous utilisez sur le côté C?
  • On ne sait pas comment les données cryptées sont transmises entre les programmes, est-il possible qu'il y ait une sorte d'erreur de traduction? Par exemple. base64, encode URL, etc.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top