![](/img/trans.png)
[英]Specified initialization vector(IV) does not match the block size for this algorithm
[英]How does AESCrypt handle the initialization vector (IV) for file format 2?
我只是對它做了一些了解,而且我大部分時間都了解它。 我會盡我所能回答您的問題。
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.