Я пытаюсь проанализировать заголовок luks, читая необработанные данные с устройства с установленным на нем томом luks, следуя приведенной здесь спецификации: https://gitlab.com/cryptsetup/cryptsetup/wikis/LUKS-standard/on-disk-format.pdf, в частности стр. 6 с таблицей, показывающей данные, находящиеся в каждом месте, тип данных и количество этих типов данных для одного значения.
Например, строка спецификации хэша находится в ячейке 72 и содержит 32 байта типа char. Собрать это в массив и распечатать результат просто, однако, как подробно описано в таблице для числовых значений, таких как версия или ключевые байты (которые предположительно являются длиной ключа), эти значения охватывают несколько целых чисел. Версия имеет два беззнаковых шорта, а ключевые байты имеют четыре беззнаковых целых числа для представления их значений.
Я несколько смущен этим и тем, как мне следует интерпретировать его, чтобы получить правильное значение. Я написал беспорядочный тестовый скрипт для сканирования USB-накопителя, зашифрованного с помощью luks, и отображения того, что было получено при чтении этих полей.
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;
}
Любая помощь будет оценена, спасибо.