2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


В этом разделе нельзя создавать новые темы.

Если Вы хотите задать новый вопрос, то не дописывайте его в существующую тему, а создайте новую в корневом разделе "Помогите решить/разобраться (М)".

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

Не ищите на этом форуме халяву, правила запрещают участникам публиковать готовые решения стандартных учебных задач. Автор вопроса обязан привести свои попытки решения и указать конкретные затруднения.

Обязательно просмотрите тему Правила данного раздела, иначе Ваша тема может быть удалена или перемещена в Карантин, а Вы так и не узнаете, почему.



Начать новую тему Ответить на тему
 
 Вопрос про алгоритм CRC32
Сообщение07.01.2011, 15:38 


07/01/11
4
Пусть нам даны две строки:
Код:
a = "hello";
b = "world";


Посчитаем хеши этих строк по алгоритму CRC32:
Код:
hash_a = CRC32(a);
hash_b = CRC32(b);


Вопрос: возможно ли найти хеш строки, полученной с помощью конкатенации двух строк a и b (т. е. c="helloworld"),
зная только хеши исходных строк hash_a и hash_b?

 Профиль  
                  
 
 Re: Вопрос про алгоритм CRC32
Сообщение07.01.2011, 17:37 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Нет:
Код:
Prelude Data.Digest.CRC32 Data.Word Data.ByteString.UTF8> crc32 $ fromString "Maria has nine red beds."
248210933
Prelude Data.Digest.CRC32 Data.Word Data.ByteString.UTF8> crc32 $ fromString "Joe has fourteen magenta things."
93832682
Prelude Data.Digest.CRC32 Data.Word Data.ByteString.UTF8> crc32 $ fromString "Lars has thirteen black balls."
93832682
Prelude Data.Digest.CRC32 Data.Word Data.ByteString.UTF8> crc32 $ fromString "Maria has nine red beds.Joe has fourteen magenta things."
1783037554
Prelude Data.Digest.CRC32 Data.Word Data.ByteString.UTF8> crc32 $ fromString "Maria has nine red beds.Lars has thirteen black balls."
571588660

 Профиль  
                  
 
 Re: Вопрос про алгоритм CRC32
Сообщение07.01.2011, 18:58 
Заслуженный участник


04/05/09
4589
Надо ещё знать длину первой строки.

 Профиль  
                  
 
 Re: Вопрос про алгоритм CRC32
Сообщение07.01.2011, 20:57 


07/01/11
4
venco в сообщении #396343 писал(а):
Надо ещё знать длину первой строки.

Да, забыл сказать длины сторок известны.
Подскажите как это сделать?

 Профиль  
                  
 
 Re: Вопрос про алгоритм CRC32
Сообщение08.01.2011, 20:34 


07/01/11
4
up :D

 Профиль  
                  
 
 Re: Вопрос про алгоритм CRC32
Сообщение16.01.2011, 19:25 
Заслуженный участник


26/07/09
1559
Алматы
Прошу прощения за поднятие старой темы, просто появилась парочка глупых мыслишек. А нельзя ли попробовать ответить на ворос топикстартера используя определение CRC как остатка от деления одного полинома-сообщения на другой полином? Нет, я не предлагаю привлекать китайскую теорему об остатках или ещё что-нибудь в том же духе. Моя идея гораздо проще.

Если я не ошибаюсь, CRC32 для некоторого сообщения $m$ можно посчитать как $\mathrm{CRC}(m)=m(x)\cdot x^{32}\bmod n(x)$, $\deg n=32$. Тогда для конкатенации двух строк $a$ и $b$, CRC32 будет вычисляться как-то так: $\mathrm{CRC}(a\circ b)=\big(a(x)\cdot x^{\deg b}+b(x)\big)\bmod n(x)$, то есть мы предварительно сдвигаем коэффициенты первого полинома, чтобы после сложения там поместилась вторая строка ($\deg b$ есть длина второй строки).

Вот я тут наткнулся на одну крайне разжеванную тему Арифметика остатков и взял оттуда две формулки, которые решил применить к выражению для CRC конкатенации так, чтобы оно вычислялось из известных $\mathrm{CRC}(a)$ и $\mathrm{CRC}(b)$. Неуверен в безошибочности выкладок (другие участники форума подобные вещи, наверное, в уме просто так проделывают), но конечный результат у меня получился таким: $$\begin{align}\mathrm{CRC}(a\circ b)=\bigg(\Big(\big(a(x)&\cdot x^{32}\bmod n(x)\big)\big(x^{\deg b}\bmod n(x)\big)\Big)\bmod n(x)+\\&+b(x)\cdot x^{32}\bmod n(x)\bigg)\bmod n(x)=\\&=\bigg(\Big(\mathrm{CRC}(a)\big(x^{\deg b}\bmod n(x)\big)\Big)\bmod n(x)+\mathrm{CRC}(b)\bigg)\bmod n(x).\end{align}$$

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

P.S.: Исходная задача точно решаема если одна из строк известна (лучше первая).

 Профиль  
                  
 
 Re: Вопрос про алгоритм CRC32
Сообщение25.10.2011, 00:11 
Модератор
Аватара пользователя


11/01/06
5710
Circiter
Верно. Задача вполне решаема, если известна длина строки $b$.

Для простосты можно считать, что строка $b$ состоит из нулей, а ее значение CRC32 получается с помощью "подходящей" xor-константы, накладываемой в конце вычислений. Сначала вычисляем эту константу. Затем берем CRC32 от строки $a$ и преобразуем ее в соответствии с нулевыми символами строки $b$ (в известном количестве, равном длине $b$), ну и ксорим с вычисленной ранее константой.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group