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.
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
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] }
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
(int64
(int32
或 uint32
没有足够的空间容纳 -(2^53 - 1)
和 2^53 - 1
之间的数字)。所以这些变量应该声明为 int64
ou uint32
n'ont pas assez d'espace pour les nombres entre
int64
:v
key
sum
delta
int32
Nous convertissons ensuite chaque opérande en
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!