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

C# AESCrypt如何处理文件格式2的初始化向量(IV)?,c#,c#-4.0,cryptography,aes,initialization-vector,C#,C# 4.0,Cryptography,Aes,Initialization Vector,AESCrypt如何处理的初始化向量(IV) 似乎在生成文件时无法指定IV。。。所以我假设IV未加密存储在密文旁边 是的。我快速查看了一下代码,但并没有立即弄清楚 。。。但还不完全清楚。IV1从何而来?我只是环顾了一下它,我确实了解它的大部分内容。我会尽我所能回答你的问题 1) AESCrypt每次加密使用2个IVs。它们有一个密钥,IV对用于加密大部分消息,它们是Key2和IV2,它们还有一个密钥,IV对仅用于加密Key2和IV2,它们被称为Key1和IV1。Key1当然不是加密文件的一部分,

AESCrypt如何处理的初始化向量(IV)

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

是的。我快速查看了一下代码,但并没有立即弄清楚


。。。但还不完全清楚。IV1从何而来?

我只是环顾了一下它,我确实了解它的大部分内容。我会尽我所能回答你的问题

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

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

3和4我将一起回答。您可能已经看到了IV2的函数,它只是一个直接生成字节的随机函数。IV1以更复杂的方式生成。我将在这里发布最相关的代码

因此,如果您仔细查看,该程序将获取它在网络上可以找到的设备。然后,它会遍历它们,寻找一个可以使用MAC地址的。如果找不到可以使用的数组,它将使用默认的_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);
        }
private byte[]generateV1()
{
字节[]iv=新字节[iv_大小];
长时间=DateTime.Now.Ticks;
字节[]mac=null;
/**********************************************************************
*                                                                     *
*注:时间和mac是随机IV输入中的组件*
*IV不要求时间或mac是随机的*
*                                                                     *
*mac和时间用于增加熵,以及*
*将IV与PRNG输出断开,以防PRNG*
*有缺陷(有意或无意)*
*                                                                     *
*请先查看DigestRandomBytes方法*
*错误地假设IV是由*
*时间和mac输入*
*                                                                     *
***********************************************************************/                
尝试
{
System.Net.NetworkInformation.NetworkInterface[]interfaces=System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
for(int i=0;i>(i*8))&0xff);
复制(mac,0,iv,8,Math.Min(mac.Length,iv.Length-8));
返回随机字节(iv,256);
}