arrays - AES 解密在每个第 1024 个块上失败,有 16 个错误字节
问题描述
我正在尝试实现一个读取器将同时解密数据并验证数据HMAC + SHA256
。
将完整的数据解密为一个块并随后对其进行验证。
数据量可能相当大,因此我不想将其保存在数组中。
阅读器实现大部分工作,但每 1024 个 AES 块的结果是错误的。
func (r *mediaReader) Read(dst []byte) (n int, err error) {
if m := len(dst); m%r.cbc.BlockSize() != 0 {
m = (m / r.cbc.BlockSize()) * r.cbc.BlockSize()
dst = dst[:m]
}
n, err = r.limitedReader.Read(dst)
r.cbc.CryptBlocks(dst, dst)
tmp := r.fileLength - int64(n)
if tmp < 0 || err == io.EOF {
n += int(tmp)
}
r.total += n
r.fileLength -= int64(n)
r.hash.Write(dst)
if r.fileLength <= 0 || err == io.EOF {
//validate
mac := make([]byte, 10)
nn, rr := r.fullReader.Read(mac)
if rr != nil {
return n, rr
}
if nn != 10 {
return n, fmt.Errorf("not enougth data remaining")
}
if !hmac.Equal(mac, r.hash.Sum(nil)) {
return n, fmt.Errorf("invalid media hmac\n%v\n%v", r.hash.Sum(nil)[:10], mac)
}
//SUCCESS
return n, io.EOF
}
return n, err
}
之前使用and 结束limitedReader
10个字节。fullReader
fullReader
mediaReader
创作片段:
h := hmac.New(sha256.New, macKey)
h.Write(iv)
cbc := cipher.NewCBCDecrypter(block, iv)
media := &io.LimitedReader{R: fullReader, N: length - 10}
return &mediaReader{
limitedReader: media,
fullReader: fullReader,
hash: h,
fileLength: fileLength,
cbc: cbc,
total: 0,
}
16384-16399;1 * 1024 * 16(AES 块大小);16 个错误字节 32768-32783;2 * 1024 * 16(AES 块大小);16 个错误字节 49152-49167;3 * 1024 * 16(AES 块大小);16 个错误字节...
有谁知道我做错了什么?
解决方案
推荐阅读
- python - PsyNet 实验抛出与 requirements.txt 相关的错误
- python - Docker django.db.utils.OperationalError:无法将主机名“db”转换为地址:名称解析暂时失败
- javascript - 获取前 N 个素数的总和 javascript
- node.js - 节点异或两个大小不等的数组 - 未定义异或的行为
- html - 在引导网格列上添加背景颜色,防止着色默认网格列填充
- list - Flutter 类成员列表即使在初始化后也返回 null
- python - 列出创建日期范围内的文件路径
- python - 如何让 python tkinter 通过输入框验证文件路径?
- python - python - 如何模拟Python列表中的局部变量?
- python - 如何为电子表格中的每一行运行 Python for 循环?