精易论坛

标题: 【libsodium】ED25519签名模块 [打印本页]

作者: 易造轮    时间: 2026-6-22 22:49
标题: 【libsodium】ED25519签名模块
本帖最后由 易造轮 于 2026-6-23 04:41 编辑

易语言原生无 ED25519 加密能力,工业界最稳妥的方案是封装成熟开源库 libsodium 的 DLL。libsodium 是密码学领域的标准实现,安全性、性能和跨语言兼容性都有保障,远优于纯易语言手写的椭圆曲线实现(纯易语言实现大数运算效率极低、安全性无法验证,不推荐生产环境使用)。

下载对应位数的 libsodium.dll:
官方下载地址:https://download.libsodium.org/libsodium/releases/
下载 Win32 版本:libsodium-1.0.21-stable-msvc.zip
将 libsodium.dll 放到你的易语言程序同级目录,或系统 System32/SysWOW64 目录。
  
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
测试ED25519 ()
子程序名返回值类型公开备 注
测试ED25519  
变量名类 型静态数组备 注
公钥字节集 
私钥字节集 
消息字节集 
签名字节集 
验签结果逻辑型 
' 1. 初始化加密库
如果真 (初始化加密库 ())
信息框 (“加密库初始化失败,请检查libsodium.dll是否存在”, 0, “错误”, )
返回 ()

' 2. 生成密钥对
如果真 (生成密钥对 (公钥, 私钥))
信息框 (“密钥对生成失败”, 0, “错误”, )
返回 ()

' 3. 待签名消息
消息 = 到字节集 (“Hello, ED25519 with 易语言!”)
' 4. 签名
签名 = 消息签名 (消息, 私钥)
如果真 (取字节集长度 (签名) = 0)
信息框 (“签名失败”, 0, “错误”, )
返回 ()

' 5. 验签
验签结果 = 签名验证 (消息, 签名, 公钥)
如果 (验签结果)
信息框 (“签名验证通过!”, 0, “成功”, )
信息框 (“签名验证失败!”, 0, “失败”, )

子程序名返回值类型公开备 注
初始化加密库逻辑型 程序启动时调用1次,返回是否初始化成功
变量名类 型静态数组备 注
ret整数型 
ret = sodium_init ()
返回 (ret ≠ -1)
子程序名返回值类型公开备 注
生成密钥对逻辑型 随机生成ED25519公钥+私钥
参数名类 型参考可空数组备 注
公钥字节集输出32字节公钥
私钥字节集输出64字节私钥
变量名类 型静态数组备 注
ret整数型 
' 预分配标准长度空间
公钥 = 取空白字节集 (32)
私钥 = 取空白字节集 (64)
ret = crypto_sign_keypair (公钥, 私钥)
返回 (ret = 0)
子程序名返回值类型公开备 注
种子导入密钥对逻辑型 通过32字节种子私钥还原完整密钥对
参数名类 型参考可空数组备 注
种子私钥字节集32字节种子
公钥字节集输出32字节公钥
完整私钥字节集输出64字节完整私钥
变量名类 型静态数组备 注
ret整数型 
如果真 (取字节集长度 (种子私钥) ≠ 32)
返回 ()
公钥 = 取空白字节集 (32)
完整私钥 = 取空白字节集 (64)
ret = crypto_sign_seed_keypair (公钥, 完整私钥, 种子私钥)
返回 (ret = 0)
子程序名返回值类型公开备 注
消息签名字节集 对消息生成ED25519签名,返回64字节签名,失败返回空
参数名类 型参考可空数组备 注
待签名消息字节集原始消息数据
私钥字节集64字节ED25519私钥
变量名类 型静态数组备 注
sig字节集 
siglen长整数型 
ret整数型 
如果真 (取字节集长度 (私钥) ≠ 64)
返回 ({  })
sig = 取空白字节集 (64)
siglen = 64
ret = crypto_sign_detached (sig, siglen, 待签名消息, 取字节集长度 (待签名消息), 私钥)
如果真 (ret ≠ 0)
返回 ({  })
返回 (sig)
子程序名返回值类型公开备 注
签名验证逻辑型 验证ED25519签名,返回是否通过
参数名类 型参考可空数组备 注
原始消息字节集原始消息数据
签名数据字节集64字节签名
公钥字节集32字节ED25519公钥
如果真 (取字节集长度 (签名数据) ≠ 64 取字节集长度 (公钥) ≠ 32)
返回 ()
返回 (crypto_sign_verify_detached (签名数据, 原始消息, 取字节集长度 (原始消息), 公钥) = 0)
DLL命令名返回值类型公开备 注
sodium_init整数型 初始化libsodium库,全局调用1次即可;成功返回1,已初始化返回0,失败返回-1
DLL库文件名:
libsodium.dll
在DLL库中对应命令名:
@sodium_init
参数名类 型传址数组备 注
DLL命令名返回值类型公开备 注
crypto_sign_keypair整数型 随机生成ED25519密钥对;成功返回0
DLL库文件名:
libsodium.dll
在DLL库中对应命令名:
@crypto_sign_keypair
参数名类 型传址数组备 注
pk字节集输出公钥,需预分配32字节空间
sk字节集输出私钥,需预分配64字节空间
DLL命令名返回值类型公开备 注
crypto_sign_seed_keypair整数型 通过32字节种子生成密钥对;成功返回0
DLL库文件名:
libsodium.dll
在DLL库中对应命令名:
@crypto_sign_seed_keypair
参数名类 型传址数组备 注
pk字节集输出公钥32字节
sk字节集输出私钥64字节
seed字节集32字节种子私钥
DLL命令名返回值类型公开备 注
crypto_sign_detached整数型 生成分离式签名;成功返回0
DLL库文件名:
libsodium.dll
在DLL库中对应命令名:
@crypto_sign_detached
参数名类 型传址数组备 注
sig字节集输出签名,需预分配64字节空间
siglen_p整数型输出实际签名长度
m字节集待签名原始消息
mlen长整数型消息字节长度
sk字节集64字节ED25519私钥
DLL命令名返回值类型公开备 注
crypto_sign_verify_detached整数型 验证分离式签名;成功返回0,失败返回-1
DLL库文件名:
libsodium.dll
在DLL库中对应命令名:
@crypto_sign_verify_detached
参数名类 型传址数组备 注
sig字节集64字节签名数据
m字节集原始消息数据
mlen长整数型消息字节长度
pk字节集32字节ED25519公钥





