CascadiaPHP 2024

sodium_crypto_secretbox_open

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_secretbox_openРасшифровывает общим ключом с проверкой подлинности

Описание

sodium_crypto_secretbox_open(string $ciphertext, string $nonce, #[\SensitiveParameter] string $key): string|false

Функция расшифровывает зашифрованное сообщение симметричным (общим) ключом.

Список параметров

ciphertext

Параметр должен быть в формате, который предоставляет функция sodium_crypto_secretbox() (зашифрованный текст и тег, объединённые).

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 24 байта. Это достаточно большая граница, чтобы генерировать её случайно (например, функцией random_bytes()).

key

Ключ шифрования (256 битов).

Возвращаемые значения

Функция возвращает расшифрованную строку в случае успешного выполнения или false, если возникла ошибка.

Ошибки

  • Функция выбрасывает исключение SodiumException, если длина байтов параметра nonce отличается от значения константы SODIUM_CRYPTO_SECRETBOX_NONCEBYTES (24 байта).
  • Функция выбрасывает исключение SodiumException, если длина байтов параметра key отличается от значения константы SODIUM_CRYPTO_SECRETBOX_KEYBYTES (32 байта).

Примеры

Пример #1 Пример использования функции sodium_crypto_secretbox_open()

<?php

// Значение переменной $key должно храниться в секрете
$key = random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES);

// Не используйте переменную $nonce повторно с тем же ключом
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = sodium_crypto_secretbox('message to be encrypted', $nonce, $key);

// Для расшифровки переменной $ciphertext требуются те же имя и ключ
$plaintext = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);

if (
$plaintext !== false) {
echo
$plaintext . PHP_EOL;
}

?>

Результат выполнения приведённого примера:

message to be encrypted

Смотрите также

add a note

User Contributed Notes 1 note

up
3
khalyomede at gmail dot com
5 years ago
This method will return a string, or false if the data failed to be decrypted.

$key = 'secret';
$data = 'binarydata';
$nonce = random_bytes(SODIUM_CRYPT_SECRETBOX_NONCEBYTES);

$decrypted = sodium_crypto_secretbox_open($data, $nonce, $key);

if ($decrypted === false) {
throw new Exception('failed to decrypt data');
}
To Top