Слайс байтов меняется сам по себе
Реализую шифрование ГОСТ Р 34.12-2015, возникла проблема со слайсом байтов из исходного текста. В начале программы он имеет корректную форму, а уже после шифрования(вызываю функцию куда передаю исходный текст в виде байтового слайса) он имеет уже другое значение. Помогите, пожалуйста.
Привожу отрывок кода:
func main() {
str := "Hello it's me, a Mario!!"
text := []byte(str)
keys := magmaExpandKey([]byte("asdfghjklz,cmvnfkwadmandksjtmdolasdasdf"))
var crypted []byte
//Первый блок чисто для примера
fmt.Printf("Original: %b\n", text[0:8])
crypted = magmaEncrypt(text[0:8], keys)
fmt.Printf("Original: %b\n", text[0:8])
/* Вывод:
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
// Преобразования G
crypted = magmaG(keys[0].Key, blk)
for i := 1; i < 31; i++ {
crypted = magmaG(keys[i].Key, crypted)
}
// Последнее (тридцать второе) преобразование G
crypted = magmaG(keys[31].Key, crypted)
return crypted
}
Ответы (1 шт):
я хотел написать, что исходя из кода crypted = magmaG(keys[i].Key, crypted), когда передаете слайс, то передается не копия, а ссылка на этот слайс. я могу сделать предположение, что функция magmaG append-ит к crypted новое значение.
Однако, я загуглив 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...)
}
очевидно, что внутри magmaG меняется a, а эта переменная передается как слайс, а значит, меняется по ссылке.
чтобы пофиксить эту проблему, нужно внутри функции magmaG для переменных left и right инициализировать каждый элемент ( и желательно явно указать размер)
func magmaG(k []byte, a []byte) []byte {
var left []byte = make([]byte, 4)
var right []byte = make([]byte, 4)
var G []byte
// Делим 64-битный исходный блок на две части
for i := 0; i < 4; i++ {
left[i] = a[i]
}
var j int = 0
for i := 4; i < 8; i++ {
right[j] = a[i]
j++
}
Тогда результат будет
Original: [1001000 1100101 1101100 1101100 1101111 100000 1101001 1110100] Original: [1001000 1100101 1101100 1101100 1101111 100000 1101001 1110100]