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);
}
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);
}