douzen3516 2018-06-23 12:24
浏览 33

第1024个块的解密失败

i am trying to implement a reader in golang to decrypt data (provided by a reader) and validate the data (hmac + sha256) at the same time.

Decrypting the complete data as one block and validating it afterwards works. The data can be rather big, so i don´t want to hold in a data array.

The reader implementation works for the most part, but the result of every 1024th aes block is wrong.

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
%v
%v", r.hash.Sum(nil)[:10], mac)
    }
    //SUCCESS
    return n, io.EOF
}
return n, err
}

The limitedReader uses the fullReader and ends 10 bytes before the fullReader does. Snippet of mediaReader creation:

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,
}

Does anyone regocnize what I am doing wrong? Wrong decrypted bytes: 16384-16399; 1 * 1024 * 16 (AES Blocksize); 16 wrong bytes 32768-32783; 2 * 1024 * 16 (AES Blocksize); 16 wrong bytes 49152-49167; 3 * 1024 * 16 (AES Blocksize); 16 wrong bytes ...

Thanks for your help!

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
    • ¥15 个人网站被恶意大量访问,怎么办
    • ¥15 Vue3 大型图片数据拖动排序
    • ¥15 Centos / PETGEM
    • ¥15 划分vlan后不通了
    • ¥15 GDI处理通道视频时总是带有白色锯齿
    • ¥20 用雷电模拟器安装百达屋apk一直闪退
    • ¥15 算能科技20240506咨询(拒绝大模型回答)
    • ¥15 自适应 AR 模型 参数估计Matlab程序
    • ¥100 角动量包络面如何用MATLAB绘制