ここで指定された仕様に従って、luks ボリュームがインストールされているデバイスから生データを読み取って luks ヘッダーを解析しようとしています: https://gitlab.com/cryptsetup/cryptsetup/wikis/LUKS-standard/on -disk-format.pdf、具体的には、各場所に存在するデータ、そのデータの種類、および単一の値に対してそれらのデータ型がいくつ存在するかを示す表を含む6ページ。
たとえば、hash-spec 文字列は位置 72 にあり、32 型の char バイトが含まれています。これを配列に集めて結果を出力するのは簡単ですが、バージョンやキーバイト (おそらくキーの長さ) などの数値の表で詳しく説明されているように、これらの値は複数の整数にまたがっています。バージョンには 2 つの unsigned short があり、key-bytes には値を表す 4 つの unsigned int があります。
私はこれにやや混乱しており、正しい値を取得するためにそれをどのように解釈すべきか. luks で暗号化された USB スティックをスキャンし、これらのフィールドの読み取りから取得したものを表示する、面倒なテスト スクリプトを作成しました。
256
25953
hash spec:
sha256
key bytes (length):
1073741824
3303950314
1405855026
1284286704
これは非常に紛らわしいです。ハッシュ スペック フィールドには期待値が保持され、文字列そのものが保持されるからです。しかし、バージョン フィールドまたはキーバイト フィールドをどのように解釈すればよいのでしょうか。これらは両方とも完全に乱数のように見えますが、私が知る限り、仕様にはこれを説明するものは何もありません. これは、これを行うためのコードを実際にどのように記述しているかに問題がある可能性があると考えました。以下は、これらの値を表示するために使用されるスクリプトです。
#include <stdio.h>
int main() {
unsigned short data[100];
unsigned char data2[100];
unsigned int data3[100];
int i;
FILE *fp;
fp = fopen("/dev/sdd1", "rb");
fseek(fp, 6, SEEK_SET);
if (fp) {
for (i=0; i < 2; i++) {
fread(&data[i], sizeof(short), 1, fp);
}
fseek(fp, 72, SEEK_SET);
for (i=0; i < 32; i++) {
fread(&data2[i], sizeof(char), 1, fp);
}
fseek(fp, 108, SEEK_SET);
for (i=0; i < 4; i++) {
fread(&data3[i], sizeof(int), 1, fp);
}
printf("version:\n");
for (i=0; i < 2; i++) {
printf("%u\n", data[i]);
}
printf("hash spec:\n");
for (i=0; i < 32; i++) {
printf("%c", data2[i]);
}
printf("\n");
printf("key bytes (length):\n");
for(i=0; i < 4; i++) {
printf("%u\n", data3[i]);
}
fclose(fp);
}
else {
printf("error\n");
}
return 0;
}
どんな助けでも感謝します、ありがとう。