Проект 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, и расшифровка работает как чудо!
Что ж,
Перечитав мой пост, чтобы посмотреть, не забыл ли я какую-то часть информации, мне пришло в голову, что если проблема в кодировке, то библиотека iOS может использовать кодирование NSEnc, отличное от того, которое должно быть.
Итак, я открыл код FclBlowfish и увидел, что они используют NSISOLatin1StringEncoding а также NSASCIIStringEncoding Кодирование в методах шифрования и дешифрования, затем я решил попробовать несколько других и выяснил, что с помощью NSWindowsCP1252StringEncoding фактически возвращает правильную кодировку как PHP, и расшифровка работает как чудо!
Надеюсь, это поможет кому-то с такой же проблемой!
IV должен иметь символы ASCII. Так что просто вы можете base64 кодировать его
Для получения дополнительной информации я написал комментарий по вашей проблеме: https://github.com/cantecim/FclBlowfish/issues/1#issuecomment-77517878