AESCrypt如何处理文件格式的初始化向量(IV) ?
本文关键字:初始化 向量 IV 格式 文件 处理 AESCrypt 何处理 | 更新日期: 2023-09-27 18:06:56
AESCrypt如何处理文件格式2的初始化向量(IV) ?
似乎你不能在生成文件时指定IV…所以我假设静脉注射是未加密存储在密文旁边的?
它是开源的。我快速浏览了一下代码,并不是很清楚。
这个链接引用了一个IV1…但目前还不完全清楚。IV1从何而来?
我只是稍微看了一下,我确实理解了它的大部分内容。我将尽我所能回答你的问题。
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);
}