我正在使用以下代码对数据进行加密和解密。现在,我想从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
}
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
charCodeAt()方法返回0到65535之间的整数 代表给定索引处的UTF-16代码单元。
var c = input.charCodeAt(i);
For statements with range clause
对于字符串值,“ range”子句遍历Unicode代码 从字节索引0开始的字符串中的点。连续 迭代,索引值将是的第一个字节的索引 字符串中连续的UTF-8编码的代码点,第二个 符文类型的值将是相应代码的值 点。如果迭代遇到无效的UTF-8序列,则 第二个值将是0xFFFD,Unicode替换字符,以及 下一次迭代将在字符串中前进单个字节。
for i := range input
UTF-16与UTF-8?
答案 1 :(得分:1)
您应该使用f=['1','2','3'................]
而不是DecodeRuneInString
字符串来字节化。
操场上的解决方案:https://play.golang.org/p/qi_6S1J_dZU
slice
与您的js结果相比
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
}
测试结果相同。
这是为什么。
在旅途中,当您设置字符串范围时,将迭代字节,但是javascript 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"
用于字符而非字节。在utf-8中,字符长度可能为2或3个字节。这就是为什么您得到不同的输出的原因。
在游乐场https://play.golang.org/p/XawI9aR_HDh
中进行测试charCodeAt
输出为
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)
}