Случайно сгенерированный PHP IV не работает идеально в IOS

1

Проблема в том, что базовая 64-кодированная iv (в PHP) не соответствует при декодировании в IOS

Сценарий - я использую режим CBC Blowfish Algorithm. Просто сервер (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èñ [¼, но фактический результат должен быть h <Ézèñ [¼

я пытался

  NSWindowsCP1252StringEncoding , NSISOLatin1StringEncoding ,      NSUTF8StringEncoding 

Но все они не могут создать точный результат (приблизительно 10 тестов, которые я нашел).

Заранее спасибо !

  • 1
    Не используйте MCRYPT_RAND - в этом нет ничего случайного, и он не является криптографически безопасным. MCRYPT_DEV_URANDOM этого используйте MCRYPT_DEV_URANDOM .
  • 0
    Вы пробовали NSUTF32StringEncoding ?
Показать ещё 4 комментария
Теги:
cryptography
blowfish

1 ответ

1
Лучший ответ

Вы должны распечатать результат в шестнадцатеричном формате, а затем выполнить сравнение.

Кажется, что кодировка на обеих платформах одинакова (что-то, что вы не должны воспринимать как должное), чтобы вы возвращали те же символы. Тем не менее, он не уверен, что используемая вами версия шрифта или шрифта показывает символы. Также может быть, что на одной платформе отображается символ character для неизвестных последовательностей кодирования, а другой ничего не показывает.

Это приводит нас к основной проблеме: если вы декодируете случайные байтовые значения, вы можете столкнуться с байтовыми последовательностями, которые не переводятся на символ. Поэтому сравнение двоичных строк путем преобразования их в печатную строку не является хорошим. Вместо этого вам нужно напрямую сравнивать байты (например, сохраняя файлы IV в iv.bin) или переведя их в шестнадцатеричные.

Весьма вероятно, что IV идентичны, несмотря на то, что распечатка отличается.

  • 0
    Да, это работает! Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню