PHP Conference Japan 2024

sodium_crypto_box

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box带认证的公钥加密

描述

sodium_crypto_box(#[\SensitiveParameter] string $message, string $nonce, #[\SensitiveParameter] string $key_pair): string

使用非对称(公钥)加密来加密消息。

sodium_crypto_box() 为前缀的函数使用的算法是基于 Montgomery 曲线的椭圆曲线 Diffie-Hellman,Curve25519;通常缩写为 X25519。

参数

message

要加密的消息。

nonce

每个消息只能使用一次的数字。长度为 24 字节。这对于随机生成来说足够大(例如 random_bytes())。

key_pair

参见 sodium_crypto_box_keypair_from_secretkey_and_publickey()。这应包括发送方的 X25519 私钥和接收方的 X25519 公钥。

返回值

返回加密的消息(密文加认证标签)。密文将比明文长 16 字节,并且是一个原始二进制字符串。有关安全的存储编码,请参见 sodium_bin2base64()

添加备注

用户贡献的备注 1 条备注

11
craig at craigfrancis dot co dot uk
6 年前
这是一个关于如何使用 sodium_crypto_box() 的快速示例;两个人交换一条 $message,第一个人加密它,以便只有第二个人可以解密它,并确保第一个人确实发送了它(没有被篡改)。

<?php

$keypair1
= sodium_crypto_box_keypair();
$keypair1_public = sodium_crypto_box_publickey($keypair1);
$keypair1_secret = sodium_crypto_box_secretkey($keypair1);

$keypair2 = sodium_crypto_box_keypair();
$keypair2_public = sodium_crypto_box_publickey($keypair2);
$keypair2_secret = sodium_crypto_box_secretkey($keypair2);

//--------------------------------------------------
// 第一个人,加密

$message = 'hello';

$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);

$encryption_key = sodium_crypto_box_keypair_from_secretkey_and_publickey($keypair1_secret, $keypair2_public);
$encrypted = sodium_crypto_box($message, $nonce, $encryption_key);

echo
base64_encode($encrypted) . "\n";

//--------------------------------------------------
// 第二个人,解密

$decryption_key = sodium_crypto_box_keypair_from_secretkey_and_publickey($keypair2_secret, $keypair1_public);
$decrypted = sodium_crypto_box_open($encrypted, $nonce, $decryption_key);

echo
$decrypted . "\n";

?>
To Top