Home  >  Article  >  Backend Development  >  Convert custom XTEA algorithm from JavaScript to Golang

Convert custom XTEA algorithm from JavaScript to Golang

PHPz
PHPzforward
2024-02-15 10:27:08803browse

将自定义 XTEA 算法从 JavaScript 转换为 Golang

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.

Question content

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

Workaround

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

illustrate

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:

    Projects in
  • v
  • Items in
  • 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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete