Openssl cipher iv length: примеры (PHP)
openssl_cipher_iv_length(string $cipher_algo): int|falseОсновы функции openssl_cipher_iv_length
Функция openssl_cipher_iv_length() определяет необходимую длину вектора инициализации для выбранного алгоритма шифрования. Она применяется при подготовке к криптографическим операциям с использованием OpenSSL.
Вектор инициализации обеспечивает случайность при шифровании, предотвращая повторяемость выходных данных. Функция возвращает размер IV в байтах, требуемый для конкретного алгоритма.
method (обязательный) - строковый параметр, указывающий алгоритм шифрования. Например, 'aes-256-cbc', 'des-cbc', 'camellia-128-ofb'.
Функция возвращает целое число (длину IV) или false при ошибке.
Примеры использования
Определение длины IV для AES-256-CBC:
$iv_length = openssl_cipher_iv_length('aes-256-cbc');
echo $iv_length;16
$algorithm = 'aes-128-gcm';
if ($iv_len = openssl_cipher_iv_length($algorithm)) {
echo "Алгоритм $algorithm поддерживается. Длина IV: $iv_len";
} else {
echo "Алгоритм $algorithm не поддерживается";
}Алгоритм aes-128-gcm поддерживается. Длина IV: 12
$algorithms = ['aes-128-cbc', 'des-ede3-cbc', 'bf-cbc'];
foreach ($algorithms as $algo) {
$len = openssl_cipher_iv_length($algo);
echo "$algo: " . ($len !== false ? $len : 'не поддерживается') . "\n";
}aes-128-cbc: 16 des-ede3-cbc: 8 bf-cbc: 8
Похожие функции в PHP
Возвращает список доступных алгоритмов шифрования. Используется для проверки поддержки конкретного метода перед вызовом openssl_cipher_iv_length.
Функции для непосредственного шифрования и дешифрования данных. Требуют корректный IV, длина которого может быть определена через openssl_cipher_iv_length.
Генерирует криптографический ключ. Может использоваться совместно с функциями шифрования OpenSSL.
Выбор функции зависит от задачи: openssl_cipher_iv_length применяется на подготовительном этапе, тогда как openssl_encrypt/decrypt - для основных операций.
Типичные ошибки
$result = openssl_cipher_iv_length('несуществующий-алгоритм');
var_dump($result);bool(false)
Некоторые алгоритмы (например, 'aes-256-ecb') не используют IV:
$iv_length = openssl_cipher_iv_length('aes-256-ecb');
echo $iv_length;0
$result = openssl_cipher_iv_length(12345);
var_dump($result);bool(false)
$iv_len = openssl_cipher_iv_length('unknown-cipher');
$iv = openssl_random_pseudo_bytes($iv_len); // Ошибка при $iv_len = falseWarning: openssl_random_pseudo_bytes(): Length must be greater than 0
Изменения в версиях PHP
Функция теперь выбрасывает исключение TypeError при передаче аргумента неверного типа. Ранее возвращалось false.
// PHP 8+
try {
openssl_cipher_iv_length([]);
} catch (TypeError $e) {
echo $e->getMessage();
}openssl_cipher_iv_length(): Argument #1 ($cipher_algo) must be of type string, array given
Добавлена поддержка алгоритмов с AEAD режимами (GCM, CCM), которые имеют фиксированную длину IV.
Расширенные примеры
function generateIV($algorithm) {
$iv_length = openssl_cipher_iv_length($algorithm);
if ($iv_length === false) {
throw new Exception('Алгоритм не поддерживается');
}
if ($iv_length === 0) {
return ''; // Алгоритмы без IV (например, ECB)
}
return openssl_random_pseudo_bytes($iv_length);
}
try {
$iv = generateIV('aes-256-gcm');
echo 'Сгенерирован IV длиной: ' . strlen($iv) . ' байт';
} catch (Exception $e) {
echo 'Ошибка: ' . $e->getMessage();
}Сгенерирован IV длиной: 12 байт
function checkCipherFamily($family) {
$methods = openssl_get_cipher_methods();
$supported = [];
foreach ($methods as $method) {
if (strpos($method, $family) === 0) {
$iv_len = openssl_cipher_iv_length($method);
$supported[$method] = $iv_len;
}
}
return $supported;
}
$chacha = checkCipherFamily('chacha20');
print_r($chacha);Array
(
[chacha20] => 16
[chacha20-poly1305] => 12
)function findCiphersByIvLength($min_length, $max_length = null) {
$max_length = $max_length ?? $min_length;
$result = [];
foreach (openssl_get_cipher_methods() as $cipher) {
$iv_len = openssl_cipher_iv_length($cipher);
if ($iv_len !== false && $iv_len >= $min_length && $iv_len <= $max_length) {
$result[$cipher] = $iv_len;
}
}
asort($result);
return $result;
}
$ciphers = findCiphersByIvLength(12, 16);
print_r(array_slice($ciphers, 0, 5));Array
(
[aes-128-gcm] => 12
[aes-192-gcm] => 12
[aes-256-gcm] => 12
[id-aes128-GCM] => 12
[id-aes192-GCM] => 12
)$modes = ['cbc', 'cfb', 'ofb', 'gcm'];
foreach ($modes as $mode) {
$algo = "aes-128-$mode";
$iv_len = openssl_cipher_iv_length($algo);
echo "$algo: " . ($iv_len !== false ? $iv_len : 'N/A') . "\n";
}aes-128-cbc: 16 aes-128-cfb: 16 aes-128-ofb: 16 aes-128-gcm: 12
class OpenSSLEncryptor {
private $cipher;
private $iv_length;
public function __construct(string $cipher = 'aes-256-cbc') {
$this->cipher = $cipher;
$this->iv_length = openssl_cipher_iv_length($cipher);
if ($this->iv_length === false) {
throw new InvalidArgumentException('Неподдерживаемый алгоритм шифрования');
}
}
public function encrypt(string $data, string $key): array {
$iv = $this->iv_length > 0
? openssl_random_pseudo_bytes($this->iv_length)
: '';
$encrypted = openssl_encrypt($data, $this->cipher, $key, 0, $iv);
return [
'cipher' => $this->cipher,
'data' => $encrypted,
'iv' => base64_encode($iv)
];
}
}
$encryptor = new OpenSSLEncryptor('aes-128-gcm');
$result = $encryptor->encrypt('Секретные данные', 'ключ_32_символа_длинной');
echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);{
"cipher": "aes-128-gcm",
"data": "зашифрованные_данные",
"iv": "кодированный_iv_12_байт"
}Аналоги в других языках
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
# Создание алгоритма AES-256-CBC
algorithm = algorithms.AES(b'0' * 32)
mode = modes.CBC(b'0' * 16)
cipher = Cipher(algorithm, mode, backend=default_backend())
# Длина IV определяется через режим: modes.CBC требует 16 байт
print(len(mode.initialization_vector))16
const crypto = require('crypto');
// Создание шифратора для определения длины IV
const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.alloc(32), Buffer.alloc(0));
// В Node.js длина IV определяется спецификацией алгоритма
// Для AES-CBC: 16 байт
console.log(crypto.getCipherInfo('aes-256-cbc').ivLength);16
Openssl cipher iv length в MySQL
MySQL не предоставляет прямой аналог. Длина IV определяется используемой функцией шифрования (AES_ENCRYPT и др.) и обычно равна 16 байтам для AES.
В Python и JavaScript длина IV обычно определяется через объекты шифрования, тогда как в PHP для этого существует отдельная функция.
PHP openssl_cipher_iv_length function comments
- Php openssl cipher iv length - аргументы и возвращаемое значение
- Функция php openssl_cipher_iv_length - описание
- openssl cipher iv length - примеры
- openssl cipher iv length - похожие методы на php
- openssl_cipher_iv_length на js, python, mysql
- openssl cipher iv length изменения php
- Примеры openssl_cipher_iv_length на php