Лавинный эффект (англ. Avalanche effect) — понятие в криптографии, обычно применяемое к блочным шифрам и криптографическим хеш-функциям. Важное криптографическое свойство для шифрования, которое означает, что изменение значения малого количества битов во входном тексте или в ключе ведет к «лавинному» изменению значений выходных битов шифротекста. Другими словами, это зависимость всех выходных битов от каждого входного бита.
 Термин «лавинный эффект» впервые введён Фейстелем в статье Cryptography and Computer Privacy, опубликованной в журнале Scientific American в мае 1973 года, хотя концептуальное понятие использовалось ещё Шенноном.
 В алгоритмах с несколькими проходами лавинный эффект обычно достигается благодаря тому, что на каждом проходе изменение одного входного бита ведёт к изменениям нескольких выходных.
 Если криптографический алгоритм не обладает лавинным эффектом в достаточной степени, криптоаналитик может сделать предположение о входной информации, основываясь на выходной информации. Таким образом, достижение лавинного эффекта является важной целью при разработке криптографического алгоритма.
 Для того, чтобы проверить наличие хорошего лавинного эффекта в конкретном алгоритме, используется несколько критериев:
 Криптографический алгоритм удовлетворяет лавинному критерию, если при изменении одного бита входной последовательности изменяется в среднем половина выходных битов.
 Формально для функции может быть дано такое определение:
 Функция 
  
    
      
        f
        :
        {
        0
        ,
        1
        
          }
          
            n
          
        
        →
        {
        0
        ,
        1
        
          }
          
            n
          
        
      
    
    {\displaystyle f:\{0,1\}^{n}\to \{0,1\}^{n}}
  
 удовлетворяет лавинному критерию, если изменение одного бита на входе вызывает изменение в среднем половины выходных битов.
 Определение строго лавинного критерия (СЛК) впервые было дано C. Таваресом и А. Вебстером в работе по исследованию и проектированию S-блоков.
 Булеву функцию можно рассматривать как часть структуры S-блоков. Дизайн S-блоков на основе булевых функций, удовлетворяющих СЛК, был изучен в работах Адамса и C. Тавареса, Kwangio Kim. Начиная с 1990 года СЛК изучается в контексте булевых функций.
 Булева функция 
  
    
      
        f
        (
        x
        )
      
    
    {\displaystyle f(x)}
  
, где 
  
    
      
        x
      
    
    {\displaystyle x}
  
 — вектор из 
  
    
      
        n
      
    
    {\displaystyle n}
  
 переменных, удовлетворяет СЛК, если при изменении одного из 
  
    
      
        n
      
    
    {\displaystyle n}
  
 входных битов выходной бит меняется с вероятностью ровно 
  
    
      
        1
        
          /
        
        2
      
    
    {\displaystyle 1/2}
  
.
 Пример булевой функции трёх переменных, удовлетворяющей СЛК:
 Говорят, что криптографический алгоритм удовлетворяет строгому лавинному критерию, если при изменении одного бита входной последовательности каждый бит выходной последовательности изменяется с вероятностью одна вторая.
 C. Таварес и А. Вебстер в своей работе по изучению и описанию S-блоков определили ещё один критерий для булевой функции, называемый критерий независимости битов, согласно которому при изменении одного входного бита любые два выходные бита меняются независимо друг от друга.
 Функция 
  
    
      
        f
        :
        {
        0
        ,
        1
        
          }
          
            n
          
        
        →
        {
        0
        ,
        1
        
          }
          
            n
          
        
      
    
    {\displaystyle f:\{0,1\}^{n}\to \{0,1\}^{n}}
  
 удовлетворяет критерию независимости битов, если для любых 
  
    
      
        i
        ,
        j
        ,
        k
        ∈
        {
        1
        ,
        2
        ,
        .
        .
        .
        ,
        n
        }
      
    
    {\displaystyle i,j,k\in \{1,2,...,n\}}
  
, где 
  
    
      
        j
        ≠
        k
      
    
    {\displaystyle j\neq k}
  
, инвертирование бита 
  
    
      
        i
      
    
    {\displaystyle i}
  
 на входе вызывает изменения битов 
  
    
      
        j
      
    
    {\displaystyle j}
  
 и 
  
    
      
        k
      
    
    {\displaystyle k}
  
, причём эти изменения независимы.
Для измерения независимости двух выходных битов вводят коэффициент корреляции 
  
    
      
        B
        I
        C
        (
        
          a
          
            j
          
        
        ,
        
          a
          
            k
          
        
        )
      
    
    {\displaystyle BIC(a_{j},a_{k})}
  
 между 
  
    
      
        j
      
    
    {\displaystyle j}
  
-й и 
  
    
      
        k
      
    
    {\displaystyle k}
  
-й компонентой выходного вектора для изменённого выходного вектора, который называется лавинным вектором и обозначается как 
  
    
      
        
          A
          
            e
            i
          
        
      
    
    {\displaystyle A^{ei}}
  
