Я использую aes256 с php для шифрования данных.
В разных документах я вижу разные способы генерации ключа, например:
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
Или же
$Key = "what ever, plain string";
Или же
$Key = "123456789abcdef";//128bit
В чем смысл первого примера, в отличие от других?
Почему бы просто не использовать случайную строку длиной 128 или 256?
Я использую пример здесь http://php.net/manual/en/function.mcrypt-encrypt.php с каждым из различных методов генерации ключей выше.
У вас есть три разных длины ключа. AES указывается для следующих трех длин ключа: 128-бит (16 байт), 192-бит (24 байт) и 256-бит (32 байт). Я не буду вдаваться в подробности о силе ключей разных размеров.
Давайте разберем их:
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
Это шестнадцатеричное кодирование, длина которого составляет 64 символа. Длина самого ключа составляет 32 байта, что означает, что когда ключ передается mcrypt_encrypt()
AES-256 используется автоматически.
$Key = "what ever, plain string";
Это строка из 23 символов, которую можно использовать в качестве ключа для версий PHP до 5.6.0. Это недопустимая длина для ключа в AES. MCrypt дополнит ключ \0
до следующего допустимого размера ключа, который составляет 24 байта для AES-192. Так что этот ключ на самом деле является действительным ключом для PHP 5.6 в этой форме:
$Key = "what ever, plain string\0";
$Key = "123456789abcdef"; //128bit
Это 15-значный ключ. Как и в предыдущем примере, он будет дополнен до 16 байтов, так что используется AES-128.
Поскольку вы спрашиваете о генерации ключей, этот вопрос содержит несколько подходов. Ключи должны быть случайными и состоять из всех возможных байтов. Использование ключей, состоящих только из букв или цифр или содержащих только печатные символы, нецелесообразно, если вы хотите быть в безопасности от атак методом подбора.
Поскольку невозможно напрямую жестко закодировать произвольные байты в качестве ключа в файле кода, вам следует использовать первый подход, заключающийся в жестком кодировании закодированной версии ключа и программном декодировании.
Существует только несколько сценариев, в которых жесткое кодирование симметричного ключа в коде может быть использовано:
Если ваш сценарий не соответствует вышеприведенному, вы либо довольны запутыванием, либо вам следует подумать о том, как использовать шифрование с открытым ключом с помощью гибридного подхода.
Других решений пока нет …