go - 字节切片自行改变
问题描述
我正在尝试实现加密,我对原始文本的字节切片有问题。一开始它有正确的值,但是在我使用加密功能之后它正在改变,我不知道为什么。请帮忙。这是我的输出代码的一小部分:
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
}
解决方案
您的函数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...)
}
推荐阅读
- python - 在登录到门户后,在我的 Django 门户中,我的 request.user 始终给出值 AnonymousUser
- excel - 如何禁用输入框上的退出?
- jquery - 如何使用 jQuery 在单击按钮时更改 GET 参数?
- sql-server - 将 12 条 SQL 语句简化为 2 条语句
- php - 这些是反向引用的循环引用吗
- jquery - 在预加载脚本中需要 JQuery 时文档未定义(电子浏览器窗口)
- authentication - 无法在 Ignite 中使用新创建的用户名/密码登录 SQL
- r - R - 相关图的修改(corplot)
- regex - 我想根据角色和分配的项目来 SUMIF 工作量
- sql - 如何删除多个带前缀的表