.
 Параметр 
  
    
      
        B
        I
        C
      
    
    {\displaystyle BIC}
  
 независимости битов для функции 
  
    
      
        f
      
    
    {\displaystyle f}
  
 находится как:
 Этот параметр демонстрирует насколько функция 
  
    
      
        f
      
    
    {\displaystyle f}
  
 удовлетворяет критерию независимости битов. Он принимает значения в промежутке 
  
    
      
        [
        0
        ,
        1
        ]
      
    
    {\displaystyle [0,1]}
  
, и в наилучшем случае равен 0 и можно говорить о независимости, в наихудшем 1, когда имеется зависимость.
 Говорят, что криптографический алгоритм удовлетворяет критерию независимости битов, если при изменении любого входного бита любые два выходных бита изменяются независимо.
 Выделяют также гарантированный лавинный эффект порядка 
  
    
      
        γ
      
    
    {\displaystyle \gamma }
  
.
 Критерий гарантированного лавинного эффекта (англ. GAC – guaranteed avalanche criterion) порядка 
  
    
      
        γ
      
    
    {\displaystyle \gamma }
  
 выполняется, если при изменении одного бита на входе узла замен на выходе меняются как минимум 
  
    
      
        γ
      
    
    {\displaystyle \gamma }
  
 выходных битов. Выполнение GAC порядка 
  
    
      
        γ
      
    
    {\displaystyle \gamma }
  
 в диапазоне от 2 до 5 для узлов замен обеспечивает любому шифру очень высокий лавинный эффект вследствие распространения изменений в битах при прохождении данных по раундам шифрования в схеме Фейстеля.
 Шеннон ввёл понятия конфузии и диффузии в качестве методов, усложняющих статистический криптоанализ. Согласно Шеннону:
 Диффузия — метод, при котором избыточность в статистике входных данных «распределяется» по всей структуре выходных данных. При этом большие объёмы выходных данных требуются для статистического анализа, скрывается структура исходного текста. Реализуется при помощи P-блоков, иными словами, каждый бит незашифрованного текста должен влиять на каждый бит зашифрованного текста. Распространение одного незашифрованного бита на большое количество зашифрованных битов скрывает статистическую структуру незашифрованного текста. Определить, как статистические характеристики зашифрованного текста зависят от статистических характеристик незашифрованного текста, должно быть непросто.
 Конфузия — метод, при котором зависимость ключа и выходных данных делается как можно более сложной, в частности, нелинейной. При этом становится сложнее делать заключения о ключе по выходным данным, а также об исходных данных, если известна часть ключа. Реализуется при помощи S-блоков.
 Лавинный эффект является следствием хорошей конфузии и диффузии[нет в источнике][источник не указан 2551 день].
 В DES лавинный эффект носит характер строгого лавинного эффекта и проявляется уже на четвёртом-пятом раунде, оценочно для каждой операции (считая, что к началу раунда влияние одного вначале выбранного бита распространилось на 
  
    
      
        
          R
          
            0
          
        
      
    
    {\displaystyle R_{0}}
  
 битов в правой части и 
  
    
      
        
          L
          
            0
          
        
      
    
    {\displaystyle L_{0}}
  
 — в левой):
 После расширения: 
  
    
      
        
          R
          
            1
          
        
        =
        min
        (
        1
        
          ,
        
        5
        ⋅
        
          R
          
            0
          
        
        ,
        32
        )
        .
      
    
    {\displaystyle R_{1}=\min(1{,}5\cdot R_{0},32).}
  

 Предполагая случайные попадания в 8 S-блоков, согласно задаче о размещении, биты попадут в:

  
    
      
        
          S
          
            2
          
        
        =
        8
        ⋅
        
          (
          
            1
            −
            (
            1
            −
            
              
                
                  1
                  8
                
              
            
            
              )
              
                
                  R
                  
                    1
                  
                
              
            
          
          )
        
        ≈
        8
        ⋅
        
          (
          
            1
            −
            
              e
              
                −
                
                  
                    
                      R
                      
                        1
                      
                    
                    8
                  
                
              
            
          
          )
        
      
    
    {\displaystyle S_{2}=8\cdot \left(1-(1-{\tfrac {1}{8}})^{R_{1}}\right)\approx 8\cdot \left(1-e^{-{\frac {R_{1}}{8}}}\right)}
  
 S-блоков.
 Одно из требований NSA к S-блокам заключалось в том, чтобы изменение каждого бита входа изменяло 2 бита выхода. Мы предположим, что каждый бит входа S-блока влияет на все 4 бита выхода. Зависимыми станут:

  
    
      
        
          S
          
            2
          
        
        =
        4
        ⋅
        8
        ⋅
        
          (
          
            1
            −
            (
            1
            −
            
              
                
                  1
                  8
                
              
            
            
              )
              
                
                  R
                  
                    1
                  
                
              
            
          
          )
        
        ≈
        4
        ⋅
        8
        ⋅
        
          (
          
            1
            −
            
              e
              
                −
                
                  
                    
                      R
                      
                        1
                      
                    
                    8
                  
                
              
            
          
          )
        
      
    
    {\displaystyle S_{2}=4\cdot 8\cdot \left(1-(1-{\tfrac {1}{8}})^{R_{1}}\right)\approx 4\cdot 8\cdot \left(1-e^{-{\frac {R_{1}}{8}}}\right)}
  
 битов.
 После битового сложения левой 
  
    
      
        L
      
    
    {\displaystyle L}
  
 и правой 
  
    
      
        R
      
    
    {\displaystyle R}
  
 частей[источник не указан 2633 дня]: 
  
    
      
        
          R
          
            3
          
        
        ≈
        
          R
          
            2
          
        
        +
        
          L
          
            0
          
        
        −
        
          
            
              
                R
                
                  2
                
              
              ⋅
              
                L
                
                  0
                
              
            
            32
          
        
        .
      
    
    {\displaystyle R_{3}\approx R_{2}+L_{0}-{\frac {R_{2}\cdot L_{0}}{32}}.}
  

 Для достижения максимального лавинного эффекта требуется аккуратно выбрать расширение, S-блоки, а также перестановку в функции 
  
    
      
        F
      
    
    {\displaystyle F}
  
