首页 > 后端开发 > Golang > 正文

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

PHPz
发布: 2024-02-15 10:27:08
转载
811人浏览过

将自定义 xtea 算法从 javascript 转换为 golang

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 位浮点系统的转换有关,我没有应用它,因为我不知道如何准确地做到这一点

立即学习Java免费学习笔记(深入)”;

解决方法

这是 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中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号