首页 > 解决方案 > 字节切片自行改变

问题描述

我正在尝试实现加密,我对原始文本的字节切片有问题。一开始它有正确的值,但是在我使用加密功能之后它正在改变,我不知道为什么。请帮忙。这是我的输出代码的一小部分:

func main() {
    str := "Hello it's me, a Mario!!"
    text := []byte(str)

    keys := magmaExpandKey([]byte("asdfghjklz,cmvnfkwadmandksjtmdolasdasdf"))

    var crypted []byte

//First block just for example
    fmt.Printf("Original: %b\n", text[0:8])
    crypted = magmaEncrypt(text[0:8], keys)
    fmt.Printf("Original: %b\n", text[0:8])

/* Output:
Original: [1001000 1100101 1101100 1101100 1101111 100000 1101001 1110100]
Original: [1001000 1100101 1101100 1101100 11000011 1101001 11001110 1010111]
*/


    fmt.Printf("Crypted: %s\n", crypted)
    fmt.Printf("Decrypted: %s\n", magmaDecrypt(crypted, keys))
}

func magmaEncrypt(blk []byte, keys []roundKey) []byte {
    var crypted []byte

    crypted = magmaG(keys[0].Key, blk)

    for i := 1; i < 31; i++ {
        crypted = magmaG(keys[i].Key, crypted)
    }

    crypted = magmaG(keys[31].Key, crypted)

    return crypted
}

pastebin 上的完整代码

标签: go

解决方案


您的函数magmaG返回append(left, right)left此时 is 指向blk[4:8]。当blk有足够的容量时,这append会覆盖blk导致“原始”内容以您所看到的稍微不可预测的方式发生变化的底层数组。

从您的 pastebin 链接中,该magmaG函数如下所示:

func magmaG(k []byte, a []byte) []byte {
    var left []byte
    var right []byte
    var G []byte

    // Делим 64-битный исходный блок на две части
    left = a[0:4]
    right = a[4:8]

    // Производим преобразование g
    G = magma_g(k, right)

    // Ксорим результат преобразования g с левой половиной блока
    G = magmaAddXor(left, G)

    // Пишем в левую половину значение из правой
    left = right

    // Пишем результат GOST_Magma_Add в правую половину блока
    right = G

    // Сводим правую и левую части блока в одно целое
    return append(left, right...)
}

一个简单的改变是替换最后一行,用return append(append([]byte{}, left...), right...)它从一个新的空后备数组构造一个字节切片。

我注意到您的代码可以通过删除所有中间变量来显着简化:

func magmaG(k, a []byte) []byte {
    G := magma_g(k, a[4:8])
    G = magmaAddXor(a[:4], G)
    return append(append(make([]byte, 0, 8), a[4:8]...), G...)
}

推荐阅读