Проект 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 и дешифрование работает как шарм!