TripleDES в режиме CFB, C # и Crypto ++ отличается

Вот моя проблема: яУ меня есть устаревший код на C ++ (с использованием crypto ++ v5.6.1), и я разрабатываю новый код на C # (.NET 3.5 с использованием System.Security.Cryptography). яМожно'т изменить код C ++, но мне нужно иметь возможность расшифровывать ранее зашифрованные данные, а предыдущие приложения должны иметь возможность дешифровать данные, которые я буду шифровать с помощью моего нового кода C #.

Используемый алгоритм - TripleDES с режимом шифрования CFB в обоих случаях, но, в конце концов, зашифрованные данные не совпадают, количество байтов одинаково, как и первого байта, но кроме этого все другие байты различны.

Заполнение выполняется вручную (с добавлением нулей) в коде C ++. Поэтому я установил PaddingValue в PaddingMode.Zeros. (Я также попытался добавить нули в конце вручную в коде C #, это неничего не меняю).

Я пытался использовать разные System.Text.Encoding, но результат тот же (на самом деле проверенные символы "чистый» ASCII (т.е. между 0 и 126)).

Значение MandatoryBlockSize () в коде C ++ равно 8, поэтому я также установил в FeedbackSize значение 8. Но если я понимаю, напишите, это на самом деле размер моего IV, не так лине так ли?

Размер ключа составляет 24 байта (3 разных ключа), а длина IV составляет 8 байтов. Они оба одинаковы в двух кодах.

Если вместо этого в обоих случаях я использую режим CBC, результаты будут одинаковыми (но, как я уже сказал, я могуизменить старый код ...), OFB & Режим CTS генерирует исключения (недоступно для одного и несовместимо для другого) в моем приложении .NET, поэтому я могут сравнить результаты.

Я пытался использовать Mono, с .Net версии 3.5 и 4.0, или с использованием visual, с .Net 3.5 или 4.0, и 4 зашифрованных результата совпадают, но они отличаются от исходного результата.

Теперь я действительно нене знаю, что проверить ... яЯ бы не стал использовать Crypto ++ в проекте C ++ / CLI, чтобы использовать его вместо System.Security.Cryptography.

У кого-нибудь есть совет или можете подсказать, что я делаю не так?

Вот код C ++:

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

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

Вот код 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 

Ответы на вопрос(2)

Ваш ответ на вопрос