Проблема в том, что кодировка base 64, кодированная iv (в PHP), не совпадает при декодировании в IOS
Сценарий: я использую режим CBC алгоритма Blowfish. Просто сервер (PHP) генерирует случайную криптографическую IV
и закодированный формат base64, отправьте в IOS.
Проблема здесь, когда я пытаюсь декодировать, результаты декодирования не всегда корректны. Иногда он генерирует правильную и остальную часть времени ошибку.
Вот мой код PHP.
public function ivGenerator()
{
$ivSize = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
echo base64_encode($iv);
}
Вот два результирующих набора ivGenerator, которые я буду использовать позже для декодирования
bTpkpLxMbNo=
aIvJeujxW7w=
Вот мой код IOS.
NSString *ecodedIVString = @"bTpkpLxMbNo=";
NSData *ecodedIVData= [[NSData alloc] initWithBase64EncodedString:ecodedIVString options:0];
NSString *decodeIVString = [[NSString alloc] initWithData:ecodedIVData encoding:NSASCIIStringEncoding];
NSLog(@"decodeIVString %@" , decodeIVString); // m:d¤¼LlÚ //its correct
Если я использую,
NSString *ecodedIVString = @"aIvJeujxW7w=";
Тогда результат hÉzèñ [¼ , но фактический результат должен быть ч <Ézèñ [¼
я пытался
NSWindowsCP1252StringEncoding , NSISOLatin1StringEncoding , NSUTF8StringEncoding
Но все они не могут дать точный результат (примерно 10 тестов я нашел).
Заранее спасибо !
Вы должны распечатать результат в шестнадцатеричном формате, а затем выполнить сравнение.
Кажется, что кодировка на обеих платформах одинакова (то, что вы не должны воспринимать как должное), поэтому вы получаете те же символы обратно. Тем не менее, не уверен, что шрифт или же версия шрифта вы используете показывает символы. Также может быть, что одна платформа показывает ‹
символ для неизвестных кодирующих последовательностей, а другой вообще ничего не показывает.
Это подводит нас к основной проблеме: если вы декодируете случайные байтовые значения, вы можете столкнуться с байтовыми последовательностями, которые не переводятся в символ. Поэтому сравнение двоичных строк путем преобразования их в печатаемую строку не годится. Вместо этого вам нужно напрямую сравнить байты (например, сохраняя IV в iv.bin
файлы) или переводя их в шестнадцатеричные числа.
Весьма вероятно, что IV идентичны, несмотря на то, что распечатка отличается.
Других решений пока нет …