LINUX.ORG.RU
ФорумAdmin

Мне нужно считать контрольную сумму файла

 ,


0

1

Как вычислять CRC64 утилитой командной строки?

Я обратил внимание на то, что очень много разных реализаций, несколько стандартов (ECMA, ISO и кто-то ещё).
https://reveng.sourceforge.io/crc-catalogue/17plus.htm
CRC-64/ECMA-182, CRC-64/GO-ISO, CRC-64/MS, CRC-64/REDIS, CRC-64/WE, CRC-64/XZ

И это при том, что какая-то реализация ECMA-182 есть в ядре Linux:
https://github.com/torvalds/linux/blob/master/lib/crc64.c

Вопросы:
1) зачем этот алгоритм реализовывают каждый раз заново, в Rust, в Java, в C#, в Си;
2) какой пакет устанавливать в Gentoo и какой утилитой командной строки пользоваться по аналогии с md5sum -b <filename>
3) Может быть есть какой-то алгоритм по ГОСТ этого класса?
4) а точно никак нельзя вызвать функцию из ядра?
5) когда криптографические функции модулями ядра делают, это где-то рядом с этой темой?

Обсудите.

нашел какую-то app-crypt/jacksum, мёржу, ищу как ей пользоваться.

jacksum -h crc:
    crc:<params>  algorithm:   CRC
                  length:      8..64 bits
                  type:        crc
                  since:       Jacksum 1.7.0
                  comment:     With this generic CRC you can specify all CRC-
                               algorithms which can be described by the famous
                               "Rocksoft (tm) Model CRC Algorithm".
                               <params> must have 6 values, which must be    
                               separated by a comma. Those are:               
                               width,poly,init,refIn,refOut,xorOut
                               width  - width of the crc, expressed in bits.
                                        This is one less than the width of
                                        the poly.
                               poly   - the polynomial, specify as hex
                                        The top bit of the poly should be
                                        omitted. For example, if the poly is
                                        10110, you should specify 06. An
                                        important aspect of this parameter
                                        is that it represents the unreflected
                                        poly; the bottom bit of this parameter
			                is always the LSB of the divisor
			                during the division regardless of
			                whether the algorithm being modelled
			                is reflected.
                               init   - this parameter specifies the initial
                                        value of the register when the
                                        algorithm starts. Specify as hex.
                               refIn  - this is a boolean parameter. If it
                                        is false, input bytes are processed
                                        with bit 7 being treated as the most
                                        significant bit (MSB) and bit 0 being
                                        treated as the least significant bit.
                                        If this parameter is false, each byte
                                        is reflected before being processed.
                                        true or false
                               refOut - this is a boolean parameter. If it is
                                        set to false, the final value in the
                                        register is fed into the xorOut stage
                                        directly, otherwise, if this parameter
                                        is true, the final register value is
                                        reflected first.
                               xorOut - this value is XORed to the final
                                        register value (after the refOut)
                                        stage before the value is returned as
                                        the official checksum, specify as hex

jacksum -a crc:64,42f0e1eba9ea3693,0,false,false,0 -E hex <filename>

Shushundr ★★★
() автор топика

Первый вопрос не понял. Видимо, чтобы в этом ЯП можно было считать CRC.

Прочитайте, что такое CRC. Это не какой-то конкретный алгоритм, а общий термин. Главное там полином, по которому из исходной последовательности генерируется контрольная сумма.

Программу вы уже нашли, теперь выбирайте полином.

mky ★★★★★
()

1) зачем этот алгоритм реализовывают каждый раз заново

Затем что нефиг париться из-за 10 строк кода.

4) а точно никак нельзя вызвать функцию из ядра?

Скомпилируй в юзерспейс и вызывай сколько хочешь.

5) когда криптографические функции модулями ядра делают, это где-то рядом с этой темой?

Нет.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Скомпилируй в юзерспейс и вызывай сколько хочешь

Ниет. Я хочу чтобы реализация была одна и та же, чтобы гарантию её корректности предоставляли какие-то конкретные люди, например разработчики ядра, чтобы там был реализован тот механизм, который позволяет вызывать функции ядра без выполнения syscall для скорости. То есть, чтобы в Java была не отдельная реализация, а вызывался тот код, который в модуле ядра.

Нет


А как же DRY-принцип?!

нефиг париться из-за 10 строк кода

Больше. Там только предрасчитанная таблица в тексте исходников больше занимает. А по-хорошему, надо иметь не только сам алгоритм подсчёта CRC но и все метданные и метаалгоритмы к нему, чтобы подстраивать его под сценарий использования месту и при этом сохранять гарантии корректности.

Shushundr ★★★
() автор топика
Ответ на: комментарий от Shushundr

Я хочу чтобы реализация была одна и та же, чтобы гарантию её корректности предоставляли какие-то конкретные люди, например разработчики ядра

Тебе гарантия корректности предоставлена открытым исходным кодом — там алгоритм уровня хелловорлда, математика уровня младших классов школы — при желании даже на бумажке можно посчитать (для маленьких файлов). Ты же не просишь каких-то там дурацких гарантий от factorial.py.

И вообще, зачем вплетать каких-то «людей» (люди ущербны, всегда), когда всё и так гарантируется технически? Это defective by design подход. Примерно как верить обещаниям «мы на своём прокси твой трафик не сниффим, честно-честно», как некоторые конторы дают, вместо того, чтобы использовать шифрование и обезопаситься технически.

CrX ★★★
()
Последнее исправление: CrX (всего исправлений: 1)

Как вычислять CRC64 утилитой командной строки?

Зачем? Даже md5 лучше.

зачем этот алгоритм реализовывают каждый раз заново, в Rust, в Java, в C#, в Си;

Потому что это разные языки, очевидно. И ядро Linux ещё не захватило весь мир.

dataman ★★★★★
()
Ответ на: комментарий от dataman

в Rust есть FFI (foreign function interface), в Java JNI (Java Native Interface), в C# есть PInvoke (Platform Invoke), в C есть kernel API, чтобы вызывать ядро. Неважно что языки разные, все они могли бы не реализовывать самостоятельно.

ядро Linux ещё не захватило весь мир.

С такими как вы и не захватит. У вашего (не лично, а как группы) мышления недостаточно целостности (и много шизофрении), например вам кажется что несколько реализаций - это нормально. Такой вывод вы делаете по аналогии с собственным шизофреническим мышлением. На самом деле иметь несколько реализаций в одной системе ненормально и алогично. И только вре́менное отсутствие искинов с кристалльной логикой позволяет такому происходить.

md5 лучше

Это невозможно заявить, не зная требований. Может у меня есть требование обратимости, а md5 криптографически необратима, тогда она мне не подойдёт под требование.

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от Shushundr

предрасчитанная таблица

подстраивать его под сценарий использования

Тогда тебе «предрассчитанная таблица» на фиг не нужна, тем более, если считаешь статический файл, а не поток по линии связи (там да, таблица для ускорения). Считай по алгоритму (в десяток строк, да), подставляя нужные параметры.

Вообще-то, текст «A Painless Guide to CRC Error Detection Algorithms» (crc_v3.txt) написан почти 30 лет назад, включает исходники и гуглится на полклика.

alegz ★★★★
()
Последнее исправление: alegz (всего исправлений: 1)