Просторово-часова домовленість

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Просторово-часова домовленість (англ. space–time, time–memory tradeoff, TMTO) — ситуація в інформатиці, коли можна зменшити використання пам'яті ціною вповільнення швидкості виконання програми (і, навпаки, можна зменшити час обчислення за рахунок збільшення використання більшого об'єму пам'яті).

Приклади використання[ред.ред. код]

Таблиці пошуку[ред.ред. код]

Багато задач пошуку, таких як задача пакування рюкзака, задача про дискретний логарифм або задача обернення односторонньої функції, що розв'язуються, по суті, перебором, одночасно дозволяють використання так званих таблиць пошуку[1]. Ідея така: замість того, щоб, без використання додаткової пам'яті, перебрати всі можливі значення, зробити певні попередні обчислення і зберегти їх у таблиці, яку потім використовувати під час розв'язання задач.

Стиснуті замість нестиснутих даних[ред.ред. код]

Просторово-часову домовленість можна застосувати для проблем зберігання даних. Якщо дані зберігаються нестиснутими, це потребує більше простору, але менше часу порівняно зі стиснутим варіантом (через те, що стиснення зберігає простір, що займають дані, але потребує час для виконання алгоритму стиснення даних). Залежно від конкретного прикладу використання можна використати підхожий спосіб.

Повторне промальовування замість збереження зображень[ред.ред. код]

Збереження лише LaTeX-сирців і відтворення зображення кожний раз при запиті сторінки було б виграшем пам'яті за ціну збільшення часу обробки. Відтворення зображення при зміні сторінки і збереження його було б виграшем в швидкості обробки запитів за ціну пам'яті.

Менший код замість розмотування циклу[ред.ред. код]

Більший розмір кода може призвести до швидшого виконання програми. коли застосовується розмотування циклу. Ця техніка для кожної ітерації циклу робить код довшим, але заощаджує час потрібний для стрибку назад на початок циклу наприкінці кожної ітерації.

Криптографія[ред.ред. код]

В цьому розділі розглянемо класичний приклад використання підходу просторово-часової домовленості в криптографії — застосування таблиць пошуку в розв'язанні криптографічної проблеми обернення криптографічної геш-функції.

Криптоаналітичний перебір вимагає значних обчислювальних затрат. У випадку, якщо потрібне багаторазове злам криптосистеми, логічно було б заздалегідь виконати вичерпний перебір і зберігати обчислені значення в пам'яті. Тоді, в подальшому, можна здійснювати перебір практично миттєво.[2] Втім, цей метод не застосовується в дійсності через надвеликі затрати пам'яті.

Метод, запропонований Геллманом[ред.ред. код]

1980, Мартін Геллман запропонував компромісний підхід до проблеми криптоаналізу, що дозволяв аналіз криптосистеми, яка мала N ключів, за N^{2/3} операцій, із затратами по пам'яті також N^{2/3}[1]. Це стає можливим по тому, як одноразово буде виконане попереднє отримання можливих ключів, яке потребує O(n) операцій.

Ідея полягає в наступному.

Нехай в алгоритмі шифрування використовується одностороння функція ~S_{k_i}(P). За властивостями односторонньої функції отримання використаного ключа ~k_i по відомій парі ~P_0,C_0 — складна задача, в той час як обчислення функції від певного відкритого тектсу — проста.

Криптоаналітик застосовує атаку на основі підібраного відкритого тексту і отримує один шифротекст ~C_0, відповідний відкритому тексту ~P_0:

~C_0 = S_k(P_0)

Задача — знайти ключ ~k, за допомогою якого здійснювалось шифрування. Для цього треба знайти спосіб обчислення можливих ключів. Введемо функцію редукції ~R(C), яка ставить у відповідність шифротексту ~C_i деякий ключ k_{i+1} (довжина ключа, як правило, менша довжини шифртексту, звідси й термін):

~R(C_i) = k_{i+1}

Обчислення функції редукції — проста операція. У випадку DES це редукція від 64 до 56 біт, така як відкидання останніх 8 біт шифротексту.

Функція ~f = R[S_{k_i}(P_0)] ставить у відповідність ключу ~k_i інший ключ ~k_{i+1}. Якщо алгоритм шифрування безпечний, то ~f також одностороння функція. Тепер ми можемо отримати як завгодно довгий ланцюжок ключів:

~k_i \stackrel{f}{\longrightarrow} k_{i+1} \stackrel{f}{\longrightarrow} k_{i+2} \stackrel{f}{\longrightarrow} ...

Для того, щоб побудувати таблицю пошуку, криптоаналітик вибирає ~m випадкових елементів SP_1, SP_2, ..., SP_m із простору ключів \{1, 2, ..., N\}. З кожного ключа за описаним вище способом отримуємо ланцюжок ключів довжини ~t. Останній елемент i-го ланцюжку позначаємо як EP_i, тоді очевидно EP_i = f^t(SP_i). В пам'ять записуємо лише початковий і кінцевий ключі кожного ланцюжка \{SP_i, EP_i\} (пари сортуємо за кінцевим ключем). Таким чином, готова таблиця займає O(m) комірок пам'яті.


