Расшифруйте файл в C ++ с помощью Microsoft Crypt API, который был зашифрован с помощью TripleDES в C # - PullRequest
3 голосов
/ 28 января 2010


Я пытаюсь расшифровать файл в неуправляемом C ++, который ранее был зашифрован с помощью C # TripleDESCryptoServiceProvider. К сожалению, я не знаю, как это сделать с помощью Microsoft Crypt API (advapi32.lib). Вот код C #, который я использую для шифрования данных:

private static void EncryptData(MemoryStream streamToEncrypt)
    {
        // initialize the encryption algorithm
        TripleDES algorithm = new TripleDESCryptoServiceProvider();

        byte[] desIV = new byte[8];
        byte[] desKey = new byte[16];

        for (int i = 0; i < 8; ++i)
        {
            desIV[i] = (byte)i;
        }

        for (int j = 0; j < 16; ++j)
        {
            desKey[j] = (byte)j;
        }

        FileStream outputStream = new FileStream(TheCryptedSettingsFilePath, FileMode.OpenOrCreate, FileAccess.Write);
        outputStream.SetLength(0);

        CryptoStream encStream = new CryptoStream(outputStream, algorithm.CreateEncryptor(desKey, desIV),
            CryptoStreamMode.Write);

        // write the encrypted data to the file
        encStream.Write(streamToEncrypt.ToArray(), 0, (int)streamToEncrypt.Length);

        encStream.Close();
        outputStream.Close();
    }

Как видите, Ключ и IV довольно просты (только для целей тестирования). Итак, мой вопрос, как мне расшифровать этот файл в C ++? Я знаю, что TripleDESCryptoServiceProvider - это просто оболочка для Crypt API, поэтому решить эту проблему не так сложно.
Кто-нибудь когда-нибудь делал что-то подобное и может мне помочь?
Thx Simon

Ответы [ 3 ]

2 голосов
/ 04 февраля 2010

Как только вы попали в рутину вещей, CryptoAPI относительно прост в использовании. Проблема заключается в том, чтобы сделать это способом, совместимым с другими библиотеками криптографии (включая .NET Framework). Я успешно сделал это раньше, но это было какое-то время; Основным камнем преткновения является выяснение того, как преобразовать простой текстовый ключ в формат, используемый с CryptoAPI (который работает с «ключевыми объектами»). К счастью, Microsoft предоставила нам рабочий, хотя и утомительный пример . Что касается способа работы с CryptoAPI, вот пример:

// 1. acquire a provider context.
// the Microsoft Enhanced provider offers the Triple DES algorithm.
HCRYPTPROV hProv = NULL;
if(CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
{
    // 2. generate the key; see Microsoft KB link above on how to do this.
    HKEY hKey = NULL;
    if(ImportPlainTextSessionKey(hProv, lpKeyData, cbKeyData, CALG_3DES, &hKey))
    {
        // 3. set the IV.
        if(CryptSetKeyParam(hKey, KP_IV, lpIVData, 0))
        {
            // 4. read the encrypted data from the source file.
            DWORD cbRead = 0;
            while(ReadFile(hSourceFile, buffer, 8192, &cbRead, NULL) && cbRead)
            {
                // 5. decrypt the data (in-place).
                BOOL bFinal = cbRead < 8192 ? TRUE : FALSE;
                DWORD cbDecrypted = 0;
                if(CryptDecrypt(hKey, NULL, bFinal, 0, buffer, &cbDecrypted))
                {
                    // 6. write the decrypted data to the destination file.
                    DWORD cbWritten = 0;
                    WriteFile(hDestFile, buffer, cbDecrypted, &cbWritten, NULL);
                }
            }
        }
        CryptDestroyKey(hKey);
        hKey = NULL;
    }
    CryptReleaseContext(hProv, 0);
    hProv = NULL;
}
2 голосов
/ 30 января 2010

К сожалению, неуправляемый CAPI (advapi32.lib) требует больше кода, чем то, что можно сделать с пространством имен System.Security.Cryptography. В MSDN есть пример CAPI под названием « Расшифровка файла », который показывает все шаги и вызовы, необходимые для достижения того, что вы пытаетесь сделать в своем тестовом приложении. Это может быть хорошей отправной точкой для вас. Приносим извинения за то, что не публикуем пригодный для использования код, но когда вы посмотрите на пример кода, вы поймете, почему.

0 голосов
/ 30 января 2010

Если вы не можете использовать среды выполнения .net в C ++, быстрый поиск в Google обнаружил эту криптографическую библиотеку для C ++, на мой взгляд, она не зависит от платформы, поэтому вы можете запустить ее без необходимости вызывать advapi32. Lib

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...