玩了一下 Xray 上面的 Reality, 对其中生成 x2519 密钥对的过程感兴趣,拿到源码一看,还可以用 -i 参数带私钥进去计算公钥。 大概瞄了一下源码,哦,私钥是个Base64字符串。 放Google随便搜了一下,得到了这个: head -c 32 /dev/random | base64 生成的结果比如: Fi/Ho3QZbkPwR4OwqUVSE5lEZag4wIX80tZ2VNr0edA= 拿着这个喂给 xray x25519 -i 却老是报错,比如: illegal base64 data at input byte 2 拿着linux生成的base64字符串与xray x25519生成的公私钥字符串对比一下发现,xray x25519不认识'/'字符,而且生成的公私钥里面有'-'和'_' 再去查了一下资料,这才知道: Golang的base64.RawURLEncoding和Linux系统中的Base64在某些方面是有区别的,下面分别介绍: 1. 编码字符集不同。base64.RawURLEncoding 按照RFC 4648中URL和文件名安全型Base64编码标准,使用的字符集不包含加号(+)和斜杠(/),而是使用减号(-)和下划线(_)进行二进制数据的编码,这样可以避免数据在进行URL或文件名传递时出现冲突和问题。而Linux系统中的Base64编码标准是标准的Base64编码标准,使用的字符集包含加号(+)和斜杠(/)。 2. 解码方法不同。base64.RawURLEncoding 和标准Base64编码的解码方法有所不同。这是因为在进行URL参数编码时,我们通常会使用多种方法对特殊字符进行转义,这些特殊字符会在URL传输期间发生错误。因此,base64.RawURLEncoding在解码时不支持使用标准Base64编码字符集中的加号(+)和斜杠(/),而是使用减号(-)和下划线(_)作为替代字符。 总之,base64.RawURLEncoding适用于一些二进制数据需要进行URL或文件命名处理的场景,可以避免数据在传输时出现问题。而Linux系统中的标准Base64编码适用于其他场景,最常用于网络应用程序或进行数据等加密传输的场景。 在Linux中,可以通过使用 base64 命令来进