Openssl cipher iv length: примеры (PHP)

Определение длины IV для шифрования OpenSSL в PHP
Раздел: Шифрование (OpenSSL)
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.

openssl_encrypt() и openssl_decrypt()

Функции для непосредственного шифрования и дешифрования данных. Требуют корректный IV, длина которого может быть определена через openssl_cipher_iv_length.

hash_hkdf()

Генерирует криптографический ключ. Может использоваться совместно с функциями шифрования OpenSSL.

Выбор функции зависит от задачи: openssl_cipher_iv_length применяется на подготовительном этапе, тогда как openssl_encrypt/decrypt - для основных операций.

Типичные ошибки

Несуществующий алгоритм
$result = openssl_cipher_iv_length('несуществующий-алгоритм');
var_dump($result);
bool(false)
Использование нулевой длины IV

Некоторые алгоритмы (например, '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)
Игнорирование возвращаемого значения false
$iv_len = openssl_cipher_iv_length('unknown-cipher');
$iv = openssl_random_pseudo_bytes($iv_len); // Ошибка при $iv_len = false
Warning: openssl_random_pseudo_bytes(): Length must be greater than 0

Изменения в версиях PHP

PHP 8.0.0

Функция теперь выбрасывает исключение 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
PHP 7.1.0

Добавлена поддержка алгоритмов с AEAD режимами (GCM, CCM), которые имеют фиксированную длину IV.

Расширенные примеры

Генерация IV с проверкой
Пример php
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 байт
Проверка поддержки семейства алгоритмов
Пример php
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
)
Автоматический выбор алгоритма по длине IV
Пример php
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
)
Сравнение IV для разных режимов
Пример php
$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
Интеграция с классом для шифрования
Пример php
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_байт"
}

Аналоги в других языках

Python (cryptography)
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
JavaScript (Node.js crypto)
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.

Отличия от PHP

В Python и JavaScript длина IV обычно определяется через объекты шифрования, тогда как в PHP для этого существует отдельная функция.

PHP openssl_cipher_iv_length function comments

En
Openssl cipher iv length Get the cipher iv length