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