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密钥对:
- 生成X25519私钥:
openssl genpkey -algorithm X25519 -out private_x25519.pem
- 导出对应公钥:
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
相关产品推荐
相关产品推荐

