Форум: "Основная";
Текущий архив: 2002.11.04;
Скачать: [xml.tar.bz2];
ВнизКак подсчитать контрольную сумму файла? Найти похожие ветки
← →
Eugene_post (2002-10-23 19:36) [0]Здравствуйте!
Господа мастера!
Подскажите как подсчитать контрольную сумму файла?
← →
Anatoly Podgoretsky (2002-10-23 20:14) [1]Сложить все байты по модулю 256
← →
Eugene_post (2002-10-23 20:17) [2]Анатолий
А можно по подробнее?
← →
jack128 (2002-10-23 20:19) [3]по модулю 256 = x mod 256
← →
Eugene_post (2002-10-23 20:59) [4]Сорри, я не понимаю как это сделать, можно код?
← →
Anatoly Podgoretsky (2002-10-23 21:21) [5]По модулю 256 в данном контесте означает игнорировать перенос, можно конечно и так, но эффективнее просто использовать байт и блокровать ошибку переполнения. Хотя сама операция не занимает много времени, но она может выполняться над большим массивом данных
Eugene_post (23.10.02 20:59)
Чего тут понимать, читать файл по байтно и суммировать все байты в переменной типа байт, как правило применять это требуется очень редко, эффективность такой проверки чрезвычайно низкая, для более качественной защиты использую как минимум какой нибудь алгоритм CRC
← →
Eugene_post (2002-10-23 21:25) [6]А можно спросить что такое алгоритм CRC?
← →
Anatoly Podgoretsky (2002-10-23 21:37) [7]Можно, это код уменьшающий ошибку (в переводе), основан на более сложном алгоритме, чем просто суммирования байтов, сущестует большое количество таких алгоритмом, ряд из них признан стандартными.
Может подойдем к сути, что ты хочешь сделать, зачем, а то как то беспрдметно.
Но свой вопрос ты уже давно получил ответ, суммируй все байты по модулю 256, по окончанию получишь контрольную сумму.
← →
Jeer (2002-10-23 21:42) [8]Алгоритм CRC это метод вычисления сигнатуры(контрольной суммы) данных, позволяющий с известной вероятностью определить достоверность данных при их возможных искажениях в процессе передачи, хранения..
На начальной стадии создания методов проверки достоверности данных назывался КОНТРОЛЬНАЯ СУММА (КС) или CHECK SUM (CS), затем, с усложнением алгоритмов, - Cyclic Redundancy Check (CRC).
Базируется на полиномиальной алгебре - исходная последовательность делиться на неприводимый полином выбранной структуры (полином с максимальным периодом)
Вот примеры полиномов
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1035389740&n=0
x^32 + x^7 + x^5 + x^3 + x^2 + x + 1, 2^32 -1
x^40 + x^5 + x^4 + x^3 + 1, 2^40 -1
x^48 + x^7 + x^5 + x^4 + x^2 + x + 1, 2^48 -1
← →
Eugene_post (2002-10-23 21:47) [9]Анатолий
Мне нужно сделать следующее: при изменении кода моей программы, будь то прямое редактирование кода или написание программы-патча, перед запуском моей программы шла проверка на изменение кода и если это произошло просто прерывать программу.
P.S. если неохота отвечать подробнее, то я сам попытаюсь найти где-нибудь ответ.
← →
Ученик (2002-10-23 21:52) [10]>Jeer © (23.10.02 21:42)
Если можно, проведите урок до конца, как это превращается в вычисление, например CRC-32 ?
← →
Anatoly Podgoretsky (2002-10-23 22:08) [11]Eugene_post (23.10.02 21:47)
Защита дело тонкое, учти что будут выкусывать проверку не разбираясь как и что ты считаешь. Но в любом случае CRC эффективнее чем CS
Ученик © (23.10.02 21:52)
Алгоритмов очень много, быстрые делаются по таблице, более медленные алгоритмическим путем, с помощью вычисления полинома
Вот мой старый алгоритм, наверно не эффективный, писался в 1996 году для Д2, советую поискать в FAQ и другие реализации, этот просто как пример.
const
CrcPolynominal = $04C11DB7;
//////////////////////////////////////////////////////////////////////////
// Crc32 - Data byte and Current Crc Value //
// POLYNOMIAL USED IS //
// X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+1 //
//////////////////////////////////////////////////////////////////////////
function Crc32(Data:Byte; CurrentCrc:Longint) : Longint; assembler;
asm
MOV ECX,8
@1:
ROL AL,1
RCL EDX,1
JNC @2
XOR EDX,CrcPolynominal
@2:
LOOP @1
MOV EAX,EDX
end;
//*******************************
//* Calculate Crc32 with buffer *
//*******************************
function BufToCrc(const Buf; Count:Integer) : Longint;
var
I : Integer;
begin
Result := $FFFFFFFF;
for I := 0 to Count - 1 do begin
Result := Crc32(Byte(TByteArray(Buf)[I]),Result);
end;
end;
//*******************************
//* Calculate Crc32 with string *
//*******************************
function StrToCrc(Value:string) : Longint;
var
I : Integer;
begin
Result := $FFFFFFFF;
for I := 1 to Length(Value) do begin
Result := Crc32(Byte(Value[I]),Result);
end;
end;
← →
Jeer (2002-10-23 22:10) [12]Места маловато будет :))
Тем более, что Инет позаботился о Вас..
http://embedded.ifmo.ru/embedded_old/ETC/REFERAT/crc/crc.htm
Для электронщиков(ассемблерщиков) - можно представить себе сдвиговый регистр с отводами от необходимых разрядов (при степенях Х) и все отводы и входная однобитная последовательность складываются по "модулю 2" и вводяться побитно в регистр.
После прохождения всего числа в регистре и окажется сигнатура (CRC).
Этот метод экстраполируется и на многобитную обработку.
Для ускорения вычисления реально используются табличные методы.
← →
Jeer (2002-10-23 22:13) [13]Кстати, те же неприводимые полиномы используются и для генерации псевдослучайных чисел.
← →
Ученик (2002-10-23 22:28) [14]>Jeer © (23.10.02 22:10)
Большое спасибо !!!
>Eugene_post
Еще один вариант реализации
const
CrcSeed = $ffffffff;
const
crctable32 : array[0..255] of DWORD = (
$00000000,$77073096,$ee0e612c,$990951ba,$076dc419,$706af48f,
$e963a535,$9e6495a3,$0edb8832,$79dcb8a4,$e0d5e91e,$97d2d988,
$09b64c2b,$7eb17cbd,$e7b82d07,$90bf1d91,$1db71064,$6ab020f2,
$f3b97148,$84be41de,$1adad47d,$6ddde4eb,$f4d4b551,$83d385c7,
$136c9856,$646ba8c0,$fd62f97a,$8a65c9ec,$14015c4f,$63066cd9,
$fa0f3d63,$8d080df5,$3b6e20c8,$4c69105e,$d56041e4,$a2677172,
$3c03e4d1,$4b04d447,$d20d85fd,$a50ab56b,$35b5a8fa,$42b2986c,
$dbbbc9d6,$acbcf940,$32d86ce3,$45df5c75,$dcd60dcf,$abd13d59,
$26d930ac,$51de003a,$c8d75180,$bfd06116,$21b4f4b5,$56b3c423,
$cfba9599,$b8bda50f,$2802b89e,$5f058808,$c60cd9b2,$b10be924,
$2f6f7c87,$58684c11,$c1611dab,$b6662d3d,$76dc4190,$01db7106,
$98d220bc,$efd5102a,$71b18589,$06b6b51f,$9fbfe4a5,$e8b8d433,
$7807c9a2,$0f00f934,$9609a88e,$e10e9818,$7f6a0dbb,$086d3d2d,
$91646c97,$e6635c01,$6b6b51f4,$1c6c6162,$856530d8,$f262004e,
$6c0695ed,$1b01a57b,$8208f4c1,$f50fc457,$65b0d9c6,$12b7e950,
$8bbeb8ea,$fcb9887c,$62dd1ddf,$15da2d49,$8cd37cf3,$fbd44c65,
$4db26158,$3ab551ce,$a3bc0074,$d4bb30e2,$4adfa541,$3dd895d7,
$a4d1c46d,$d3d6f4fb,$4369e96a,$346ed9fc,$ad678846,$da60b8d0,
$44042d73,$33031de5,$aa0a4c5f,$dd0d7cc9,$5005713c,$270241aa,
$be0b1010,$c90c2086,$5768b525,$206f85b3,$b966d409,$ce61e49f,
$5edef90e,$29d9c998,$b0d09822,$c7d7a8b4,$59b33d17,$2eb40d81,
$b7bd5c3b,$c0ba6cad,$edb88320,$9abfb3b6,$03b6e20c,$74b1d29a,
$ead54739,$9dd277af,$04db2615,$73dc1683,$e3630b12,$94643b84,
$0d6d6a3e,$7a6a5aa8,$e40ecf0b,$9309ff9d,$0a00ae27,$7d079eb1,
$f00f9344,$8708a3d2,$1e01f268,$6906c2fe,$f762575d,$806567cb,
$196c3671,$6e6b06e7,$fed41b76,$89d32be0,$10da7a5a,$67dd4acc,
$f9b9df6f,$8ebeeff9,$17b7be43,$60b08ed5,$d6d6a3e8,$a1d1937e,
$38d8c2c4,$4fdff252,$d1bb67f1,$a6bc5767,$3fb506dd,$48b2364b,
$d80d2bda,$af0a1b4c,$36034af6,$41047a60,$df60efc3,$a867df55,
$316e8eef,$4669be79,$cb61b38c,$bc66831a,$256fd2a0,$5268e236,
$cc0c7795,$bb0b4703,$220216b9,$5505262f,$c5ba3bbe,$b2bd0b28,
$2bb45a92,$5cb36a04,$c2d7ffa7,$b5d0cf31,$2cd99e8b,$5bdeae1d,
$9b64c2b0,$ec63f226,$756aa39c,$026d930a,$9c0906a9,$eb0e363f,
$72076785,$05005713,$95bf4a82,$e2b87a14,$7bb12bae,$0cb61b38,
$92d28e9b,$e5d5be0d,$7cdcefb7,$0bdbdf21,$86d3d2d4,$f1d4e242,
$68ddb3f8,$1fda836e,$81be16cd,$f6b9265b,$6fb077e1,$18b74777,
$88085ae6,$ff0f6a70,$66063bca,$11010b5c,$8f659eff,$f862ae69,
$616bffd3,$166ccf45,$a00ae278,$d70dd2ee,$4e048354,$3903b3c2,
$a7672661,$d06016f7,$4969474d,$3e6e77db,$aed16a4a,$d9d65adc,
$40df0b66,$37d83bf0,$a9bcae53,$debb9ec5,$47b2cf7f,$30b5ffe9,
$bdbdf21c,$cabac28a,$53b39330,$24b4a3a6,$bad03605,$cdd70693,
$54de5729,$23d967bf,$b3667a2e,$c4614ab8,$5d681b02,$2a6f2b94,
$b40bbe37,$c30c8ea1,$5a05df1b,$2d02ef8d);
function Crc32(Buffer : Pointer; const BufLen : DWord; Crc : DWord) : DWORD; assembler;
asm
push edi
mov edi, eax
mov eax, ecx
mov ecx, edx
and ecx, ecx
jz @Exit
and edi, edi
jz @Exit
@Start:
xor edx, edx
mov dl, al
shr eax, 8
xor dl, [edi]
xor eax, dword ptr [4 * edx + crctable32]
inc edi
loop @Start
@Exit:
pop edi
end;
function CrcStream(Stream : TStream) : DWORD;
var
P : Pointer;
C : LongInt;
begin
Result := CrcSeed;
GetMem(P, 8192);
try
Stream.Position := 0;
while Stream.Position < Stream.Size do begin
C := Stream.Read(P^, 8192);
Result := Crc32(P, C, Result)
end
finally
FreeMem(P, 8192)
end;
Result := Result xor CrcSeed
end;
function CrcFile(const FileName : string) : DWORD;
var
Stream : TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead + fmShareDenyNone);
try
Result := CrcStream(Stream)
finally
Stream.Free
end
end;
← →
Anatoly Podgoretsky (2002-10-23 22:36) [15]Вариант с таблицей лучше полностью перевести на Паскаль, алгоритмический так просто не переведешь
← →
Jeer (2002-10-23 22:39) [16]Да, это табличный метод с порождающим полиномом
X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
Copyright (C) 1986 Gary S. Brown
Converted to Turbo Pascal (tm) V4.0 March, 1988 by J.R.Louvau
FUNCTION UpdC32(octet: BYTE; crc: LONGINT) : LONGINT;
BEGIN { UpdC32 }
UpdC32 := crctabду32[BYTE(crc XOR LONGINT(octet))] XOR ((crc SHR 8) AND $00FFFFFF)
END;
← →
Ученик (2002-10-23 22:52) [17]>Anatoly Podgoretsky © (23.10.02 22:36)
{====================================================}
{ }
{ EldoS Visual Components }
{ }
{ Copyright (c) 1998-2001, EldoS }
{ }
{====================================================}
const
CRC32_POLYNOMIAL = $EDB88320;
var
Ccitt32Table : array[0..255] of longint;
function crc32(crc : longint; const c : byte) : longint;
begin
crc32 := (((crc shr 8) and $00FFFFFF) xor (Ccitt32Table[(crc xor c) and $FF]));
end;
procedure BuildCRCTable;
var
i, j, value : DWORD;
begin
for i := 0 to 255 do
begin
value := i;
for j := 8 downto 1 do
begin
if ((value and 1) <> 0) then
value := (value shr 1) xor CRC32_POLYNOMIAL
else
value := value shr 1;
end;
Ccitt32Table[i] := value;
end
end;
← →
Jeer (2002-10-23 23:01) [18]Ученик © (23.10.02 22:52)
Это тоже табличный метод, только таблица вычисляется, а не храниться.
См
Jeer © (23.10.02 22:39)
UpdC32 := crctable32[BYTE(crc XOR LONGINT(octet))] XOR ((crc SHR 8) AND $00FFFFFF)
← →
Anatoly Podgoretsky (2002-10-23 23:11) [19]Ученик © (23.10.02 22:52)
Обрати внимание на это
ROL AL,1
RCL EDX,1
JNC @2
Здесь используется флаг переноса, а Паскале до него нет доступа. Но все зависит от целей, мне единственно не нравится, так это использование ассемблерных команд, не переносимость например на технологию .NET
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.04;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c