Xray x25519 密钥对、linux中的base64、golang中的base64.RawURLEncoding
玩了一下 Xray 上面的 Reality, 对其中生成 x2519 密钥对的过程感兴趣,拿到源码一看,还可以用 -i 参数带私钥进去计算公钥。
放Google随便搜了一下,得到了这个:
head -c 32 /dev/random | base64
生成的结果比如:
Fi/Ho3QZbkPwR4OwqUVSE5lEZag4wIX80tZ2VNr0edA=
拿着这个喂给 xray x25519 -i 却老是报错,比如:
illegal base64 data at input byte 2
再去查了一下资料,这才知道:
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
用下面这一段生成的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 '='
评论
发表评论