Golang无法解密XOR-Base64编码文本的问题
Golang无法解密XOR-Base64编码文本的问题 0
我正在使用以下代码对数据进行加密和解密。现在我想通过 Node JS 加密数据,并通过 Go 语言解密数据。但我无法使用 Go 语言实现此功能。
var B64XorCipher = {
encode: function(key, data) {
return new Buffer(xorStrings(key, data),'utf8').toString('base64');
},
decode: function(key, data) {
data = new Buffer(data,'base64').toString('utf8');
return xorStrings(key, data);
}
};
function xorStrings(key,input){
var output='';
for(var i=0;i<input.length;i++){
var c = input.charCodeAt(i);
var k = key.charCodeAt(i%key.length);
output += String.fromCharCode(c ^ k);
}
return output;
}
通过 Go 语言我尝试按如下方式进行解码,但未能成功实现。
bytes, err := base64.StdEncoding.DecodeString(actualInput)
encryptedText := string(bytes)
fmt.Println(EncryptDecrypt(encryptedText, "XXXXXX"))
func EncryptDecrypt(input, key string) (output string) {
for i := range input {
output += string(input[i] ^ key[i%len(key)])
}
return output
}
有人能帮助我解决这个问题吗?
更多关于Golang无法解密XOR-Base64编码文本的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Golang无法解密XOR-Base64编码文本的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
问题在于你的 Go 代码在处理字符编码时与 JavaScript 实现不一致。JavaScript 使用 UTF-16 编码,而 Go 在处理字符串时使用 UTF-8 编码。这导致 XOR 运算结果不同。
以下是修正后的 Go 代码:
package main
import (
"encoding/base64"
"fmt"
)
func main() {
// 假设这是从 Node.js 加密后的 base64 数据
actualInput := "your_base64_encoded_string_here"
bytes, err := base64.StdEncoding.DecodeString(actualInput)
if err != nil {
panic(err)
}
// 直接对字节数组进行 XOR 操作,而不是转换为字符串
decrypted := xorBytes(bytes, []byte("XXXXXX"))
fmt.Println(string(decrypted))
}
func xorBytes(input []byte, key []byte) []byte {
output := make([]byte, len(input))
for i := 0; i < len(input); i++ {
output[i] = input[i] ^ key[i%len(key)]
}
return output
}
关键修改点:
- 直接在字节级别进行 XOR 操作,避免字符串编码问题
- 使用
[]byte而不是string来处理数据 - 保持与 JavaScript 相同的 XOR 逻辑
如果你需要完整的加密解密示例:
func encrypt(key, data string) string {
encrypted := xorBytes([]byte(data), []byte(key))
return base64.StdEncoding.EncodeToString(encrypted)
}
func decrypt(key, encoded string) (string, error) {
data, err := base64.StdEncoding.DecodeString(encoded)
if err != nil {
return "", err
}
decrypted := xorBytes(data, []byte(key))
return string(decrypted), nil
}
这样就能确保 Go 和 Node.js 之间的 XOR-Base64 加解密兼容性。

