Файл, содержащий его собственную контрольную сумму

Так как Вы говорите о полиморфизме тогда да, Вы можете, мы делали такой материал за годы до того, как C++ появился.

В основном Вы используете struct для содержания и данных и списка указателей функции для указания на соответствующие функции для тех данных.

Так, в коммуникационном классе, у Вас было бы открытое, читать, записать и опасное положение, которое сохранялось бы как четыре указателя функции в структуре, вместе с данными для объекта, чего-то как:

typedef struct {
    int (*open)(void *self, char *fspec);
    int (*close)(void *self);
    int (*read)(void *self, void *buff, size_t max_sz, size_t *p_act_sz);
    int (*write)(void *self, void *buff, size_t max_sz, size_t *p_act_sz);
    // And data goes here.
} tCommClass;

tCommClass commRs232;
commRs232.open = &rs232Open;
: :
commRs232.write = &rs232Write;

tCommClass commTcp;
commTcp.open = &tcpOpen;
: :
commTcp.write = &tcpWrite;

, Конечно, те сегменты кода выше на самом деле были бы в "конструкторе" таким как rs232Init().

, Когда Вы 'наследовались' тому классу, Вы просто изменяете указатели для указания на собственные функции. Все, которые вызвали те функции, сделают это через указатели функции, давая Вам Ваш полиморфизм:

int stat = (commTcp.open)(commTcp, "bigiron.box.com:5000");

Вид подобных vtable руководство.

у Вас могли даже быть виртуальные классы путем установки указателей в NULL - поведение будет немного отличаться к C++ (дамп ядра во времени выполнения, а не ошибке во время компиляции).

Вот часть примера кода, который демонстрирует его. Сначала структура класса верхнего уровня:

#include <stdio.h>

// The top-level class.

typedef struct sCommClass {
    int (*open)(struct sCommClass *self, char *fspec);
} tCommClass;

Тогда у нас есть функции для TCP 'подкласс':

// Function for the TCP 'class'.

static int tcpOpen (tCommClass *tcp, char *fspec) {
    printf ("Opening TCP: %s\n", fspec);
    return 0;
}
static int tcpInit (tCommClass *tcp) {
    tcp->open = &tcpOpen;
    return 0;
}

И HTTP один также:

// Function for the HTTP 'class'.

static int httpOpen (tCommClass *http, char *fspec) {
    printf ("Opening HTTP: %s\n", fspec);
    return 0;
}
static int httpInit (tCommClass *http) {
    http->open = &httpOpen;
    return 0;
}

И наконец тестовая программа для показа его в действии:

// Test program.

int main (void) {
    int status;
    tCommClass commTcp, commHttp;

    // Same 'base' class but initialised to different sub-classes.

    tcpInit (&commTcp);
    httpInit (&commHttp);

    // Called in exactly the same manner.

    status = (commTcp.open)(&commTcp, "bigiron.box.com:5000");
    status = (commHttp.open)(&commHttp, "http://www.microsoft.com");

    return 0;
}

Это производит вывод:

Opening TCP: bigiron.box.com:5000
Opening HTTP: http://www.microsoft.com

, таким образом, Вы видите, что различные функции вызываются, в зависимости от подкласса.

49
задан dreftymac 11 June 2017 в 05:04
поделиться

8 ответов

Да. Это возможно, и это обычное дело с простыми контрольными суммами. Заставить файл включить его собственный md5sum будет довольно сложно.

В самом простом случае создайте значение контрольной суммы, которое приведет к тому, что суммарный модуль будет равен нулю. Функция контрольной суммы становится чем-то вроде

(n1 + n2 ... + CRC) % 256 == 0

. Если контрольная сумма становится частью файла и проверяется сама. Очень распространенным примером этого является алгоритм Луна , используемый в номерах кредитных карт. Последняя цифра является контрольной и сама является частью 16-значного числа.

17
ответ дан 7 November 2019 в 11:45
поделиться

Конечно, это возможно. Но одним из способов использования контрольных сумм является обнаружение подделки файла - как узнать, был ли файл изменен, если модификатор также может заменить контрольную сумму?

7
ответ дан 7 November 2019 в 11:45
поделиться

Конечно, вы можете присоединить дайджест самого файла к концу файла. Чтобы проверить это, вы должны вычислить дайджест всех, кроме последней части, а затем сравнить его со значением в последней части. Конечно, без какой-либо формы шифрования любой может пересчитать дайджест и заменить его.

