Heim  >  Artikel  >  Backend-Entwicklung  >  Konvertieren Sie einen benutzerdefinierten XTEA-Algorithmus von JavaScript nach Golang

Konvertieren Sie einen benutzerdefinierten XTEA-Algorithmus von JavaScript nach Golang

PHPz
PHPznach vorne
2024-02-15 10:27:08813Durchsuche

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

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.

Frageninhalt

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.

Problemumgehung

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

Anleitung

Der sichere Bereich für

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 (int64int32uint32 没有足够的空间容纳 -(2^53 - 1)2^53 - 1 之间的数字)。所以这些变量应该声明为 int64 oder uint32 haben nicht genügend Platz für Zahlen zwischen

). Daher sollten diese Variablen als int64:
    deklariert werden
  • Artikel in v
  • Artikel in key
  • sum
  • delta

int32Wir konvertieren dann jeden Operanden in

, bevor wir die bitweise Operation ausführen. 🎜

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen