簡體   English   中英

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

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

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

似乎您無法在生成文件時指定IV ...所以我假設IV是未加密存儲在密文旁邊的?

它是開源的 我快速瀏覽了一下代碼,並不清楚。

該鏈接引用了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以更復雜的方式生成。 我將在此處發布最相關的代碼。

因此,如果您仔細查看,該程序將獲取可以在網絡上找到的設備。 然后遍歷他們,尋找一個可以使用的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);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM