sodium_crypto_secretbox

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_secretboxШифрует общим ключом с проверкой подлинности

Описание

function sodium_crypto_secretbox(#[\SensitiveParameter]string $message, string $nonce, #[\SensitiveParameter]string $key): string

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

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

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

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

Функция возвращает зашифрованную строку.

Ошибки

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

Примеры

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

<?php

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

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

var_dump(bin2hex($ciphertext));

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

?>

Вывод приведённого примера будет похож на:

string(78) "3a1fa3e9f7b72ef8be51d40abf8e296c6899c185d07b18b4c93e7f26aa776d24c50852cd6b1076"
string(23) "message to be encrypted"

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

Добавить

Примечания пользователей 3 notes

up
1
celso fontes
5 years ago
An example to how encrypt or decrypt using sodium:

<?php

$key = random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES);

$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = sodium_crypto_secretbox("Hello World !", $nonce, $key);

$plaintext = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
if ($plaintext === false) {
    throw new Exception("Bad ciphertext");
}

echo $plaintext;
up
0
Anonymous
19 days ago
A typical safe pattern is to generate both the key and nonce, then store or transmit the nonce alongside the ciphertext.

<?php

// Generate a random key (must be kept secret)
$key = sodium_crypto_secretbox_keygen();

// Generate a unique nonce for this message (24 bytes)
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);

$message = "Hello secure world";

// Encrypt
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);

// Store or transmit: nonce + ciphertext (key is kept secret)
$stored = base64_encode($nonce . $ciphertext);

// -------------------

// Decode and split
$decoded = base64_decode($stored, true);

$nonce = substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);

// Decrypt
$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);

if ($decrypted === false) {
    die("Decryption failed (message tampered or invalid key)");
}

echo $decrypted;

?>
up
0
Anonymous
19 days ago
A typical safe pattern is to generate both the key and nonce, then store or transmit the nonce alongside the ciphertext.

<?php

// Generate a random key (must be kept secret)
$key = sodium_crypto_secretbox_keygen();

// Generate a unique nonce for this message (24 bytes)
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);

$message = "Hello secure world";

// Encrypt
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);

// Store or transmit: nonce + ciphertext (key is kept secret)
$stored = base64_encode($nonce . $ciphertext);

// -------------------

// Decode and split
$decoded = base64_decode($stored, true);

$nonce = substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);

// Decrypt
$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);

if ($decrypted === false) {
    die("Decryption failed (message tampered or invalid key)");
}

echo $decrypted;

?>
To Top