最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 将自定义 XTEA 算法从 JavaScript 转换为 Golang

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

    解决方法

    这是 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 实现保持一致,数据类型应为 int64int32uint32 没有足够的空间容纳 -(2^53 - 1)2^53 - 1 之间的数字)。所以这些变量应该声明为 int64:

    • v 中的项目
    • key 中的项目
    • sum
    • delta

    然后在执行按位运算之前,我们将每个操作数转换为 int32

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 将自定义 XTEA 算法从 JavaScript 转换为 Golang
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 292稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情