Domanda

Ok Sto cercando di utilizzare l'API Win32 Crypto in C ++ per decifrare una stringa crittografata in C # (.NET 2) con la classe RijndaelManaged. Ma sto avendo alcuna fortuna a tutti ottengo jibberish o un dato codice di errore Win32 male. Tutte le mie chiavi, IV e abbinare il sale, ho guardato l'orologio per entrambe le applicazioni di test. Ho passato tutti dicono a guardarla e io sono ufficialmente bloccato.

In ogni caso ecco la C #

            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();

Il C ++ per decifrare è:

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

Chiamo CryptAcquireContext successo e la mia C ++ è in esecuzione bene. Chiunque può individuare l'errore nelle mie vie. Sta cominciando a deprimere essere informato: (

È stato utile?

Soluzione

Ok colpa mia, non ho include il DEF Struct per la keyblob in C ++ e si scopre che è necessario un blocco contigui dei dati per la chiave con il colpo di testa, ma io stava usando l'esempio MSDN che aveva un puntatore a i dati chiave. Quale è sbagliato!

Altri suggerimenti

Vedo che si sta utilizzando la modalità CBC concatenamento per cifrare il testo in chiaro.

Sei sicuro che si sta utilizzando la stessa modalità di concatenamento per decifrare il testo cifrato?

(mi dispiace. Io non sono in grado di capire che dal codice)

Ci sono una manciata di cose che si dovrebbe verificare, in quanto parte del codice (dichiarazioni, ecc) sono mancanti:

  • dimensioni del blocco - questo di solito dovrebbe essere la stessa dimensione della chiave, penso che potrebbe anche essere il default dal momento che voi non specificarlo sul lato C ++. Impostare a 256 su C # lato, credo che la cosa migliore che si specifica in modo esplicito in C ++ troppo.
  • Imbottitura -. Le classi gestite hanno PKCS7 come loro imbottitura di default, I pensare il suo valore predefinito per le funzioni CryptoAPI anche, ma non sono sicuro
  • Suppongo che GetPassPhrase, GetIV ecc vi darà egli stessi tasti che si sta utilizzando sul lato C ++?
  • Non è chiaro in che modo viene passato i dati crittografati tra i programmi, è possibile che ci sia un qualche tipo di errore di traduzione? Per esempio. Base64, codificare URL, ecc.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top