написание php MCrypt twofish для c # bouncycastle

Я учусь использовать библиотеку BouncyCastle c # cipher для шифрования. Я не собираюсь отправлять сообщения, поэтому я не думаю о безопасности и т. Д.
Я написал свой код C # в Visual Studio.

Здесь проблема. Я зашифровал текстПривет, мир!«, используя Twofish в режиме CFB. Ключ 1234567812345678. Я использовал phpfiddle http://phpfiddle.org/ онлайн инструмент.

$algo = 'twofish';
$mode = 'cfb';

$cipher = mcrypt_module_open($algo,'',$mode,'');

$key = hex2bin('31323334353637383132333435363738'); //1234567812345678
$iv = hex2bin('00000000000000000000000000000000');

mcrypt_generic_init($cipher, $key, $iv);

$plaintext = utf8_encode('Hello World!');
$encrypted = mcrypt_encrypt($algo, $key, $plaintext, $mode, $iv);
printf("<br>Encrypted text: %s<br><br>",base64_encode($encrypted));

$decrypted = mcrypt_decrypt($algo, $key, $encrypted, $mode, $iv);
printf("<br>Decrypted text: %s (%s)<br><br>",$decrypted,bin2hex($decrypted));

mcrypt_generic_deinit($cipher);
mcrypt_module_close($cipher);

Результат выглядит следующим образом

cfdJ + M6MAzG4WJMb (Base64)

Затем я создал версию C # для расшифровки того же текста

// ASCII encoding and Zero padding
encoding = Encoding.ASCII
padding = IBlockCipherPadding.zeroBytePadding

// Set up the engine and cipher types
baseCipher = new TwofishEngine();
blockSize = baseCipher.GetBlockSize();

modeCipher = new CfbBlockCipher(baseCipher, blockSize);
cipher = padding == null ? new PaddedBufferedBlockCipher(modeCipher) : new PaddedBufferedBlockCipher(modeCipher, padding);

// convert the strings to byte array and create a dummy 000000.. iv

byte[] iv = new byte[blockSize];    // i.e. 16 bytes of zero
keyBytes = _encoding.GetBytes(key);   //1234567812345678
inputBytes = Convert.FromBase64String(inp);

// initiate the cipher with iv parameters
cipher.Init(true, new ParametersWithIV(new KeyParameter(keyBytes), iv));

// do the decryption
console.write(_encoding.GetString(cipher.DoFinal(inputBytes)) + "\n";)

Но это дает мне мусор. Я получаю HIl1oVW rEdIp

Закрыть (H.l.o.W.r.d.), но каждое другое письмо неверно!

Режим ECB работает нормально, поэтому он должен быть как-то связан с вектором инициализации.

Есть ли какие-то различия между PHP и c #, которые я еще не изучил?

Где мой код C # неверно в этом случае?

-1

Решение

ХОРОШО. Так что я решил это наконец. Основная ошибка в моем понимании режимов блоков шифрования. CFB и OFB являются потоковыми шифрами, а не блочными буферизированными блоками.

Поэтому настройка шифра должна была быть

modeCipher = new CfbBlockCipher(baseCipher,8);      // Allways 8 bits for a stream cipher !!
cipher = new StreamBlockCipher(modeCipher);

(Файл cipher.doFinal тоже был изменен, но здесь не показан)

Теперь работает нормально.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]