You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 7.4 Sodium使用OpenSSL生成的Ed25519公钥加密报错求助

问题解决:sodium_crypto_box_seal 参数错误

错误原因

sodium_crypto_box_seal 要求第二个参数必须是 X25519密钥交换公钥(长度固定为32字节),但你通过OpenSSL生成的是Ed25519签名密钥对,导出的公钥属于Ed25519格式——尽管解码后字节长度也是32,但密钥内部结构与X25519不兼容,导致Sodium无法识别,触发参数错误。

解决方案

方案1:直接生成X25519密钥对

放弃Ed25519密钥,重新生成适用于密钥交换的X25519密钥对:

  1. 生成X25519私钥:
openssl genpkey -algorithm X25519 -out private_x25519.pem
  1. 导出对应公钥:
openssl pkey -in private_x25519.pem -pubout -out public_x25519.pem

之后你原有的公钥读取代码无需修改,解码后的公钥可直接传入sodium_crypto_box_seal。

方案2:转换现有Ed25519公钥为X25519格式

如果不想重新生成密钥对,可通过Sodium内置函数将Ed25519公钥转换为X25519格式:

$pemPublicKey = file_get_contents(PEM_FILES_PATH . '/public33.pem');  
$pemPublicKey = str_replace('-----BEGIN PUBLIC KEY-----', '', $pemPublicKey);
$pemPublicKey = str_replace('-----END PUBLIC KEY-----', '', $pemPublicKey);
$pemPublicKey = trim($pemPublicKey);
$ed25519_pubkey = base64_decode($pemPublicKey);

// 转换Ed25519公钥为X25519公钥
$x25519_pubkey = sodium_crypto_sign_pk_to_box_pk($ed25519_pubkey);

$enc = sodium_crypto_box_seal('Hello World', $x25519_pubkey);

内容的提问来源于stack exchange,提问作者Christoforos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:35:13