crypto / cipher-XORKeyStream对src [] byte有什么作用?

时间:2019-05-15 00:55:41

标签: go aes

我正在使用Go进行AES加密,我发现加密后源字节已更改。如果cap(source)> len(source)似乎对XORKeyStream函数进行更改,那么它对src [] byte的作用到底是什么?

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...)
}

byte2加密后更改了,怎么了?

1 个答案:

答案 0 :(得分:0)

我对crypto / cypher-XORKeyStream不熟悉,但是如果有帮助,我可以告诉您XOR对位的作用。我有一些电子经验,这是XOR门的真相表:

XOR Gate Truth Table

输入X和Y代表两位。输出Z是对X和Y进行XOR运算的结果。

用英语,你会说“输入,一个或另一个,但不能同时输入两个”会导致输出“ True”。

不知道这将有多大帮助,或者不知道如何使用crypto / cypher-XORKeyStream将其应用于两个以上的输入位。 但这是一个示例:

X = 00110001010
Y = 11111111111
Z = 11001110101

祝你好运!