Pergunta

Ok eu estou tentando usar a API Win32 Crypto em C ++ para descriptografar uma string encriptada em C # (.NET 2) com a classe RijndaelManaged. Mas eu estou tendo nenhuma sorte em tudo eu recebo jibberish ou um código de erro Win32 dados errados. Todas as minhas chaves, IV e jogo de sal, eu olhei no relógio para ambos os aplicativos de teste. Eu passei todo digamos olhando para ele e eu sou oficialmente preso.

De qualquer forma aqui é o 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();

A C ++ para decifrá-lo é:

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

Eu estou chamando CryptAcquireContext com sucesso e meu C ++ está executando bem. Qualquer pessoa pode manchar o erro nos meus caminhos. Está começando a me deprimir saber: (

Foi útil?

Solução

Ok minha culpa, eu não incluem a estrutura def para o keyblob no C ++ e verifica-se que você precisa de um bloco contigous de dados para a chave com o cabeçalho mas eu estava usando o exemplo MSDN que tinha um ponteiro para os dados da chave. Que é errado!

Outras dicas

Eu vejo que você está usando o modo de encadeamento CBC para criptografar o texto simples.

Tem certeza de que estão usando o mesmo modo de encadeamento para descriptografar o texto cifra?

(eu sinto muito. Eu não sou capaz de entender que a partir do código)

Há um punhado de coisas que você deve verificar, uma vez que parte do código (declarações etc) estão faltando:

  • Bloco de tamanho - isso geralmente deve ser o mesmo que o tamanho da chave, acho que pode até ser o padrão desde que você não especificá-lo no lado C ++. Configurá-lo para 256 no lado C #, eu acho que é melhor que você especificá-lo explicitamente em C ++ também.
  • Padding - as classes gerenciadas têm PKCS7 como seu preenchimento padrão, I pensar seu padrão para funções CryptoAPI também, mas eu não tenho certeza
  • .
  • Presumo que GetPassPhrase, GetIV etc dar-lhe ele mesmas teclas que você está usando no C ++ lado?
  • Não está claro como os dados criptografados é passado entre os programas, é possível que haja algum tipo de erro de tradução? Por exemplo. base64, URL codificar, etc.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top