小编典典

无法解密Xor-Base64文本

go

我正在使用以下代码加密和解密数据。现在,我想从Node JS加密数据,并想从Go lang解密数据。但是我无法使用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;
}

从头开始,我试图像下面这样解码,但我无法实现。

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
}

有人可以帮我解决这个问题吗?


阅读 314

收藏
2020-07-02

共1个答案

小编典典

您应该使用DecodeRuneInString而不只是slice字符串到字节。

操场上的解决方案:https :
//play.golang.org/p/qi_6S1J_dZU

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    fmt.Println("Hello, playground")
    k:="1234fd23434"
    input:="The 我characterode我 113 is equal to q"
    fmt.Println(EncryptDecrypt(input,k))

    // expect: "eZV扷ZRFRWEWA[戣[@GRX@^B"

}

func EncryptDecrypt(input, key string) (output string) {
    keylen := len(key)
    count := len(input)
    i := 0
    j := 0
    for i < count {
        c, n := utf8.DecodeRuneInString(input[i:])
        i += n
        k, m := utf8.DecodeRuneInString(key[j:])
        j += m
        if j >= keylen {
            j = 0
        }

        output += string(c ^ k)
    }

    return output
}

与您的js结果相比

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;
}

console.log(xorStrings('1234fd23434',"The 我characterode我 113 is equal to q"))
// expect: "eZV扷ZRFRWEWA[戣[@GRX@^B"

测试结果是相同的。

这就是为什么。

在旅途中,当您设置字符串范围时,将迭代字节,但是javascript
charCodeAt是针对字符而不是字节。在utf-8中,字符长度可能为2或3个字节。这就是为什么您得到不同的输出的原因。

在操场上测试https://play.golang.org/p/XawI9aR_HDh

package main

import (
    "fmt"
    "unicode/utf8"
)

var sentence = "The 我quick brown fox jumps over the lazy dog."

var index = 4

func main() {
    fmt.Println("slice of string...")
    fmt.Printf("The byte at %d is |%s|, |%s| is 3 bytes long.\n",index,sentence[index:index+1],sentence[index:index+3])

    fmt.Println("runes of string...")
    ru, _ := utf8.DecodeRuneInString(sentence[index:])
    i := int(ru)
    fmt.Printf("The character code at %d is|%s|%d|    \n",index, string(ru), i)
}

输出是

slice of string...
The byte at 4 is |�|, |我| is 3 bytes long.
runes of string...
The character code at 4 is|我|25105|
2020-07-02