AESCrypt 如何处理文件格式 2 的初始化向量 (IV)?

How does AESCrypt handle the initialization vector (IV) for file format 2?

AESCrypt 如何处理 file format 2 的初始化向量 (IV)?

生成文件时似乎无法指定 IV...所以我假设 IV 未加密地存储在密文旁边?

open source。快速看了一下代码,不是很清楚。

This link references an IV1...但是还不是很清楚。 IV1从何而来?

我只是四处看了看,大部分我都明白了。我会尽我所能回答你的问题。

1) AESCrypt 每次加密使用 2 个 IV。它们有一个密钥,IV 对,用于加密大部分消息,它们是 Key2 和 IV2,它们还有一个密钥,IV 对,仅用于加密 Key2 和 IV2,它们称为 Key1 和 IV1。 Key1 当然不是加密文件的一部分,但 IV1 确实未加密地存储在您链接的灰色框底部附近的 16 个八位字节中。紧接着的 48 个八位字节是加密的 Key2 和 IV2。 IV(尤其是IV1)不加密也可以。它的存在使得相同的 16 字节数据块几乎不可能每次出现在密文中时看起来都一样。但 IV 完全没有必要保密。我真的很惊讶他们将 IV2 保密(加密),但他们这样做并没有什么坏处。

2) 是的,我想我已经回答了这个问题,但是根据格式 2 规范,IV1 在文件的 16 个八位字节块中未加密,而 IV2 在之后的 48 个八位字节中用 Key2 加密。

3&4我一起回答。你可能见过IV2的函数,它只是一个直接生成字节的随机函数。 IV1 以更复杂的方式生成。我将 post 最相关的代码放在这里。

因此,如果您仔细查看,该程序会抓取它可以在网络上找到的设备。然后它遍历它们以寻找一个具有它可以使用的 MAC 地址的地址。如果找不到可以使用的,它会使用 DEFAULT_MAC,这是一个在程序其他地方定义为数组 {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef} 的常量。

现在它以滴答为单位获取当前日期和时间,并用它填充原始 IV 的 8 个字节。然后它使用它找到的任何一个 MAC 并用它来填充同一个原始 IV 数组中的更多字节。

一旦完成,它将这个原始数组发送到 DigestRandomBytes 方法,根据代码(此处不包括该代码块)该方法重复一个循环 256 次以获取加密安全的随机字节,然后对它们进行哈希处理使用 SHA-256。让我担心的一件事——当然只是一点点——是我看不到 MAC 和 datetime ticks 字节如何在 DigestRandomBytes 方法中幸存下来或如何帮助增加其输出的熵。它们被发送到 DigestRandomBytes 方法,但它似乎丢弃它们并用随机字节替换它们,并且它执行了 256 次。

无论如何,是的,IV1 是随机生成的。

        private byte[] GenerateIv1()
        {
            byte[] iv = new byte[IV_SIZE];
            long time = DateTime.Now.Ticks;
            byte[] mac = null;

            /**********************************************************************
            *                                                                     *
            *   NOTE: The time and mac are COMPONENTS in the random IV input.     *
            *         The IV does not require the time or mac to be random.       *
            *                                                                     *
            *         The mac and time are used to INCREASE the ENTROPY, and      *
            *         DECOUPLE the IV from the PRNG output, in case the PRNG      *
            *         has a defect (intentional or not)                           *
            *                                                                     *
            *         Please review the DigestRandomBytes method before           *
            *         INCORRECTLY ASSUMING that the IV is generated from          *
            *         time and mac inputs.                                        *
            *                                                                     *
            ***********************************************************************/                

            try
            {
                System.Net.NetworkInformation.NetworkInterface[] interfaces = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
                for (int i = 0; i < interfaces.Length; i++)
                    if (i != System.Net.NetworkInformation.NetworkInterface.LoopbackInterfaceIndex)
                    {
                        mac = interfaces[i].GetPhysicalAddress().GetAddressBytes();
                        break;
                    }
            }
            catch
            {
                //Not much to do, just go with default MAC
            }

            if (mac == null)
                mac = DEFAULT_MAC;

            for (int i = 0; i < 8; i++)
                iv[i] = (byte)((time >> (i * 8)) & 0xff);

            Array.Copy(mac, 0, iv, 8, Math.Min(mac.Length, iv.Length - 8));
            return DigestRandomBytes(iv, 256);
        }