首頁  >  文章  >  後端開發  >  將自訂 XTEA 演算法從 JavaScript 轉換為 Golang

將自訂 XTEA 演算法從 JavaScript 轉換為 Golang

PHPz
PHPz轉載
2024-02-15 10:27:08754瀏覽

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

php小編子墨在本文中將介紹如何將自訂的XTEA演算法從JavaScript轉換為Golang。 XTEA演算法是一種簡單而有效的對稱加密演算法,常用於保護資料的安全性。透過將XTEA演算法從JavaScript轉換為Golang,我們可以在不同的程式語言中實現相同的加密解密功能,提高程式碼的可移植性和互通性。本文將詳細介紹演算法原理與轉換過程,幫助讀者更能理解並應用XTEA演算法。

問題內容

我目前已將自訂xtea 加密從javascript 程式碼轉換為golang,但golang 輸出不正確且與javascript 輸出不同,這是我的javascript 原始碼:

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

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

我認為問題與黃金比例和javascript 64 位元浮點系統的轉換有關,我沒有應用它,因為我不知道如何準確地做到這一點

解決方法

這是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 整數的安全性範圍在-(2^53 - 1)2^53 - 1 之間(請參閱數字的整數範圍 )。 javascript 實作中棘手的部分是位元運算子總是將運算元轉換為 32 位元整數(請參閱固定寬度數字轉換)。

為了與javascript 實作保持一致,資料型別應為int64int32uint32 沒有足夠的空間容納-(2^53 - 1)2^53 - 1 之間的數字)。所以這些變數應該宣告為 int64:

  • v 中的項目
  • key 中的項目
  • sum
  • delta

然後在執行位元運算之前,我們將每個運算元轉換為 int32

以上是將自訂 XTEA 演算法從 JavaScript 轉換為 Golang的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除