[источник не указан 2633 дня].
 Следующая таблица показывает количество изменённых на каждом раунде выходных битов при условии изменения одного бита исходного текста и одного бита ключа.

 В AES лавинный эффект появляется следующим образом: в первом раунде операция MixColumns() распространяет изменения одного байта на все 4 байта колонки, после чего во втором раунде применение операций ShiftRows() и MixColumns() распространяет изменения на всю таблицу. Таким образом, полная диффузия достигается уже на втором раунде. Конфузия обеспечивается операцией SubBytes().
 В таблице приведены численные значения лавинного эффекта для S-блоков в AES.
В первом случае байт «11» (в шестнадцатеричной записи) меняется на «10», во втором случае байт «11» меняется на «12», в третьем — «00» на «10». Соответственно посчитан коэффициент лавинного эффекта для каждого случая.
По этим данным мы можем наглядно видеть, что зашифрованный выходной текст совсем не простой, при довольно простом входном тексте.
А коэффициент лавинного эффекта близок к 0,5, что означает хорошее выполнение лавинного критерия.
 Лавинный эффект по входу обеспечивается (4 на 4) S-блоками и циклическим сдвигом влево на 
  
    
      
        11
        ≠
        0
        
        mod
        
        
        4
      
    
    {\displaystyle 11\neq 0\mod 4}
  

 Из таблицы видно, что на каждом раунде число независимых битов увеличивается в среднем в 4 раза в результате сдвига и попадания выхода S-блока предыдущего раунда
в 2 S-блока следующего раунда. Показано распространение зависимых битов в группах по 4 бита в левой и правой частях без учета сложения с ключом раунда.
Предполагается, что каждый бит на входе S-блока влияет на все биты выхода. Число раундов для достижения полного лавинного эффекта без учета сложения с ключом — 8.
Экспериментальная проверка для S-блоков, используемых Центробанком РФ, показывает, что требуется 8 раундов[источник не указан 2633 дня].
 Для криптостойкости ключевыми требованиями к операциям преобразования битов в раунде шифрования являются нелинейность, то есть невозможность подобрать линейную функцию, хорошо аппроксимирующую данное преобразование, и лавинный эффект — выполнение этих требований затрудняет проведение линейного и дифференциального криптоанализа шифра соответственно. Если рассмотреть с этих позиций операции преобразования в раунде шифрования по ГОСТ 28147-89, то легко убедиться в том, что криптостойкость обеспечивают лишь операции сложения с ключом и выполнения замены битов по таблице, так как операции побитового сдвига и суммирования по модулю 2 являются линейными и не обладают лавинным эффектом. Из этого можно сделать вывод, что определяющим фактором надежности шифрования по ГОСТ 28147-89 является надлежащим образом выбранная ключевая информация (ключ и таблица замен). В случае зашифрования данных с нулевым ключом и тривиальной таблицей замен, все узлы которой содержат числа от 0 до 15 в порядке возрастания, найти по известному шифртексту открытый текст достаточно просто при помощи как линейного, так и дифференциального криптоанализа.
 Как показано, операция сложения данных с подключом не может обеспечить достаточного лавинного эффекта, поскольку при изменении одного бита на входе этой процедуры лишь один бит на выходе меняется с вероятностью 0,5, остальные биты меняются с вероятностью существенно меньшей. Это говорит о том, что для обеспечения криптостойкости шифрования недостаточно только обеспечения достаточного качества ключа — необходимо также использовать сильные таблицы замен с высокими показателями нелинейности и лавинного эффекта.
 В примерах демонстрируется изменение хэша при изменении одного бита во входной последовательности.
 SHA-1:
 MD5:
 В примерах демонстрируется изменение шифрованного сообщения при изменении одного бита во входной последовательности или в ключе.
 AES:
 RC4:
 Шифр Цезаря не реализует лавинного эффекта: