Go AES CTR失败测试向量(一个除外)

Go AES CTR失败测试向量(一个除外),go,encryption,aes,Go,Encryption,Aes,我正在Go中测试AES CTR。我编写了加密/解密的逻辑。当然,我搜索测试向量是为了验证我的加密/解密逻辑是否有效。第一个向量通过,但其余向量不通过。 如果有人能检查被剪掉的代码并给我一个失败的提示,我将不胜感激 type testVector struct { plainText string cipherText string } func main() { // encryption key encryptionKey, err := hex.Decod

我正在Go中测试AES CTR。我编写了加密/解密的逻辑。当然,我搜索测试向量是为了验证我的加密/解密逻辑是否有效。第一个向量通过,但其余向量不通过。 如果有人能检查被剪掉的代码并给我一个失败的提示,我将不胜感激

type testVector struct {
    plainText string
    cipherText string
}

func main() {

    // encryption key
    encryptionKey, err := hex.DecodeString("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4")
    if err != nil {
        panic(err)
    }

    // init vector
    iv, err := hex.DecodeString("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff")
    if err != nil {
        panic(err)
    }

    // aes ctr test vectors
    testVectors := []testVector{
        testVector{
            plainText: "6bc1bee22e409f96e93d7e117393172a",
            cipherText: "601ec313775789a5b7a7f504bbf3d228",
        },
        testVector{
            plainText: "ae2d8a571e03ac9c9eb76fac45af8e51",
            cipherText: "f443e3ca4d62b59aca84e990cacaf5c5",
        },
        testVector{
            plainText: "30c81c46a35ce411e5fbc1191a0a52ef",
            cipherText: "2b0930daa23de94ce87017ba2d84988d",
        },
        testVector{
            plainText: "f69f2445df4f9b17ad2b417be66c3710",
            cipherText: "dfc9c58db67aada613c2dd08457941a6",
        },
    }

    for _, v := range testVectors {

        block, err := aes.NewCipher(encryptionKey)
        if err != nil {
                panic(err)
        }

        plainText, err := hex.DecodeString(v.plainText)
        if err != nil {
                panic(err)
        }

        // create cipher text
        cipherText := make([]byte, 16)

        // encrypt
        stream := cipher.NewCTR(block, iv)
        stream.XORKeyStream(cipherText, plainText)

        fmt.Println("expected: "+v.cipherText)
        fmt.Println("calculated" + hex.EncodeToString(cipherText))
        fmt.Println("------")


    }

}
我找到了测试向量


我很确定我做的每件事都是正确的,但是失败了


谢谢

每个测试用例的输入块都是您的IV,因为您只能看到第一个匹配您提供的IV

添加通过所有4项测试的:

或者,更改输入块的原因是,这些示例将在同一个流中链接在一起,这些示例表示每个示例之后的块状态。您可以看到CTR模式增加IV的最后一个字节。以这种方式重用流也将通过所有测试:


我很确定我做的每件事都是正确的,但是失败了听起来你很确定自己做错了什么。第一步是承认自己犯了错误。这比Go函数不正确的可能性要大得多。
> F.5.5 CTR-AES256.
> Encrypt Key 603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4 
> 
> Init. Counter f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff 
> 
> Block #1 
> Input Block f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff 
> Output Block 0bdf7df1591716335e9a8b15c860c502 
> Plaintext 6bc1bee22e409f96e93d7e117393172a 
> Ciphertext 601ec313775789a5b7a7f504bbf3d228 
> 
> Block #2 
> Input Block f0f1f2f3f4f5f6f7f8f9fafbfcfdff00 
> Output Block 5a6e699d536119065433863c8f657b94 
> Plaintext ae2d8a571e03ac9c9eb76fac45af8e51 
> Ciphertext f443e3ca4d62b59aca84e990cacaf5c5 
> 
> Block #3 
> Input Block f0f1f2f3f4f5f6f7f8f9fafbfcfdff01 
> Output Block 1bc12c9c01610d5d0d8bd6a3378eca62 
> Plaintext 30c81c46a35ce411e5fbc1191a0a52ef 
> Ciphertext 2b0930daa23de94ce87017ba2d84988d 
> 
> Block #4 
> Input Block f0f1f2f3f4f5f6f7f8f9fafbfcfdff02 
> Output Block 2956e1c8693536b1bee99c73a31576b6 
> Plaintext f69f2445df4f9b17ad2b417be66c3710 
> Ciphertext dfc9c58db67aada613c2dd08457941a6
// aes ctr test vectors
testVectors := []testVector{
    testVector{
        iv:         "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
        plainText:  "6bc1bee22e409f96e93d7e117393172a",
        cipherText: "601ec313775789a5b7a7f504bbf3d228",
    },
    testVector{
        iv:         "f0f1f2f3f4f5f6f7f8f9fafbfcfdff00",
        plainText:  "ae2d8a571e03ac9c9eb76fac45af8e51",
        cipherText: "f443e3ca4d62b59aca84e990cacaf5c5",
    },
    testVector{
        iv:         "f0f1f2f3f4f5f6f7f8f9fafbfcfdff01",
        plainText:  "30c81c46a35ce411e5fbc1191a0a52ef",
        cipherText: "2b0930daa23de94ce87017ba2d84988d",
    },
    testVector{
        iv:         "f0f1f2f3f4f5f6f7f8f9fafbfcfdff02",
        plainText:  "f69f2445df4f9b17ad2b417be66c3710",
        cipherText: "dfc9c58db67aada613c2dd08457941a6",
    },
}

for _, v := range testVectors {

    block, err := aes.NewCipher(encryptionKey)
    if err != nil {
        panic(err)
    }

    plainText, err := hex.DecodeString(v.plainText)
    if err != nil {
        panic(err)
    }

    iv, err := hex.DecodeString(v.iv)
    if err != nil {
        panic(err)
    }

    // create cipher text
    cipherText := make([]byte, 16)

    // encrypt
    stream := cipher.NewCTR(block, iv)
    stream.XORKeyStream(cipherText, plainText)

    fmt.Println("expected:  " + v.cipherText)
    fmt.Println("calculated:" + hex.EncodeToString(cipherText))
    fmt.Println("------")
}
stream := cipher.NewCTR(block, iv)

for _, v := range testVectors {
    plainText, err := hex.DecodeString(v.plainText)
    if err != nil {
        panic(err)
    }

    // create cipher text
    cipherText := make([]byte, 16)

    // encrypt
    stream.XORKeyStream(cipherText, plainText)

    fmt.Println("expected:  " + v.cipherText)
    fmt.Println("calculated:" + hex.EncodeToString(cipherText))
    fmt.Println("------")
}