PHP и Objective C Blowfish Encryption Кодировка отличается

Проект iOS и Android, над которым я работаю, требует, чтобы мы открыли веб-просмотр, подключающийся к стороннему веб-сайту. Проблема в том, что URL-адрес, который мы вызываем, должен сопровождаться некоторыми параметрами, зашифрованными с помощью Blowfish с режимом ECB.

Эта третья сторона использует PHP для шифрования/дешифрования параметров, и они предоставили мне код, который они используют для шифрования и дешифрования.

Исходя из этого, в моем проекте iOS я использую библиотеку FclBlowfish (https://github.com/cantecim/FclBlowfish) для шифрования/дешифрования данных.

Проделав все, шифрование/дешифрование работало некорректно, и проблема, которую я только что обнаружил, после почти 5 часов работы над этим, заключалась в том, что в iOS шифрование почти такое же, как в PHP, но поскольку Blowfish генерирует странные символы, некоторые из них не обрабатывались iOS, поэтому расшифровка не работала.

Пример:

В PHP моя зашифрованная строка — p%FE& ¶4!ɢߟén™, но в iOS та же зашифрованная строка — p%FE&¶4!É¢ßén, как вы можете видеть, в iOS отсутствуют Ÿ и , что делает окончательную зашифрованную строку другой , поэтому PHP не может правильно расшифровать.

Код, который я использую на iOS:

FclBlowfish *bf = [[FclBlowfish alloc] init];
bf.Key = @"MyK3yF8n";
bf.IV = @"aaassss";
[bf prepare];

[bf encrypt:@"21988882121" withMode:modeEBC withPadding:paddingZero]

Код шифрования/дешифрования, который использует эта библиотека, можно увидеть по адресу: https://github.com/cantecim/FclBlowfish/blob/master/FclBlowfish.m

и код в PHP:

$initializationVectorSize = mcrypt_get_iv_size(MCRYPT_BLOWFISH, 'ecb');
$initializationVector = mcrypt_create_iv($initializationVectorSize, MCRYPT_RAND);

// Decrypt
$valor = $_GET['v'];
$valor = base64_decode($valor);

$valor = mcrypt_decrypt(MCRYPT_BLOWFISH, 'MyK3yF8n', $valor, 'ecb', $initializationVector);

print 'Valor: ' . $valor;

// Encrypt
$v = mcrypt_encrypt(MCRYPT_BLOWFISH, 'MyK3yF8n', $valor, 'ecb', $initializationVector);

print $v;

Я был бы признателен за любую помощь в попытке выяснить, почему в iOS отсутствуют некоторые символы, что делает строку недешифруемой в PHP.

Спасибо!

ОБНОВЛЕНИЕ

Итак, я открыл код FclBlowfish и увидел, что они используют кодировку NSISOLatin1StringEncoding и NSASCIIStringEncoding в методах шифрования и дешифрования, затем я решил попробовать несколько других и обнаружил, что использование NSWindowsCP1252StringEncoding фактически возвращает правильную кодировку, поскольку кодировка PHP и дешифрование работает как шарм!


person gmogames    schedule 06.03.2015    source источник
comment
1. Использование Blowfish — плохая идея, AES — текущий метод шифрования — если вы действительно заботитесь о безопасности. 2. Сочетание ЭКБ и внутривенного введения не имеет смысла. 3 Убедитесь, что заполнение сделано таким же образом. 4. Использование Common Crypto, поставляемого Apple, вероятно, является лучшим выбором, шифрование находится в стандартной библиотеке, поэтому оно не будет подвержено проблемам с компилятором и является надежным кодом.   -  person zaph    schedule 06.03.2015
comment
@Zaph, поверь мне, когда я говорю, что уничтожу иглобрюха, чтобы он никогда не был создан. Но для стороннего веб-сайта требуется иглобрюх, и мне приходится с ним работать. :(   -  person gmogames    schedule 06.03.2015
comment
См. этот ответ SO для примера реализации Blowfish Common Crypto.   -  person zaph    schedule 09.03.2015


Ответы (2)


Хорошо,

После повторного прочтения моего сообщения, чтобы увидеть, не забыл ли я какую-либо информацию, мне пришло в голову, что если проблема заключается в кодировке, то библиотека iOS может использовать NSEncoding, отличную от той, которая должна быть.

Итак, я открыл код FclBlowfish и увидел, что они используют кодировку NSISOLatin1StringEncoding и NSASCIIStringEncoding в методах шифрования и дешифрования, затем я решил попробовать несколько других и обнаружил, что использование NSWindowsCP1252StringEncoding фактически возвращает правильную кодировку, поскольку кодировка PHP и дешифрование работает как шарм!

Надеюсь, это поможет кому-то с той же проблемой!

person gmogames    schedule 06.03.2015
comment
Лучше добавить это к вопросу. - person zaph; 06.03.2015

IV должен содержать символы ascii. Таким образом, вы можете просто закодировать его в base64. Для получения дополнительной информации я написал комментарий к вашей проблеме: https://github.com/cantecim/FclBlowfish/issues/1#issuecomment-77517878

person Can Tecim    schedule 06.03.2015
comment
Почему есть IV с режимом ecb? - person zaph; 06.03.2015
comment
Не использует iv с режимом ecb, идет проверка сначала любой операции и после этого использует iv только в режиме cbc - person Can Tecim; 09.03.2015