ios — PHP и Objective C шифрование Blowfish

Проект 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, и расшифровка работает как чудо!

1

Решение

Что ж,

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

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

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

2

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

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

0