Невозможно расшифровать текст xor-base64 - PullRequest
0 голосов
/ 19 января 2019

Я использую приведенный ниже код для шифрования и дешифрования данных. Теперь я хочу зашифровать данные из Node JS и хочу расшифровать данные из Go lang. Но я не могу добиться этого, используя GO lang.

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
}

Может ли кто-нибудь помочь мне решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Вы должны использовать 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"

Результат теста тот же.

Вот почему.

В go, когда вы ранжируете строку, вы перебираете байты, но 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| 
0 голосов
/ 19 января 2019

Метод charCodeAt () возвращает целое число от 0 до 65535, представляющее кодовую единицу UTF-16 по данному индексу.

var c = input.charCodeAt(i);

Для операторов с предложением range

Для строкового значения предложение «range» выполняет итерации по кодовым точкам Unicode в строке, начиная с байтового индекса 0. В последовательных итерацияхзначение индекса будет индексом первого байта последовательных кодированных точек UTF-8 в строке, а второе значение типа руны будет значением соответствующей кодовой точки.Если итерация встречает недопустимую последовательность UTF-8, второе значение будет 0xFFFD, символ замены Unicode, и следующая итерация будет продвигать один байт в строке.

for i := range input

UTF-16 против UTF-8?

...