Шифрование и дешифрование RNCryptor AES256 в PHP

Я пытаюсь использовать RNCryptor для шифрования AES256 на стороне iOS и дешифрования AES256 на удаленном сайте в PHP. Но я не могу получить правильные расшифрованные данные с помощью php. Пожалуйста, помогите просмотреть, если я что-то делаю неправильно.

Ниже мой код для iOS.

 NSString *key = @"1234567890123456789012";
 NSData *encryptedData = [RNEncryptor encryptData:data
                                    withSettings:kRNCryptorAES256Settings
                                        password:key
                                           error:&error];

Затем я отправляю зашифрованные данные на сервер, который находится в PHP. Ниже мой PHP-код.

$key ="1234567890123456789012"  //32-bit key
$username = aes256Decrypt ($key, $username);

function aes256Decrypt($key, $data) {
    if(32 !== strlen($key)) $key = hash('SHA256', $key, true);
    $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, 
                str_repeat("\0", 16));
    $padding = ord($data[strlen($data) - 1]);
    $result = substr($data, 0, -$padding);
    return substr($data, 0, -$padding);
}

person jacksun    schedule 30.11.2012    source источник
comment
Итак, ваш PHP-код завершает расшифровку без ошибок, но результат неверный?   -  person Duncan Jones    schedule 30.11.2012
comment
да. php завершен, но результат неверный.   -  person jacksun    schedule 30.11.2012
comment
RNCryptor теперь предоставляет пример PHP-кода для шифрования. Надеюсь, это полезно для создания примера расшифровки. Пулл-реквесты приветствуются. github.com/rnapier/RNCryptor/blob/master/php/encrypt. php   -  person Rob Napier    schedule 29.01.2013
comment
@RobNapier ссылка выше больше не работает.   -  person DevC    schedule 23.05.2014
comment
Реализация PHP была перемещена в собственный репозиторий: github.com/RNCryptor/RNCryptor-php.   -  person Rob Napier    schedule 23.05.2014


Ответы (1)


На основе некоторых быстрых исследований выяснилось, что у RNCryptor есть собственный формат вывода. Пример показан ниже (взято со страницы, на которую я ссылаюсь):

DESCRIPTION: | version/cryptor | options | encryptionSalt | HMACSalt |  IV   | ... ciphertext ... |   HMAC   |
 BYTE INDEX: |        0        |    1    |      2-9       |  10-17   | 18-33 | <-      ...     -> | n-32 - n |

Ваш PHP-код должен будет извлечь данные из этого формата, прежде чем пытаться их расшифровать. Вам понадобится значение IV и зашифрованный текст, чтобы получить исходный открытый текст.

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

person Duncan Jones    schedule 30.11.2012
comment
Звучит правильно. В качестве альтернативы я использовал AES256EncryptWithKey. Он работает так, как я ожидал. Но подход AES256EncryptWithKey имеет серьезную проблему с безопасностью, как указано здесь (stackoverflow.com/questions/9794383/). Я думаю, мне нужно выяснить, как сделать RNCryptor с моим PHP-кодом. - person jacksun; 30.11.2012
comment
ответы Бардука. Подробнее см. здесь. 1. Используйте функции более низкого уровня в iOS для самостоятельного создания ключа шифрования и IV для последующего использования в PHP (но тогда зачем вообще использовать RNCryptor) 2. Извлеките эти части из формата RNCryptor в PHP и вызовите расшифровку PHP функций с соответствующими его частями (обратите внимание, что вам нужно использовать PBKDF2 для воссоздания ключа из прохода + соль). 3. Либо извлекаете его из формата RNCryptor в iOS и отправляете отдельно (но все равно нужно будет создать ключ из pass+sal). - person jacksun; 04.12.2012
comment
Обратите внимание, что для любого правильного использования AES потребуется формат вывода, подобный формату RNCryptor. Не существует хорошего стандарта для кодирования необходимых данных. Наиболее близким является CMS, который представляет собой очень сложный формат данных, который добавил бы много накладных расходов. Каждый создает свой формат. OpenSSL имеет один. у aescrypt есть другой. Ни один из них не кодирует достаточно данных для правильной защиты AES, поэтому мне пришлось создать еще один. Если есть стандартный формат, включающий все необходимые элементы, я был бы заинтересован в переходе на него. - person Rob Napier; 02.01.2013
comment
В итоге вы использовали одно из решений здесь или новое шифрование /расшифровать API? Мне было интересно, как сделать № 2. Извлеките эти части из формата RNCryptor в PHP и вызовите функции расшифровки PHP с соответствующими его частями (обратите внимание, что вам нужно использовать PBKDF2 для воссоздания ключа из прохода + соль). - person GabCas; 12.03.2013