Xray x25519 密钥对、linux中的base64、golang中的base64.RawURLEncoding

玩了一下 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 命令来进行 Base64 编解码,但是该命令默认使用标准的 Base64 编码算法,而不是 Go 语言中的 base64.RawURLEncoding 算法。

然而,可以通过结合使用其他的工具以及 Linux 命令来实现类似于 base64.RawURLEncoding 算法的 Base64 编解码。

下面是一个实现 base64.RawURLEncoding 算法的例子:

1. 首先使用 echo 命令来输出需要编码的字符串,例如:

echo -n "Hello World" 

   -n 参数用来避免在输出中添加换行符。

2. 将输出的字符串通过管道符传递给 openssl 命令,使用 base64 编码:

echo -n "Hello World" | openssl enc -base64 -A | tr '+/' '-_' | tr -d '=' 

   第一步使用 openssl enc 命令来进行 Base64 编码, -A 参数用来禁止 OpenSSL 在输出结果中添加换行符,以保证编码的正确性。

   第二步使用 tr 命令替换掉生成的 Base64 编码中的 + 和 / 字符,前者替换成 -,后者替换成 _,以满足 base64.RawURLEncoding 的编码要求。

   第三步使用 tr 命令删除末尾不需要的 = 字符,以保证编码后的结果长度更短。

因为这种方式需要依赖于其他的工具(例如 openssl、tr),所以可能会存在一些性能以及安全性上的潜在问题。如果你需要在生产环境中使用 Base64 编解码,最好使用专门为此目的编写的库函数,例如 Go 语言中提供的 encoding/base64 包。


感谢 ChatGPT

感谢 https://t.me/gpt_user



用下面这一段生成的base64字符串喂给xray x25519 -i就正常了。

head -c 32 /dev/random | openssl enc -base64 -A | tr '+/' '-_' | tr -d '='

或者这样也是可以的

head -c 32 /dev/random | base64 -w 0 | tr '+/' '-_' | tr -d '='

评论

The Hot3 in Last 30 Days

ClouDNS .asia免费域名 托管到CloudFlare开CDN白嫖Websocket WS通道翻墙 / desec.io

无服务器 自建短链服务 Url-Shorten-Worker 完整的部署教程