Go使用Bine解析mkp224o生成的ed25519密钥无法得到对应v3 onion地址
问题原因及修复方案
你的代码存在两处核心错误,导致Tor读取到无效密钥后自动生成了随机新密钥,所以输出的onion地址和mkp224o生成的不一致:
- 错误使用
bytes.TrimLeft处理密钥前缀:bytes.TrimLeft会从头部删除所有匹配第二个参数中任一字符的内容,并不是删除固定前缀,应该用bytes.TrimPrefix来匹配mkp224o生成密钥的固定32字节头部。 - 未按标准生成ed25519私钥:mkp224o的密钥文件去掉头部后剩余的32字节是ed25519的种子,而Go标准库的
ed25519.PrivateKey是64字节结构(前32字节为种子,后32字节为对应公钥),直接将32字节种子赋值给ed25519.PrivateKey类型会导致密钥无效。
修正后的代码片段
将原代码中读取密钥的部分替换为以下内容即可:
const hsKeyHeader = "== ed25519v1-secret: type0 ==\x00\x00\x00" buf, err := os.ReadFile("/home/user/mkp224o/onions/rocin4w356yd7jadjppabxivaz56z4k2wfvy5xpxieirenda3yt2aiqd.onion/hs_ed25519_secret_key") check(err) // 移除固定头部得到32字节种子 seed := bytes.TrimPrefix(buf, []byte(hsKeyHeader)) if len(seed) != ed25519.SeedSize { check(errors.New("invalid ed25519 secret key file")) } // 从种子生成标准64字节ed25519私钥 known := ed25519.NewKeyFromSeed(seed)
另外你原代码中判断os.Args长度的逻辑没有实际作用(后续未使用传入的参数),可以自行删除或者补充对应逻辑。
内容的提问来源于stack exchange,提问作者Paris Valios
相关产品推荐
相关产品推荐