\begin{bmatrix}
SP_1 & = X_{10} \overset{\underset{\mathrm{f}}{}}{\to} X_{11} \overset{\underset{\mathrm{f}}{}}{\to} X_{12} \overset{\underset{\mathrm{f}}{}}{\to} \cdots \overset{\underset{\mathrm{f}}{}}{\to} X_{1t} = & EP_1 \\ 
SP_2 & = X_{20} \overset{\underset{\mathrm{f}}{}}{\to} X_{21} \overset{\underset{\mathrm{f}}{}}{\to} X_{22} \overset{\underset{\mathrm{f}}{}}{\to} \cdots \overset{\underset{\mathrm{f}}{}}{\to} X_{2t} = & EP_2 \\ 
\vdots & & \vdots \\ 
SP_m & = X_{m0} \overset{\underset{\mathrm{f}}{}}{\to} X_{m1} \overset{\underset{\mathrm{f}}{}}{\to} X_{m2} \overset{\underset{\mathrm{f}}{}}{\to} \cdots \overset{\underset{\mathrm{f}}{}}{\to} X_{mt} = & EP_m \\ 
\end{bmatrix}

Утворення таблиці вимагає ~mt операцій.

По отриманні шифротексту кріптоаналітик може застосувати функцію редукції для отримання Y_1=R(C_0)=f(K), тоді він може перевірити чи присутній Y_1 серед SP. \{SP_i, EP_i\} зберігаються відсортованими, отже ця операція займе log(m), а з використанням геш-таблиці складність можна звести майже до константного часу.

Якщо Y_1 не серед EP, тоді K не в стовпчику X_{it}. Якщо Y_1=EP_i, тоді K=X_{i,t-1} або EP має більш як один першовзір. Ми називатимемо таку ситуацію хибною тривогою (англ. false alarm). Якщо Y_1 = EP_i, тоді криптоаналітик обчислює X_{i,t-1} і перевіряє чи це ключ, наприклад, через обчислення чи дешифрує він C_0 в P_0. Всі проміжні стовпчики в таблиці були відкинуті для збереження пам'яті, тому криптоаналітик мусить почати в SP і переобчислити X_{i,1}, X_{i,2}, \cdots доки він не досягне X_{i,t-1}.

Якщо Y_1 не кінцева точка або сталась хибна тривога, криптоаналітик обчислює Y_2=f(Y_1) і перевіряє на кінцевість її. Якщо це не так, ключ не в t-2 стовпчику, якщо ж так, тоді криптоаналітик перевіряє чи ключ X_{i,t-2}. І так далі до 0 стовпчика.

Віднайдення ключа таким чином займає ~O(t\cdot log(m)); нехтуючи логаріфмічним множником, маємо ~O(t). При цьому затрати пам'яті на збереження таблиці становлять ~O(m).

Якщо всі елементи в таблиці різні, тоді ймовірність успіху становить P(S) = mt/N. Але така ситуація не реалістична через можливість злиття ланцюжків. Якщо f є випадковою функцією, що відображає множину \{1, 2, \cdots, N\} в себе, і якщо ключ K вибрали рівномірно випадково з цієї множини (втім якісна криптосистема повинна бути псевдовипадковим генератором), тоді ймовірність успіху можна обмежити знизу як

~P(S) \geq \frac{1}{N} \sum\limits_{i=1}^m \sum \limits_{j=0}^{t-1} (1 - \frac{it}{N})^{j+1}

Оцінка цього виразу призводить до наступного висліду: добуток mt^2 не варто брати більшим від N інакше, швидко падає нижня межа ймовірності успіху.

За mt^2 = N отримаємо

P(S) \geq 0.8 \frac{mt}{N} = \frac{1}{t}
Ланцюжки обчислені із різними функціями редукції можуть перетинатись, але не зіллються

Криптоаналітик тепер може утворити не одну, а ~l таблиць, в кожній він може вибрати свою функцію редукції (що дозволить уникнути злиття ланцюжків з різних таблиць). При цьому межа успішності розшифрування становитиме:

~P(S,l) \geq 1 - [\frac{1}{N} \sum\limits_{i=1}^m \sum \limits_{j=0}^{t-1} (1 - \frac{it}{N})^{j+1}]^l

Очікувана кількість хибних тривог на таблицю обмежена

E(F) \le mt(t+ 1)/2N

Вибрав l=t, криптоаналітик отримає затрати mt по пам'яти і t^2 по часу (у кожній таблиці використана своя функція редукції, тому при розшифруванні необхідно отримувати свій ланцюжок для кожної таблиці) при ймовірності успіху близької до одиниці. Взяв t=m=N^{1/3}, отримаємо потрібні затрати N^{2/3} по часу і пам'яті.

Примітки[ред.ред. код]

  1. а б Martin E. Hellman. A Cryptanalytic Time-Memory Trade-Off. // Transactions on Information Theory. — July 1980. — № 4.
  2. Philippe Oechslin. Making a Faster Cryptanalytic Time-Memory Trade-Off. // ISBN 3-540-40674-3.

Посилання[ред.ред. код]