WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Самая быстрая Тема-конструктор для WordPress
функция не описана

ParagonIE_Sodium_Crypto32::secretbox_xchacha20poly1305_open() public WP 1.0

Decrypt a ciphertext generated via secretbox_xchacha20poly1305().

Это метод класса: ParagonIE_Sodium_Crypto32{}

Хуков нет.

Возвращает

Строку.

Использование

$result = ParagonIE_Sodium_Crypto32::secretbox_xchacha20poly1305_open( $ciphertext, $nonce, $key );
$ciphertext(строка) (обязательный)
$nonce(строка) (обязательный)
$key(строка) (обязательный)

Код ParagonIE_Sodium_Crypto32::secretbox_xchacha20poly1305_open() WP 5.5.1

<?php
public static function secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key)
{
    /** @var string $mac */
    $mac = ParagonIE_Sodium_Core32_Util::substr(
        $ciphertext,
        0,
        self::secretbox_xchacha20poly1305_MACBYTES
    );

    /** @var string $c */
    $c = ParagonIE_Sodium_Core32_Util::substr(
        $ciphertext,
        self::secretbox_xchacha20poly1305_MACBYTES
    );

    /** @var int $clen */
    $clen = ParagonIE_Sodium_Core32_Util::strlen($c);

    /** @var string $subkey */
    $subkey = ParagonIE_Sodium_Core32_HChaCha20::hchacha20($nonce, $key);

    /** @var string $block0 */
    $block0 = ParagonIE_Sodium_Core32_ChaCha20::stream(
        64,
        ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8),
        $subkey
    );
    $verified = ParagonIE_Sodium_Core32_Poly1305::onetimeauth_verify(
        $mac,
        $c,
        ParagonIE_Sodium_Core32_Util::substr($block0, 0, 32)
    );

    if (!$verified) {
        try {
            ParagonIE_Sodium_Compat::memzero($subkey);
        } catch (SodiumException $ex) {
            $subkey = null;
        }
        throw new SodiumException('Invalid MAC');
    }

    /** @var string $m - Decrypted message */
    $m = ParagonIE_Sodium_Core32_Util::xorStrings(
        ParagonIE_Sodium_Core32_Util::substr($block0, self::secretbox_xchacha20poly1305_ZEROBYTES),
        ParagonIE_Sodium_Core32_Util::substr($c, 0, self::secretbox_xchacha20poly1305_ZEROBYTES)
    );

    if ($clen > self::secretbox_xchacha20poly1305_ZEROBYTES) {
        // We had more than 1 block, so let's continue to decrypt the rest.
        $m .= ParagonIE_Sodium_Core32_ChaCha20::streamXorIc(
            ParagonIE_Sodium_Core32_Util::substr(
                $c,
                self::secretbox_xchacha20poly1305_ZEROBYTES
            ),
            ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8),
            (string) $subkey,
            ParagonIE_Sodium_Core32_Util::store64_le(1)
        );
    }
    return $m;
}