作者: bianyuan456    时间: 7 天前
本帖最后由 bianyuan456 于 2026-6-23 03:31 编辑

在测试ED25519()的最后,在注释' 5. 验签
上面少了以下这一句关键代码!

  
验签结果 = 签名验证 (消息, 签名, 公钥)

没这一句,你这个验签结果没赋值,一直是初始值,也就是假
---------------
另外,最新版是1.0.22,为何不下载
libsodium-1.0.22-msvc.zip   
呢?

作者: 易造轮    时间: 7 天前
bianyuan456 发表于 2026-6-23 03:11
在测试ED25519()的最后,在注释' 5. 验签
上面少了以下这一句关键代码!

编辑多次搞漏了,


1.0.22 完全可以正常使用,之前推荐 1.0.21 是出于「稳定优先+功能无差异」的考量,对你只用到 ED25519 签名的场景来说,两者没有本质区别。下面详细说明原因:


一、libsodium 的双轨版本机制


libsodium 采用两套版本并行的发布体系,这是很多人容易混淆的点:



目前的现状是:



二、对你的 ED25519 场景,升级无收益


ED25519(crypto_sign_* 系列)是 libsodium 最核心的基础密码学组件,从 1.0.19 版本之后就没有过逻辑改动和 API 变更:



  1. 功能完全一致:1.0.22 新增的是 IP 地址加密、XOF 可扩展输出哈希等边缘功能,和 ED25519 签名、验签没有任何关系,升级得不到任何收益。

  2. 调用完全兼容:两者 ABI 100% 兼容,你之前写的所有 DLL 声明、封装代码,换 1.0.22 的 DLL 可以直接运行,一行都不用改。

  3. 安全性无差别:2025 年底披露的 ED25519 点校验漏洞,在 1.0.21 及之后的所有版本中都已修复,两个版本都不存在该安全问题。


三、最终建议




作者: webmaster999    时间: 7 天前
生成密钥对 (公钥, 私钥) 为何公钥, 私钥为空?
作者: 胖子葛格    时间: 7 天前
感谢大神分享~
作者: 易造轮    时间: 7 天前
webmaster999 发表于 2026-6-23 08:16
生成密钥对 (公钥, 私钥) 为何公钥, 私钥为空?

你看备注,生成随机的
作者: webmaster999    时间: 7 天前
易造轮 发表于 2026-6-23 09:35
你看备注,生成随机的

执行后 公钥, 私钥 是参考值,不应该有数据嘛?
作者: xxhaishixx    时间: 7 天前
请问大佬们,这个的应用场景是啥?小白,不懂。
作者: 杨明煜    时间: 7 天前
支持一下,谢谢!......
作者: yxl2008    时间: 7 天前
谢谢分享!!
作者: ttggnn    时间: 7 天前
感谢分享
作者: year1970    时间: 6 天前
感谢分享
作者: 胖子葛格    时间: 5 天前
感谢大神分享~!
作者: hhf4977    时间: 5 天前
感谢分享
作者: please    时间: 4 天前
感谢分享,支持开源!!!
作者: 胖子葛格    时间: 4 天前
感谢大神分享~!
作者: bianyuan456    时间: 昨天 19:51
易造轮 发表于 2026-6-23 04:46
编辑多次搞漏了,

感谢解答




欢迎光临 精易论坛 (https://bbs.ijingyi.com/) Powered by Discuz! X3.4