По мотивам http://habrahabr.ru/post/183514.
Собственно, мне стало интересно, как же можно добиться сохранения целостности маркера, если «пират» может получить несколько копий и, сравнив их, значительно исказить зашифрованную информацию. Я разработал несколько примитивных схем, но, боюсь, простое чтение составленных мною описаний — не слишком весёлое занятие, так что предлагаю всем, кого тоже интересует эта тема, поучаствовать, публикуя в комментариях свои способы добавления меток на страницы, допустим, учебника истории, и развеивая идеи других хабралюдей.
Свои наработки и способы их обхода я опубликую в качестве примеров.
Если вы хотите присоединиться, добро пожаловать под кат ;)
Итак, в качестве затравки, несколько моих идей.
Нолик — слово не изменено, единица обозначает замещение синониом.
1. Изменять в каждой книге одно уникальное слово на синоним.
Исходный текст — 000000
получаем:
000001
000010
000100
001000
010000
100000
Очевидно, 000000 мы продавать не будем, так-как не сможем доказать, что текст украли именно у нас.
Итак, пират покупает копии
001000
100000.
Он видит, что 2 слова различаются:
х0х000,
причём комбинации 001000 и 100000 он использовать не может. У него остаётся 2 варианта:
000000
101000
И оба они уже указывают на других людей. Пират победил.
2. Изменять в i-той книге i слов на синонимы.
Нет, серьёзно, может, тираж всего из 100 книг.
Исходный текст — 000000
получаем:
000001
000011
000111
001111
011111
111111
Пират покупает
000011
011111.
Пират сравнивает копии:
0ххх11
Понимает, что что-то тут не так. И ставит рандомно:
001111.
И за решётку садится невинный человек. Пират победил...
Но изрядно обедневший правообладатель не отчаивается и вводит третий вариант:
3. Модифицированные числа Фибоначчи.
Наверное, все знают эту последовательность: 0, 1, 1, 2, 3, 5, 8, 13…
F[i] = F[i-1] + F[i-2]. (извините за такое обозначение индексов)
Но я слегка модифицирую алгоритм:
F[i] = F[i-1] + F[i-2] + 1.
Тогда ряд будет выглядеть так:
0, 1, 2, 4, 7, 12, 20…
Очевидно, что F[i] — F[i-1] = 1.
Соответственно, для i, j, k > 2 никакое вычитание F[i] — F[j] не даст F[k]. (строго не выводил, проверьте меня, если не лень).
Записываем замены слева, причём количество замен — очередное число:
Исходный текст: 000000000000000.
Да, автор решил добавить воды…
Получаем:
111100000000000
111111100000000
111111111111000
и так далее.
Пират покупает
111100000000000
111111111111000,
вычитает (он не знает о новом способе):
1111хххххххх000
Заполняет случайными словами:
111110011010000.
Правообладатель получает, cчитает оставшиеся изменения. Их 8.
Теперь смотрим. Если бы пирату достался файл с F = 7 и файл с F < 7, одним вычитанием он смог бы получить число оставшихся совпадений от 3 до 5. Если с Fmax = 20, то от 9 до 20. Если же Fmax = 12, то от 6 до 10. Есть, конечно, спорные моменты насчёт граничных значений, но мы явно видим, что число замен невалидно, следственно, текст был изменён. А совпадать значения могут только в том случае, если пират почему-то опубликовал неизменный файл… Соответственно, пират — покупатель книги с 12 изменениями.
Пират сел далеко и надолго, а мы узнали, что новая книга была издана специально для его поимки, ибо кому же она нужна, со столькими-то заменами =)
Я свои наработки выложил. Не спорю, они совершенно неэффективны, если у нарушителя есть более 2 книг, и могут содержать полный бред.
Если у вас есть какие-либо идеи, пишите в комментариях. Истина познаётся в споре =)
Автор: IDOL1234