TripleDES en modo CFB, C # y Crypto ++ difieren

Aquí está mi problema: tengo un código heredado en C ++ (usando crypto ++ v5.6.1) y desarrollo uno nuevo en C # (.NET 3.5 usando System.Security.Cryptography). yono puedo cambiar el código C ++, pero necesito poder descifrar datos previamente encriptados y las aplicaciones anteriores deben poder descifrar los datos que cifraré con mi nuevo código C #.

El algoritmo utilizado es TripleDES con modo de cifrado CFB en ambos casos, pero al final, los datos cifrados no son los mismos, el número de bytes es idéntico y el primer byte, pero, aparte de eso, todos los demás bytes son diferentes.

El relleno se realiza manualmente (agregando ceros) en el código C ++. Así que puse el PaddingValue a PaddingMode.Zeros. (También intenté agregar ceros al final manualmente en el código C #, no cambió nada).

Intenté usar diferente System.Text.Encoding pero el resultado es el mismo (de hecho, los caracteres probados son ASCII "puro" (es decir, entre 0 y 126)).

El valor de MandatoryBlockSize (), en el código de C ++, es 8, así que también establezco FeedbackSize en 8. Pero si lo entiendo, escribo, de hecho es del tamaño de mi IV, ¿no es así?

El tamaño de la clave es de 24 bytes (3 claves diferentes) y el IV tiene una longitud de 8 bytes. Ambos son los mismos en los 2 códigos.

Si utilizo el modo CBC en ambos casos, los resultados son los mismos (pero, como dije, no puedo cambiar el código heredado ...), el modo OFB y CTS lanza excepciones (no disponible para uno e incompatible para el otro) en mi aplicación .NET, así que no puedo comparar resultados.

Intenté usar Mono, con versiones .Net 3.5 y 4.0, o usar visual, con .Net 3.5 o 4.0, y los 4 resultados encriptados son los mismos pero difieren del resultado original.

Ahora realmente no sé qué probar ... Preferiría no envolver Crypto ++ en un proyecto C ++ / CLI para usarlo en lugar de System.Security.Cryptography.

¿Alguien tiene un consejo o puede decir qué estoy haciendo mal?

Aquí está el código de C ++:

void *CryptData(BYTE *bDataIn, LONG lIn, LONG *lOut, byte* key, byte* iv)
{
    byte    *bIn;
    byte    *bOut;
    LONG    l2,lb;

    CFB_FIPS_Mode<DES_EDE3>::Encryption encryption_DES_EDE3_CFB;
    encryption_DES_EDE3_CFB.SetKeyWithIV(key, sizeof(key), iv, sizeof(iv));

    lb = encryption_DES_EDE3_CFB.MandatoryBlockSize();
    l2 = ((lIn + lb - 1)/lb)*lb;

    bIn = (byte*)malloc(l2);
    bOut = (byte*)malloc(l2);

    memset(bIn,0,l2);
    memset(bOut,0,l2);
    memcpy(bIn,bDataIn,lIn);

    encryption_DES_EDE3_CFB.ProcessString(bOut, bIn, l2);

    *lOut = l2;

    return bOut;
}

Aquí está el código C #:

public FibxCrypt()
{
    _cryptoAlgo = new TripleDESCryptoServiceProvider();
    //_cryptoAlgo.GenerateKey();
    _cryptoAlgo.Key = _key;
    //_cryptoAlgo.GenerateIV();
    _cryptoAlgo.IV = _iv;
    _cryptoAlgo.Mode = CipherMode.CFB;
    _cryptoAlgo.Padding = PaddingMode.Zeros;

    _encoding = new UTF8Encoding();
}

private MemoryStream EncryptingString(string plainText, out long encryptSize)
{
    // Check arguments. 
    if (plainText == null || plainText.Length <= 0)
        throw new ArgumentNullException("plainText");

    // Create a decrytor to perform the stream transform.
    ICryptoTransform encryptor = _cryptoAlgo.CreateEncryptor();

    // Create the streams used for encryption. 
    //using (MemoryStream msEncrypt = new MemoryStream())
    MemoryStream msEncrypt = new MemoryStream();

    encryptSize = ((plainText.Length + _cryptoAlgo.FeedbackSize - 1) / _cryptoAlgo.FeedbackSize) * _cryptoAlgo.FeedbackSize;

    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
    {
        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt, _encoding))
        {
            //Write all data to the stream.
            swEncrypt.Write(plainText);
        }
    }

    // Return the encrypted memory stream. 
    return msEncrypt;
}

EDITAR: Traté de usar el Encryptor directamente, en lugar de usar las secuencias y tengo el mismo problema.

private MemoryStream EncryptingString(string plainText, out long encryptSize)
{
    // Check arguments. 
    if (plainText == null || plainText.Length <= 0)
        throw new ArgumentNullException("plainText");

    ICryptoTransform encryptor = _cryptoAlgo.CreateEncryptor();

    byte[] cipherData = encryptor.TransformFinalBlock(
        _encoding.GetBytes(plainText), 0, plainText.Length);

    // Return the encrypted memory stream. 
    return msEncrypt;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta