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