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

本文关键字:初始化 向量 IV 格式 文件 处理 AESCrypt 何处理 | 更新日期: 2023-09-27 18:06:56

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

似乎你不能在生成文件时指定IV…所以我假设静脉注射是未加密存储在密文旁边的?

它是开源的。我快速浏览了一下代码,并不是很清楚。

这个链接引用了一个IV1…但目前还不完全清楚。IV1从何而来?

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

我只是稍微看了一下,我确实理解了它的大部分内容。我将尽我所能回答你的问题。

1) AESCrypt每次加密使用2 IVs。它们有一个密钥,IV对用于加密大部分信息,这些是Key2和IV2,它们也有一个密钥,IV对仅用于加密Key2和IV2,它们被称为Key1和IV1。Key1当然不是加密文件的一部分,但是IV1确实以未加密的方式存储在您链接的灰色框底部附近的16字节中。后面的48个字节是加密的Key2和IV2。IV(特别是IV1)不加密是可以的。这是为了使相同的16字节数据块在每次出现在密文中时看起来都一样,这几乎是不可能的。但是静脉注射完全没有必要保密。我真的很惊讶他们把IV2保密(加密),但他们这样做并没有什么害处。

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

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

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

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

完成后,它将这个原始数组发送到DigestRandomBytes方法,其中,根据代码(该代码块不包括在这里),该方法重复一个循环256次,以获得加密安全的随机字节,然后使用SHA-256对它们进行散列。让我担心的一件事(当然只是一点点)是,我根本没有看到MAC和日期时间刻度字节是如何在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);
        }