سؤال

حسنًا، أحاول استخدام Win32 Crypto API في C++ لفك تشفير سلسلة مشفرة في C# (.NET 2) مع فئة RijndaelManaged.لكن لم يحالفني الحظ على الإطلاق، فقد حصلت على رمز خطأ Win32 أو بيانات سيئة.جميع مفاتيحي، IV و Salt متطابقة، لقد بحثت في الساعة عن كلا التطبيقين الاختباريين.لقد قضيت كل ما أقوله في النظر إليه وأنا عالق رسميًا.

على أي حال هنا هو 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();

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

لقد قمت بالاتصال بـ CryptAcquireContext بنجاح ويتم تنفيذ برنامج C++ الخاص بي بشكل جيد.يمكن لأي شخص اكتشاف الخطأ في طرقي.بدأت تضايقني أعرف :(

هل كانت مفيدة؟

المحلول

وطيب خطأي، وأنا لم تشمل مواطنه البنية لkeyblob في C ++ واتضح كنت في حاجة الى كتلة contigous البيانات للحصول على مفتاح مع رأس ولكن كنت تستخدم المثال MSDN أن كان مؤشر إلى البيانات الرئيسية. وهو غير صحيح!

نصائح أخرى

وأرى أنك تستخدم وضع CBC تسلسل لتشفير نص عادي.

هل أنت متأكد من أنك تستخدم نفس وضع تسلسل للفك تشفير النص سايفر؟

و(أنا آسف، أنا لست قادرا على فهم أن من التعليمات البرمجية)

هناك عدد قليل من الأشياء التي يجب عليك التحقق منها، نظرًا لأن بعض التعليمات البرمجية (التصريحات وما إلى ذلك) مفقودة:

  • حجم الكتلة - يجب أن يكون هذا عادةً هو نفس حجم المفتاح، وأعتقد أنه قد يكون هو الحجم الافتراضي نظرًا لأنك لم تحدده على جانب C++.اضبطه على 256 على جانب C#، وأعتقد أنه من الأفضل أن تحدده بشكل صريح في C++ أيضًا.
  • الحشو - تحتوي الفئات المُدارة على PKCS7 كحشوة افتراضية، I يفكر إنه الإعداد الافتراضي لوظائف cryptoAPI أيضًا، لكنني لست متأكدًا.
  • أفترض أن GetPassPhrase وGetIV وما إلى ذلك يمنحك نفس المفاتيح التي تستخدمها على جانب C++؟
  • ليس من الواضح كيف يتم تمرير البيانات المشفرة بين البرامج، هل من الممكن أن يكون هناك خطأ ما في الترجمة؟على سبيل المثالbase64، ترميز URL، وما إلى ذلك.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top