edit

Я должен добавить, что это не так уж необычно. Один из способов - объединить CRC-32 так, чтобы CRC-32 всего файла (включая этот дайджест) был равен нулю. Однако это не будет работать с дайджестами, основанными на криптографических хэшах.

5
ответ дан 7 November 2019 в 11:45
поделиться

Я не знаю, Я правильно понимаю ваш вопрос, но вы можете сделать первые 16 байтов файла контрольной суммой остальной части файла.

Итак, перед записью файла вы вычисляете хэш, сначала записываете значение хеша, а затем записываете файл содержание.

2
ответ дан 7 November 2019 в 11:45
поделиться

Конечно, можно, но в этом случае дайджест SHA для всего файла не будет включенным вами SHA, потому что это криптографическая хеш-функция, поэтому изменение одного бита в файле изменяет весь хеш. Вам нужна контрольная сумма , вычисленная с использованием содержимого файла в соответствии с набором критериев.

-1
ответ дан 7 November 2019 в 11:45
поделиться

Конечно.

Самый простой способ - запустить файл с помощью алгоритма MD5 и встроить эти данные в файл. Вы можете разделить контрольную сумму и поместить ее в известные места файла (в зависимости от размера части файла, например 30%, 50%, Изменить Я забыл сказать, что вам нужно будет удалить данные контрольной суммы перед их использованием.

Конечно, если ваш файл должен быть легко читаемым другой программой, например Word, тогда все становится немного сложнее, поскольку вы не хотите " повредить "файл, чтобы он больше не читался.

-1
ответ дан 7 November 2019 в 11:45
поделиться

Если вопрос заключается в том, может ли файл содержать его собственная контрольная сумма (в дополнение к другому содержимому), ответ тривиально утвердительный для контрольных сумм фиксированного размера, потому что файл может содержать все возможные значения контрольной суммы.

Если вопрос в том, может ли файл состоять из своей собственной контрольной суммы (и ничего другого), то нетривиально построить алгоритм контрольной суммы, который сделал бы такой файл невозможным: для n-байтовой контрольной суммы, возьмите двоичное представление первых n байтов файла и добавьте 1. Поскольку также тривиально построить контрольную сумму, которая всегда сама себя кодирует (т. е. выполнить вышеуказанное без добавления 1), очевидно, что есть некоторые контрольные суммы, которые могут ] кодируют себя, а некоторые, которые не могут . Вероятно, будет довольно сложно сказать, какая из них является стандартной контрольной суммой.

1
ответ дан 7 November 2019 в 11:45
поделиться

Есть много способов встраивания информации для обнаружения ошибок передачи и т. Д. Контрольные суммы CRC хороши для обнаружения серий последовательных смен битов и могут быть добавлены в таким образом, чтобы контрольная сумма всегда была, например, 0. Такие контрольные суммы (включая коды исправления ошибок), однако, легко воссоздать, и они не предотвращают злонамеренное вмешательство.

Невозможно встроить что-либо в сообщение, чтобы получатель мог проверить его подлинность, если получатель ничего не знает об отправителе / ​​от отправителя. Например, получатель может поделиться секретным ключом с отправителем. Затем отправитель может добавить зашифрованную контрольную сумму (которая должна быть криптографически защищенной, например md5 / sha1). Также можно использовать асимметричное шифрование, при котором отправитель может опубликовать свой открытый ключ и подписать контрольную сумму / хэш md5 своим закрытым ключом. Затем хэш и подпись могут быть добавлены к данным как новый вид контрольной суммы. В наши дни это делается постоянно в Интернете.

Остальные проблемы заключаются в следующем: 1. Как получатель может быть уверен, что у него правильный открытый ключ, и 2. Насколько в действительности все это безопасно? Ответ на 1 может отличаться. В Интернете общепринято иметь открытый ключ, подписанный кем-то, кому все доверяют. Другое простое решение состоит в том, что получатель получил открытый ключ на встрече лично ... Ответ на 2 может меняться изо дня в день, но то, что дорого стоит заставить сегодня, вероятно, будет дешево сломать когда-нибудь в будущем. . К тому времени, как мы надеемся, появились новые алгоритмы и / или увеличенные размеры ключей.

0
ответ дан 7 November 2019 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: