Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tukar algoritma XTEA tersuai daripada JavaScript kepada Golang

Tukar algoritma XTEA tersuai daripada JavaScript kepada Golang

PHPz
PHPzke hadapan
2024-02-15 10:27:08803semak imbas

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

editor php Zimo akan memperkenalkan cara menukar algoritma XTEA tersuai daripada JavaScript kepada Golang dalam artikel ini. Algoritma XTEA ialah algoritma penyulitan simetri yang mudah dan berkesan yang biasa digunakan untuk melindungi keselamatan data. Dengan menukar algoritma XTEA daripada JavaScript kepada Golang, kami boleh melaksanakan fungsi penyulitan dan penyahsulitan yang sama dalam bahasa pengaturcaraan yang berbeza, meningkatkan kemudahalihan kod dan saling kendali. Artikel ini akan memperkenalkan prinsip algoritma dan proses penukaran secara terperinci untuk membantu pembaca memahami dan menggunakan algoritma XTEA dengan lebih baik.

Kandungan soalan

Saya kini menukar penyulitan xtea tersuai saya daripada kod javascript kepada golang, tetapi output golang tidak betul dan berbeza daripada output javascript, berikut ialah kod sumber javascript saya:

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);

dan kod sumber golang:

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

Saya rasa masalahnya berkaitan dengan nisbah emas dan penukaran kepada sistem titik terapung 64 bit javascript, saya tidak menggunakannya kerana saya tidak tahu bagaimana untuk melakukannya dengan tepat

Penyelesaian

Ini adalah pelaksanaannya:

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

Arahan

Julat selamat

integer javascript adalah antara -(2^53 - 1)2^53 - 1 (lihat Julat nombor bulat). Bahagian rumit dalam pelaksanaan javascript ialah pengendali bitwise sentiasa menukar operan kepada integer 32-bit (lihat Penukaran nombor lebar tetap).

Untuk konsisten dengan pelaksanaan javascript, jenis data hendaklah int64 (int64int32uint32 没有足够的空间容纳 -(2^53 - 1)2^53 - 1 之间的数字)。所以这些变量应该声明为 int64 atau uint32 tidak mempunyai ruang yang cukup untuk nombor antara

). Jadi pembolehubah ini harus diisytiharkan sebagai int64:
  • Item dalam v
  • Item dalam key
  • sum
  • delta

int32Kami kemudian menukar setiap operan kepada

sebelum melakukan operasi bitwise. 🎜

Atas ialah kandungan terperinci Tukar algoritma XTEA tersuai daripada JavaScript kepada Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam