这个问题困扰我有一段时间了>
背景:想写个文件加密软件,作为练手项目,目前大致的想法是:
- 读取文件元数据(文件名,文件类型,自定义数据...)
- 生成 IV ,以及某个 Magic number
- 使用某种加密算法对上述数据加密
- 不停增加 nonce ,分一定长度的块(比如 64KB 一个块)/流式,对文件本体进行加密
目前备选的加密方式有:
- AES-256-GCM
- Chacha20-Poly1305
- AES-256-CTR
- Chacha20
写到这里就产生了一个问题:我应该对这个文件使用带有 AEAD 的加密算法,还是普通算法?
考虑到这么一个问题,我需要的侧重点是文件如果损坏,应该尽可能少地损坏。假设,文件中某个 bit 被翻转了,AEAD 算法会因为 MAC 校验不正确而拒绝解密,导致整块解密失败(换句话说,可能有连续的一个 64KB 块无法解密)
而如果使用非 AEAD 的流加密算法,比如单纯的 Chacha20 ,然后在加解密前后配个简单的校验和( CRC32 ,CityHash 什么的),可以在解密之后,如果发生校验错误,可以提示用户并强制输出,尽可能减少损失
问一下各位朋友,不知道这种想法是否正确,或者说还有更好的方案?
