Intereting Posts
sql-запрос с двумя объединениями и простая логика Два атрибута, разделяющих одно отношение OneToMany с одним объектом Symfony2 Запись в массив javascript в php-контуре Сортировка массива по дате в порядке убывания по дате в php Преобразование String на сегодняшний день (от европейского до американского) PHP – несколько разных баз данных. Как использовать услугу переводчика внутри Entity? Laravel – данные POST равны нулю при использовании внешнего запроса ZF2 Сгенерировать навигацию с помощью zfcrbac zfcUser и иерархической стратегии роли Чтение JSON из удаленного URL в PHP остановить прямой доступ (.htaccess) и разрешить запрос ajax в подпапку password_verify всегда неверный пароль, хотя пароль правильный Каковы наилучшие методы передачи нескольких переменных функции с помощью PHP Как вы печатаете необработанные символы UTF-8 из их номеров? регулярное выражение php для соответствия определенному шаблону url

RC4-шифрование – CommonCrypto (Objective-C) vs PHP

У меня есть XML-файл на сервере, зашифрованном с помощью RC4-алгоритма ( http://rc4crypt.devhome.org )

function encrypt ($pwd, $data, $ispwdHex = 0) { if ($ispwdHex) $pwd = @pack('H*', $pwd); // valid input, please! $key[] = ''; $box[] = ''; $cipher = ''; $pwd_length = strlen($pwd); $data_length = strlen($data); for ($i = 0; $i < 256; $i++) { $key[$i] = ord($pwd[$i % $pwd_length]); $box[$i] = $i; } for ($j = $i = 0; $i < 256; $i++) { $j = ($j + $box[$i] + $key[$i]) % 256; $tmp = $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp; } for ($a = $j = $i = 0; $i < $data_length; $i++) { $a = ($a + 1) % 256; $j = ($j + $box[$a]) % 256; $tmp = $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp; $k = $box[(($box[$a] + $box[$j]) % 256)]; $cipher .= chr(ord($data[$i]) ^ $k); } return $cipher; } 

Вот код цели-C, который я использую для дешифрования:

  NSData *dataToDecrypt = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.url.com/fileCrypted.xml"]] returningResponse:nil error:nil]; const void *vplainText; size_t plainTextBufferSize; plainTextBufferSize = [dataToDecrypt length]; vplainText = [dataToDecrypt bytes]; CCCryptorStatus ccStatus; uint8_t *bufferPtr = NULL; size_t bufferPtrSize = 0; size_t movedBytes = 0; bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t)); memset((void *)bufferPtr, 0x0, bufferPtrSize); NSString *key = @"mykey"; //NSString *initVec = @"init Vec"; const void *vkey = (const void *) [key UTF8String]; const void *vinitVec = (const void *) [initVec UTF8String]; size_t keyLength = [[key dataUsingEncoding:NSUTF8StringEncoding] length]; ccStatus = CCCrypt(kCCDecrypt, kCCAlgorithmRC4, 0, vkey, kCCKeySizeDES, nil, vplainText, plainTextBufferSize, (void *)bufferPtr, bufferPtrSize, &movedBytes); if (ccStatus == kCCSuccess) NSLog(@"SUCCESS"); /*else*/ if (ccStatus == kCCParamError) return @"PARAM ERROR"; else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL"; else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE"; else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT"; else if (ccStatus == kCCDecodeError) return @"DECODE ERROR"; else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED"; NSString *result = [[ NSString alloc ] initWithData: [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes] encoding:NSASCIIEncoding]; 

Выход журналов: SUCCESS, но мой результат не очень хорош (я тестировал много кодировок, но ASCII кажется хорошим, ср. PHP function ord …)

Являются ли мои оба стандарта RC4?

Изменить: удалить IV в Objective-C code Edit2: Objective-C KeyLength = длина данных пароля, удаленная опция

Если вы не знаете, что делаете в криптографии, то «сворачивание собственного» – это верный рецепт огня для катастрофы. Вам не нужно верить мне, читайте Джона Виги о Культа Шнайера об общих программистах, которые пытаются «свернуть свою собственную» криптографию. Перефразируем: не делайте этого.

Поскольку это файл, и я предполагаю разумный небольшой файл, вы можете использовать более стандартные и более высокоуровневые библиотеки, используя такие стандарты, как SSL (OpenSSL и другие) или OpenPGP (GPG и т. Д.) Для выполнения необходимого шифрования / дешифрования , Я считаю, что поддержка протокола SSL или модуля поддерживается как в Objective-C (или в среде iPhone), так и в PHP.

В частности, о RC4, это шифр потока, который обманчиво прост в написании, но невероятность легко испортить в деталях реализации. См. «Неправильное использование RC4 в Microsoft Word и Excel». Можете ли вы порекомендовать 128-битное шифрованное программное обеспечение RC4? для известного исторического примера и рекомендации эксперта по безопасности / криптографии (бывший технический директор и соучредитель PGP Corp.).


Добавлено:

Ключ в скрипте php основан на необработанной длине данных пароля. Он также не использует PKCS7 Padding, поэтому я считаю, что поле должно быть нулевым (0) (CCryptor не поддерживает заполнение потоковых шифров, и версия php, конечно же, не использует его). В вашем коде CCCrypt использовал ключи размером 8 байтов (64 * бит), тогда как я считаю, что вы хотите, чтобы это была длина (в байтах) пароля (двоичные данные).

Отсутствует MAC или хэш данных, поэтому функции не смогут определить допустимые из-за неправильных декодирования.

Я думаю, что это приблизит вас к совместимости с этой небезопасной реализацией RC4 (RC4crypt в PHP).

    • DES использует 56-битный ключ из 64-битного ключа inpu t.

Основываясь на @mctylr, избегайте катиться самостоятельно, когда это возможно. Если вам нужен RC4, используйте предварительно встроенную / протестированную библиотеку: OpenSSL RC4 . Вы можете заменить весь код примерно на 3 строки.