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 實作保持一致,資料型別應為int64
(int32
或uint32
沒有足夠的空間容納-(2^53 - 1)
和2^53 - 1
之間的數字)。所以這些變數應該宣告為 int64
:
v
中的項目key
中的項目sum
delta
然後在執行位元運算之前,我們將每個運算元轉換為 int32
。
以上是將自訂 XTEA 演算法從 JavaScript 轉換為 Golang的詳細內容。更多資訊請關注PHP中文網其他相關文章!