Вопрос

Я не знаю много о шифровании, но я смог получить AES, работающую в PHP ... несколько. Вот пара пары, которые я использую:

function aes_decrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode = MCRYPT_MODE_ECB; 
    $enc = MCRYPT_RIJNDAEL_128; 
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_RAND) ); 
    return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null)); 
} 

function aes_encrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode=MCRYPT_MODE_ECB; 
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16))); 
    return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_RAND)); 
} 

Они немного изменены из Комментарий к странице документации PHP для Mcrypt. Отказ (Я изменился от Dev_urandom в Rand, так как я нахожусь в коробке Windows, где dev_urandom недоступен.)

В любом случае, ключ, используемый в этой функциях, определен так:

define("PSK", pack("H*", "abcd7b5ca46e12345678a8161fdacee9"));

Я называю мою функцию, как это:

echo bin2hex(aes_encrypt("wootwootwootwootwootwootwoo", PSK));

Теперь первые 16 байтов (32 цифры) полученной шестигранной строки в порядке. Следующие 16 байтов не совпадают, что ожидается.

Видите, я размещаю эти данные на внешний веб-сайт, который затем расшифрует его. Я (к сожалению) не могу дать одно тестовое дело, которое я не передал мой ключ шифрования и данные. Я ужасно извините за это, но я надеюсь, что кто-то знаком с Mcrypt может посмотреть на это и сказать мне, что я делаю не так.

Опять же, извините за отсутствие твердого теста, но я очень благодарю любую помощь, которую вы можете дать!

РЕДАКТИРОВАТЬ: Кажется, мой провайдер, который я размещаю, это использует NULL IV. После совета ROOK я переключился на режим CBC и удалил ненужный код, связанный с ключом. Вот мои новые функции:

function aes_decrypt($val,$key)
{
    $mode = MCRYPT_MODE_CBC;
    $enc = MCRYPT_RIJNDAEL_128; 
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, null); 
    return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null)); 
}

function aes_encrypt($val,$key) 
{
    $mode = MCRYPT_MODE_CBC;
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16))); 
    return mcrypt_encrypt($enc, $key, $val, $mode, null); 
}
Это было полезно?

Решение

Вполне вероятно, что эта служба шифрования использует другой режим работы блочного шифра, такого как CBC. Если нуль IV используется с режимом CBC, то первый блок (в этом случае 16 байт) ECB и CBC будут создавать один и тот же текст шифрования. Режим ECB никогда не должен использоваться никому по какой-либо причине.

Вот пример в режиме ECB зашифрованное сообщение:

alt text

Другие советы

Я и мой колледж, где кодирование приложения для iPhone и где используя вышеуказанные методы для шифрования и расшифровки данных. Но мы нашли проблему, когда я заширил данные, которые будут читать с его iPhone. IPhone использовал прокладку PKCS7. Приведенный выше код добавлял дополнительную прокладку, это приведет к тому, что метод дешифрования iPhone будет выполнен. Мы исправили код, чтобы исправить текущую проблему:

public static function  aes128Encrypt($key,$val) 
{
    $mode = MCRYPT_MODE_CBC;
    $enc=MCRYPT_RIJNDAEL_128; 
    $blocksize= mcrypt_get_block_size($enc,$mode);
    $stringLength = strlen($val);
    $paddingLength =$blocksize-($stringLength%$blocksize);
    $val=str_pad($val,$paddingLength+$stringLength,chr($paddingLength));
    return base64_encode(mcrypt_encrypt($enc, $key, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")); 
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top