php-Editor Zimo stellt in diesem Artikel vor, wie man den benutzerdefinierten XTEA-Algorithmus von JavaScript in Golang konvertiert. Der XTEA-Algorithmus ist ein einfacher und effektiver symmetrischer Verschlüsselungsalgorithmus, der häufig zum Schutz der Datensicherheit verwendet wird. Durch die Konvertierung des XTEA-Algorithmus von JavaScript in Golang können wir dieselben Verschlüsselungs- und Entschlüsselungsfunktionen in verschiedenen Programmiersprachen implementieren und so die Codeportabilität und Interoperabilität verbessern. In diesem Artikel werden das Algorithmusprinzip und der Konvertierungsprozess ausführlich vorgestellt, um den Lesern zu helfen, den XTEA-Algorithmus besser zu verstehen und anzuwenden.
Ich habe derzeit meine benutzerdefinierte xtea-Verschlüsselung von Javascript-Code in Golang konvertiert, aber die Golang-Ausgabe ist falsch und unterscheidet sich von der Javascript-Ausgabe. Hier ist mein Javascript-Quellcode:
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);
und Golang-Quellcode:
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]) } }
Ich denke, das Problem hängt mit dem Goldenen Schnitt und der Konvertierung in das 64-Bit-Gleitkommasystem von Javascript zusammen. Ich habe es nicht angewendet, weil ich nicht genau weiß, wie es geht.
Hier ist die Go-Implementierung:
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-Ganzzahlen liegt zwischen -(2^53 - 1)
和 2^53 - 1
(siehe Ganzzahlbereiche für Zahlen). Der knifflige Teil der Javascript-Implementierung besteht darin, dass bitweise Operatoren den Operanden immer in eine 32-Bit-Ganzzahl umwandeln (siehe Konvertierung von Zahlen mit fester Breite).
Um mit der Javascript-Implementierung konsistent zu sein, sollte der Datentyp int64
sein (int64
(int32
或 uint32
没有足够的空间容纳 -(2^53 - 1)
和 2^53 - 1
之间的数字)。所以这些变量应该声明为 int64
oder uint32
haben nicht genügend Platz für Zahlen zwischen
int64
:v
key
sum
delta
int32
Wir konvertieren dann jeden Operanden in
Das obige ist der detaillierte Inhalt vonKonvertieren Sie einen benutzerdefinierten XTEA-Algorithmus von JavaScript nach Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!