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
}

关键修改点:

  1. 直接在字节级别进行 XOR 操作,避免字符串编码问题
  2. 使用 []byte 而不是 string 来处理数据
  3. 保持与 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 加解密兼容性。

回到顶部