AESCrypt はファイル形式 2の初期化ベクトル (IV) をどのように処理しますか?
ファイルを生成するときにIVを指定できないようです...だから、IVは暗号文の隣に暗号化されずに保存されていると思いますか?
オープンソースです。コードをざっと見てみましたが、すぐにはわかりませんでした。
このリンクは IV1 を参照しています ... しかし、完全には明確ではありません。IV1はどこから来たのですか?
AESCrypt はファイル形式 2の初期化ベクトル (IV) をどのように処理しますか?
ファイルを生成するときにIVを指定できないようです...だから、IVは暗号文の隣に暗号化されずに保存されていると思いますか?
オープンソースです。コードをざっと見てみましたが、すぐにはわかりませんでした。
このリンクは IV1 を参照しています ... しかし、完全には明確ではありません。IV1はどこから来たのですか?
少し調べただけで、大体のことは理解できました。私があなたの質問を理解できる範囲でお答えします。
1) AESCrypt は、暗号化ごとに 2 つの IV を使用します。それらには、メッセージの大部分を暗号化するために使用される 1 つの鍵と IV ペアがあり、これらは Key2 と IV2 です。また、Key2 と IV2 を暗号化するためだけに使用される鍵と IV ペアもあり、これらは Key1 と IV1 と呼ばれます。もちろん、Key1 は暗号化されたファイルの一部ではありませんが、IV1 は実際には、リンクした灰色のボックスの下部にある 16 オクテットに暗号化されずに保存されています。その直後の 48 オクテットは、暗号化された Key2 と IV2 です。IV (特に IV1) は暗号化されなくても問題ありません。これは、同じ 16 バイトのデータ ブロックが暗号文に現れるたびに同じように見えることをほぼ不可能にするために存在します。しかし、IV を秘密にする必要はまったくありません。彼らが IV2 を秘密に (暗号化して) 保持していることに、私は実際に驚いていますが、それを行っても害はありません。
2) はい、私はすでにこれに答えたと思いますが、IV1 はフォーマット 2 仕様ごとにファイルの 16 オクテットのチャンクで暗号化されておらず、IV2 はその直後の 48 オクテットで Key2 で暗号化されています。
3&4まとめてお答えします。バイトを直接生成する単なるランダム関数である IV2 の関数を見たことがあるかもしれません。IV1 は、より複雑な方法で生成されます。最も関連性の高いコードをここに投稿します。
そのため、プログラムを調べてみると、プログラムはネットワーク上で見つけられるデバイスを取得します。次に、使用できる MAC アドレスを持つものを探してそれらを繰り返します。使用できるものが見つからない場合は、配列 {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef} としてプログラムの他の場所で定義されている定数である DEFAULT_MAC を使用します。
これで、現在の日付と時刻がティック単位で取得され、生の 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);
}