Что делает crypto / cipher-XORKeyStream с байтом src []? - PullRequest
1 голос
/ 15 мая 2019

Я делаю AES-шифрование с помощью Go, я обнаружил, что исходные байты изменились после шифрования. Кажется, что функция XORKeyStream выполняет изменение, если cap (source)> len (source), что именно она делает с байтом src []?

go версия go1.12.5 darwin / amd64

func main() {
    byte1 := []byte("123abc")
    fmt.Println("content1:", byte1, "len1:", len(byte1), "cap1:", cap(byte1)) // content1: [49 50 51 97 98 99] len1: 6 cap1: 6
    buf := bytes.NewBuffer([]byte("123abc"))
    byte2, _ := ioutil.ReadAll(buf)
    fmt.Println("content2:", byte2, "len2:", len(byte2), "cap2:", cap(byte2)) // content2: [49 50 51 97 98 99] len2: 6 cap2: 1536

    _, _, _, err := crypt.AESEnc(byte1)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("content1:", byte1, "len1:", len(byte1), "cap1:", cap(byte1)) // content1: [49 50 51 97 98 99] len1: 6 cap1: 6
    _, _, _, err = crypt.AESEnc(byte2)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("content2:", byte2, "len2:", len(byte2), "cap2:", cap(byte2)) // content2: [132 200 7 200 195 8] len2: 6 cap2: 1536
}
func AESEnc(data []byte) ([]byte, []byte, string, error) {
    key := make([]byte, 16)
    iv := make([]byte, 16)
    _, err := io.ReadFull(rand.Reader, key)
    if err != nil {
        return nil, nil, "", err
    }
    _, err = io.ReadFull(rand.Reader, iv)
    if err != nil {
        return nil, nil, "", err
    }
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, nil, "", err
    }
    pdata := pckspadding(data, block.BlockSize())
    stream := cipher.NewCFBEncrypter(block, iv)
    stream.XORKeyStream(pdata, pdata)
    return key, iv, base64.StdEncoding.EncodeToString(pdata), nil
}

func pckspadding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}

изменение байта2 после шифрования, что случилось?

1 Ответ

0 голосов
/ 15 мая 2019

Я не знаком с crypto / cypher-XORKeyStream, но я могу рассказать вам, что XOR делает с битами, если это полезно. У меня есть некоторый опыт работы с электроникой, и вот таблица истинности для ворот XOR:

XOR Gate Truth Table

Входы X и Y представляют два бита. Выход Z является результатом XOR-ing X и Y.

На английском языке вы говорите себе: «Входные данные, один или другой, но не оба» приводят к выводу «True».

Не знаю, насколько это поможет, или как применить ее к более чем двум входным битам с помощью crypto / cypher-XORKeyStream. Но вот пример:

X = 00110001010
Y = 11111111111
Z = 11001110101

Удачи!

...