Golang 加密 : encrypted file not prefixed with IV

标签 go cryptography aes

我在 cipher.NewOFB 中使用 IV,但我的加密文件从未使用它作为前缀。我遵循了 https://golang.org/pkg/crypto/cipher/ 的 golang 示例,但似乎无法弄清楚为什么不考虑前缀。

有人知道问题出在哪里吗?

func generateRandomIV(length int) []byte {
    iv := make([]byte, aes.BlockSize)

    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        panic(err)
    }

    return iv
}


func encryptFile(filename, keystring string) error {
    readFile, err := os.Open(filename)
    iv := generateRandomIV(aes.BlockSize)

    outFile, err := os.OpenFile(filename+".enc", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
    if err != nil {
        panic(err)
    }

    defer readFile.Close()
    defer outFile.Close()

    key := []byte(keystring)

    block, err := aes.NewCipher(key)

    if err != nil {
        panic(err)
    }

    fmt.Println("IV:", iv)
    writer := &cipher.StreamWriter{S: cipher.NewOFB(block, iv), W: outFile}

    if _, err := io.Copy(writer, readFile); err != nil {
        return err
    }

    return nil
}

最佳答案

自己添加 IV 前缀或预先共享 IV。如果您为它添加前缀,您将删除它并将其应用于解密。

如何共享 IV 不是加密标准的一部分,它是开发人员的选择。给 IV 加上前缀很常见,但不是必需的或唯一的方法,但这是一个不错的选择。

关于Golang 加密 : encrypted file not prefixed with IV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39259363/

相关文章:

c++ - 在 crypto++ 中将字符串转换为字节

文件在 Go 中既存在又不存在?

go - 错误 “binary.Write: invalid type”是什么意思?

loops - 是什么导致空的 Go for 循环锁定程序?

c# - RijndaelManaged 实例的用途?

MySQL AES_DECRYPT 返回 NULL

node.js - 在 Postgres 和 Node 之间加密/解密

go - C++有的go缺少什么?

encryption - 使用 RSA_set0_key(key, n,e,d) 时 RSA_public_decrypt 失败?

algorithm - 非对称 key 加密算法如何保持单向解密和加密功能?