我正在使用以下代码加密和解密数据。现在,我想从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 }
有人可以帮我解决这个问题吗?
您应该使用DecodeRuneInString而不只是slice字符串到字节。
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个字节。这就是为什么您得到不同的输出的原因。
charCodeAt
在操场上测试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|