У меня есть проблема с HTTP POST- запросами на шифрование и дешифрование.
У меня есть приложение OS X, написанное в Objective-C, которое отправляет зашифрованный (CocoaSecurity) HTTP-запрос POST на сервер:
- (NSString *)secure
{
NSData* key = [@"9eab87dc72b927c9" dataUsingEncoding:NSASCIIStringEncoding];
NSData* iv = [@"d6f8f85911c4d8d1" dataUsingEncoding:NSASCIIStringEncoding];
CocoaSecurityResult *result = [CocoaSecurity aesEncrypt:@"a" key:key iv:iv];
return result.hexLower;
}
и я получаю шифрование
5219abd6c1439dc832ab512dae8cce80
Также у меня есть WEB-приложение, написанное на PHP, которое расшифровывает отправленный запрос
protected function processEncrypt()
{
if ($this->input) {
$crypt = mcrypt_module_open($this->algorithm, '', $this->mode, $this->encryptIv);
mcrypt_generic_init($crypt, $this->encryptKey, $this->encryptIv);
$this->input = mcrypt_generic($crypt, $this->input);
mcrypt_generic_deinit($crypt);
mcrypt_module_close($crypt);
if ($this->template == 'hex') {
$this->input = bin2hex($this->input);
} elseif ($this->template == 'base64') {
$this->input = base64_encode($this->input);
}
}
}
Зашифрованное сообщение в конце обработки запроса полностью отличается от дешифрованного.
Я получаю шифрование
10967675e5cf70878ee063a73f2a8394
До сих пор я выяснил, что это может быть проблема с добавлением PKCS#7
(библиотека PHP mcrypt имеет нулевое заполнение). Я попытался удалить дополнение, изменив CocoaSecurity.m
код CocoaSecurity.m
и заменив значение kCCOptionPKCS7Padding
равным 0
. После этой замены CocoaSecurity
вызывает исключение Encrypt Error!
вызвано kCCAlignmentError
...
Может ли кто-нибудь сказать мне, где проблема?
Обратите внимание, что CocoaSecurity использует стандартное дополнение PKCS # 7 (kCCOptionPKCS7Padding
), но mcrypt использует нестандартное/небезопасное заполнение нулей. Вам нужно будет удалить дополнение PKCS # 7 в вашем php-коде. Вы можете использовать этот код:
Добавить PKCS # 7 padding (php):
$pad = $block - (strlen($str) % $block);
$str .= str_repeat(chr($pad), $pad);
Удалите PKCS # 7 padding (php):
$len = strlen($str);
$pad = ord($str[$len-1]);
$str = $strsubstr($str, 0, $len - $pad);
См. Этот ответ SO для получения более подробной информации.
NSString+Security.h
.