php editor Zimo will introduce how to convert the custom XTEA algorithm from JavaScript to Golang in this article. The XTEA algorithm is a simple and effective symmetric encryption algorithm commonly used to protect data security. By converting the XTEA algorithm from JavaScript to Golang, we can implement the same encryption and decryption functions in different programming languages, improving code portability and interoperability. This article will introduce the algorithm principle and conversion process in detail to help readers better understand and apply the XTEA algorithm.
I currently converted the custom xtea encryption from javascript code to golang, but the golang output is incorrect and different from the javascript output, here is my javascript source code:
function sample(e, t) { for (var n = 32, r = 0; 0 < n--; ) { e[0] += (((e[1] << 4) ^ (e[1] >> 5)) + e[1]) ^ (r + t[3 & r]); r += -1640531527; e[1] += (((e[0] << 4) ^ (e[0] >> 5)) + e[0]) ^ (r + t[(r >> 11) & 3]); } } var temp = [15, 16]; var temp_2 = [14, 15, 16, 17]; sample(temp, temp_2); console.log(temp);
and golang source code:
func sample(v *[2]uint32, key *[4]uint32) { const ( num_rounds uint32 = 32 delta uint32 = 0x9E3779B9 ) for i, sum := uint32(0), uint32(0); i < num_rounds; i++ { v[0] += (((v[1] << 4) ^ (v[1] >> 5)) + v[1]) ^ (sum + key[sum&3]) sum += delta v[1] += (((v[0] << 4) ^ (v[0] >> 5)) + v[0]) ^ (sum + key[(sum>>11)&3]) } }
I think the problem is related to the golden ratio and the conversion to javascript 64 bit floating point system, I didn't apply it because I don't know how to do it accurately
This is the implementation of go:
package main import ( "fmt" ) func main() { v := [2]int64{15, 16} key := [4]int64{14, 15, 16, 17} sample(&v, &key) } func sample(v *[2]int64, key *[4]int64) { const ( num_rounds = 32 delta int64 = 1640531527 ) for i, sum := 0, int64(0); i < num_rounds; i++ { temp := int32(v[1]) v[0] += int64((((temp << 4) ^ (temp >> 5)) + temp) ^ int32(sum+key[int32(sum)&3])) sum -= delta temp = int32(v[0]) v[1] += int64((((temp << 4) ^ (temp >> 5)) + temp) ^ int32(sum+key[(int32(sum)>>11)&3])) } fmt.Println(*v) // Output: [6092213800 11162584543] }
javascript The safe range of integers is between -(2^53 - 1)
and 2^53 - 1
(see Integer Ranges of Numbers ). The tricky part in the javascript implementation is that bitwise operators always convert the operand to a 32-bit integer (see Fixed-width number conversion).
To be consistent with the javascript implementation, the data type should be int64
(int32
or uint32
does not have enough space to accommodate -(2^53 - 1) Numbers between
and 2^53 - 1
). So these variables should be declared as int64
:
v
key
sum
delta
We then convert each operand to int32
before performing the bitwise operation.
The above is the detailed content of Convert custom XTEA algorithm from JavaScript to Golang. For more information, please follow other related articles on the PHP Chinese website!