Rumah > Artikel > pembangunan bahagian belakang > Tukar algoritma XTEA tersuai daripada JavaScript kepada 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.
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
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] }
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
(int64
(int32
或 uint32
没有足够的空间容纳 -(2^53 - 1)
和 2^53 - 1
之间的数字)。所以这些变量应该声明为 int64
atau uint32
tidak mempunyai ruang yang cukup untuk nombor antara
int64
:v
key
sum
delta
int32
Kami kemudian menukar setiap operan kepada
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!