为什么Go语言的XTS包不能处理任意长度的数据?

bkhjykvo  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(85)

我试图加密一个文件与AES-256使用XTS模式和Golang。我刚刚从CTR模式转移到XTS最近,我面临这个错误
我的代码片段:

func Encrypt(loc string, k *kyber.Kyber) (esK string, err error) {
    in, err := os.Open(loc)
    if err != nil {
        return "", err
    }

    defer in.Close()

    out, err := os.Create(loc + EncryptExtension)
    if err != nil {
        return "", err
    }

    defer out.Close()

    sK, esK, err := k.SecretKey()
    if err != nil {
        return "", err
    }

    cipher, err := xts.NewCipher(aes.NewCipher, sK) // sK = 32 bytes
    if err != nil {
        return "", err
    }

    pT := make([]byte, BufferSize) // BufferSize = 2 * 1024 * 1024 = 2MB

    for {
        len, err := in.Read(pT)
        if err != nil && err != io.EOF {
            return "", err
        }

        if len == 0 {
            break
        }

        cT := make([]byte, len)
        
        cipher.Encrypt(cT, pT[:len], 0) // When len % 16 != 0 the code just panic

        if _, err := out.Write(cT); err != nil {
            return "", err
        }
    }

    return esK, nil
}

字符串
我知道这个错误意味着什么,我也知道解决它的方法,但这里的主要问题是,XTS不是被设计成可以处理任意长度的数据吗?为什么Golang不遵循这一点呢?

  1. XTS mode
ggazkfy8

ggazkfy81#

根据NIST 800-38E
XTS-AES模式是为使用固定长度“数据单元”的存储设备上的数据的加密保护而设计的。
x/crypto/xts库显式声明了以下内容(link):
此软件包不实现密文窃取,因此扇区必须是16字节的倍数。
10多年前贡献初始代码的original CL从未包括对密文窃取的支持,也没有提供原因。可能是由于复杂性而被省略。

相关问题