Maison  >  Article  >  développement back-end  >  Convertir l'algorithme XTEA personnalisé de JavaScript en Golang

Convertir l'algorithme XTEA personnalisé de JavaScript en Golang

PHPz
PHPzavant
2024-02-15 10:27:08807parcourir

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

L'éditeur php Zimo présentera comment convertir l'algorithme XTEA personnalisé de JavaScript en Golang dans cet article. L'algorithme XTEA est un algorithme de chiffrement symétrique simple et efficace couramment utilisé pour protéger la sécurité des données. En convertissant l'algorithme XTEA de JavaScript en Golang, nous pouvons implémenter les mêmes fonctions de cryptage et de décryptage dans différents langages de programmation, améliorant ainsi la portabilité et l'interopérabilité du code. Cet article présentera en détail le principe de l'algorithme et le processus de conversion pour aider les lecteurs à mieux comprendre et appliquer l'algorithme XTEA.

Contenu de la question

J'ai actuellement converti mon cryptage xtea personnalisé du code javascript en golang, mais la sortie golang est incorrecte et différente de la sortie javascript, voici mon code source 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);

et code source 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])
    }
}

Je pense que le problème est lié au nombre d'or et à la conversion en système javascript à virgule flottante 64 bits, je ne l'ai pas appliqué car je ne sais pas comment le faire exactement

Solution de contournement

Voici l'implémentation 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]
}

Instructions

La plage sûre pour les entiers

javascript est comprise entre -(2^53 - 1)2^53 - 1 (voir Plages d'entiers pour les nombres). La partie délicate de l'implémentation javascript est que les opérateurs au niveau du bit convertissent toujours l'opérande en un entier de 32 bits (voir Conversion de nombres à largeur fixe).

Pour être cohérent avec l'implémentation javascript, le type de données doit être int64 (int64int32uint32 没有足够的空间容纳 -(2^53 - 1)2^53 - 1 之间的数字)。所以这些变量应该声明为 int64 ou uint32 n'ont pas assez d'espace pour les nombres entre

). Ces variables doivent donc être déclarées comme int64 :
  • Articles dans v
  • Articles dans key
  • sum
  • delta

int32Nous convertissons ensuite chaque opérande en

avant d'effectuer l'opération au niveau du bit. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer