PHP генерирует симметричный ключ с AES, блоком режима ECB и PKCS5Padding

Мне нужно сгенерировать ключи симметрии со стандартным AES в блоке режима ECB и с PKCS5Padding, но я не могу этого сделать.

Во время моих поисков я нашел только функции для шифрования чего-либо с этими условиями выше. Но я не хочу этого; Я хочу сгенерировать симметричный ключ.

Мне нужно, чтобы я мог общаться с веб-службой, и мне это нужно, потому что это одна часть шифрования.

Я просмотрел phpseclib, но библиотека также не генерирует симметричные ключи.


person Ricardo Martins    schedule 28.12.2012    source источник
comment
да, это обязательное условие веб-сервера   -  person Ricardo Martins    schedule 28.12.2012


Ответы (3)


Во-первых, чтобы выполнить заполнение PKCS#5 на входе, вам нужно импровизировать:

// source: http://php.net/manual/en/ref.mcrypt.php#69782
function pkcs5_pad($text, $blocksize) 
{
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
}

Затем выберите свой алгоритм и сгенерируйте IV:

$alg = MCRYPT_RIJNDAEL_128; // AES
$mode = MCRYPT_MODE_ECB; // not recommended unless used with OTP

$iv_size = mcrypt_get_iv_size($alg, $mode);
$block_size = mcrypt_get_block_size($alg, $mode);
$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM); // pull from /dev/urandom

Инициализируйте ключ шифрования:

$key = "This is a very secret key";

Применить дополнение к входу и зашифровать его

$input = pkcs5_pad($input, $block_size);

$crypttext = mcrypt_encrypt($alg, $key, $input, $mode, $iv);
person Ja͢ck    schedule 28.12.2012
comment
Джек, я уже использовал это, проблема в том, что я должен генерировать другой симметричный ключ в каждом запросе к веб-службе, поэтому ключ для шифрования (это очень секретный ключ) может быть строкой, составленной с системной датой и именем пользователя , Например? - person Ricardo Martins; 28.12.2012
comment
@RicardoMartins Ну, может, но обычно секретный ключ известен обеим сторонам ... поэтому, если у вас есть специальный алгоритм, обеспечивающий совпадение обеих системных дат, то да, вы можете это сделать. - person Ja͢ck; 28.12.2012

В php я использовал это для создания симметричного ключа.

<?php
srand((double)microtime()*1000000 );
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CFB, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$ks = mcrypt_enc_get_key_size($td);
$key = substr(sha1('Your Secret Key Here'), 0, $ks);

mcrypt_generic_init($td, $key, $iv);
$ciphertext = mcrypt_generic($td, 'This is very important data');
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

print $iv . "\n";
print trim($ciphertext) . "\n";
?>

Это было бы хорошей отправной точкой: http://php.net/manual/en/function.mcrypt-create-iv.php

person ROY Finley    schedule 28.12.2012
comment
Но это PKCS5Padding? - person Ricardo Martins; 28.12.2012

Вы можете сделать это с помощью вызова библиотеки phpseclib, которую можно настроить на любой шифр (AES, DES..), режим шифрования, длину ключа и необязательное происхождение PBKDF2. См.: http://phpseclib.sourceforge.net/crypt/examples.html.

person neid    schedule 13.03.2015