Frage

Ok Ich versuche, die Win32 Crypto API in C ++ eine Zeichenfolge zu entschlüsseln verschlüsselte in C # (.NET 2) mit der RijndaelManaged Klasse. Aber ich habe kein Glück überhaupt bekomme ich jibberish oder einen schlechten Daten Win32-Fehlercode. Alle meine Schlüssel, IV und Salz Spiel, ich habe für beide Test apps in der Uhr sah. Ich habe alle es sagen suchen verbracht und ich bin officialy stecken.

Auf jeden Fall ist hier die 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();

Die C ++ es zu entschlüsseln ist:

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

Ich rufe CryptAcquireContext erfolgreich und meine C ++ ausgeführt wird gut. Kann jemand den Fehler in meinen Wegen erkennen. Es beginnt mich zu drücken wissen: (

War es hilfreich?

Lösung

Ok mein Fehler, ich habe beinhalte nicht die Struct def für den Schlüssel-Blob in den C ++ und es stellt sich heraus Sie einen contigous Datenblock für den Schlüssel mit dem Kopf brauchen, aber ich wurde mit dem MSDN-Beispiel, das einen Zeiger mußte die Eckdaten. Welches ist falsch!

Andere Tipps

Ich sehe, dass Sie CBC Verkettungsmodus werden mit dem Klartext zu verschlüsseln.

Sind Sie sicher, dass Sie den gleichen Verkettungsmodus werden mit dem Chiffre Text zu entschlüsseln?

(Es tut mir leid. Ich bin nicht in der Lage zu verstehen, dass aus dem Code)

Es gibt eine Handvoll Dinge sollten Sie prüfen, da ein Teil des Codes (Erklärungen usw.) fehlen:

  • Blockgröße - dies sollte in der Regel die gleiche wie Schlüsselgröße sein, ich denke, es auch der Standard sein könnte, da Sie es auf C ++ Seite angeben, nicht. Setzen Sie sich auf 256 auf C # Seite, ich denke, es ist am besten, dass Sie es explizit in C ++ angeben zu.
  • Padding -. Die verwalteten Klassen PKCS7 als Standard-Polsterung haben, I denken seine die Standardeinstellung für Crypto-Funktionen auch, aber ich bin nicht sicher,
  • Ich gehe davon aus, dass GetPassPhrase, GetIV etc geben Sie, dass er gleiche Schlüssel, die Sie auf der Seite C ++ verwendet werden?
  • Es ist nicht klar, wie die verschlüsselten Daten zwischen den Programmen übergeben werden, ist es möglich, dass es eine Art Übersetzungsfehler ist? Z.B. base64, URL kodieren, etc.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top