Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
прога 08.08.05 23:19 Число просмотров: 4271
Автор: RElf <M> Статус: Member Отредактировано 29.08.05 09:28 Количество правок: 3
|
вот прога проверяющая и подписывающая crc для новых данных:
#include <stdio.h>
#include <stdint.h>
#include "data.h"
const size_t nb = sizeof(data) / 32;
const uint32_t POLY = 0xEDB88320u;
const uint32_t INIT = 0xF1D54458u;
uint32_t decode32(const uint8_t* src, uint8_t* dst) {
int i;
uint8_t x = src[4] ^ 0x1F;
for(i=0;i<4;++i) dst[i] = src[i];
for(i=4;i<32;++i) dst[i] = src[i] ^ x;
}
uint32_t crc32(const uint8_t* data, const size_t len) {
int i,j;
uint32_t crc = INIT;
for(i=0;i<len;++i) {
crc ^= data[i]<<24;
for(j=0;j<8;++j) {
if(crc&1) crc = (crc>>1)^POLY;
else crc>>=1;
}
}
return crc;
}
void sign_with_crc(uint8_t* data) {
int i;
uint8_t temp[32];
uint8_t x = data[4] ^ 0x1F;
decode32(data,temp);
(uint32_t (&temp[32-4]) = 0;
(uint32_t (&temp[32-4]) = crc32(temp,32-1);
for(i=28;i<32;++i) data[i] = temp[i] ^ x;
}
int check_signature(uint8_t* data) {
uint8_t temp[32];
decode32(data,temp);
return crc32(temp,32)==0;
}
int main() {
int i;
printf("Checking signatures: ");
for(i=0;i<nb;++i) {
if( check_signature(&data[i*32]) ) printf("."); else printf("X");
}
printf("\nSigning... ");
for(i=0;i<nb;++i) sign_with_crc(&data[i*32]);
printf("done\nChecking signatures: ");
for(i=0;i<nb;++i) {
if( check_signature(&data[i*32]) ) printf("."); else printf("X");
}
printf("\n");
return 0;
}
|
|
|