我正在为加密应用程序设计一个程序和文件格式。当我需要对加密的方法/工作流程做出决定时,我发现了这一点。我无法决定使用一种方法而不是另一种方法的利弊。
以下是格式结构的概述:
------------------------------------------ | 文件签名 || 固定 | 平原 | |----------------||----------|------------| | 算法信息 || 固定 | 平原 | |----------------||----------|------------| | 种子 || 固定 | 加密 | |----------------||----------|------------| | 数据 || 变量 | 加密 | |----------------||----------|------------| | CRC || 固定 | 加密 | ------------------------------------------
最初,我打算将SHA-256用于 Hash 函数,将AES-256用于加密算法,但后来它可以配置,正如格式所暗示的那样。
创建加密容器的建议过程:
- 哈希(密码)=> 密钥传递
- 生成随机种子
- 密钥传递 XOR 种子 => 密钥种子
- 使用 Key-Pass 加密种子并存储加密的种子
- 使用密钥种子加密数据并存储加密数据
- 使用 Key-Seed 加密 CRC 并存储加密的 CRC
问题
A.存储加密的种子和 CRC 有什么好处吗?如果我不加密存储它们会不会更不安全?
B.使用 [ Hash(Password + Seed) ] 生成密钥而不是使用 [ Hash(Password) XOR Seed ] 作为最终密钥的安全性或多或少或没有区别?
C.以上两个问题的结论性问题。使用创建加密容器的替代过程是好还是坏:
- 哈希(密码 + 种子)=> 密钥
- 存储未加密的种子
- 使用密钥加密数据并存储加密数据
- 存储未加密的 CRC(或加密)
我想我必须存储未加密的种子,以便在读取加密内容时重新生成密钥。CRC 可以加密或不加密。