Pregunta

Ok Estoy tratando de utilizar la API de Win32 Crypto en C ++ para descifrar una cadena cifrada en C # (.NET 2) con la Clase RijndaelManaged. Pero estoy teniendo ninguna suerte en todo lo que consigo jibberish o un código de error de Win32 datos malos. Todas las llaves, IV y combinar la sal, he mirado en el reloj tanto para aplicaciones de prueba. Me he pasado toda la opinión mirarlo y estoy atascado oficialmente.

De todos modos aquí está el 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();

El C ++ para descifrar que es:

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

Voy a llamar a mi CryptAcquireContext con éxito y C ++ está ejecutando bien. ¿Alguien puede detectar el error en mis caminos. Está empezando a deprimir me haga saber: (

¿Fue útil?

Solución

Ok mi culpa, no incluyó la definición Struct para la keyblob en el C ++ y resulta que se necesita un bloque de contigous de los datos de la llave con la cabecera pero yo estaba usando el ejemplo de MSDN que tenía un puntero a los datos clave. ¿Qué está mal!

Otros consejos

veo que está utilizando el modo CBC encadenamiento para cifrar el texto sin formato.

¿Está seguro que está utilizando el mismo modo de encadenamiento para descifrar el texto cifrado?

(Lo siento. No soy capaz de entender que a partir del código)

Hay un puñado de cosas que usted debe comprobar, ya que una parte del código (declaraciones, etc.) están desaparecidos:

  • El tamaño de bloque - esto por lo general debe ser el mismo que el tamaño de la clave, creo que incluso podría ser el valor por defecto, ya que usted no se especifique en el lado C ++. Configurarlo a 256 en C # lado, creo que es mejor que se especifica explícitamente en C ++ también.
  • Relleno -. Las clases administradas tienen PKCS7 como su relleno por defecto, I piensan su defecto para las funciones CryptoAPI también, pero no estoy seguro
  • Asumo que GetPassPhrase, etc GetIV darle él mismas teclas que está utilizando en el lado de C ++?
  • No está claro cómo se pasa los datos cifrados entre los programas, es posible que haya algún tipo de error de traducción? P.ej. base 64, codificación URL, etc.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top