Криптосистема Крамера–Шоупа (англ. Cramer–Shoup system) — алгоритм шифрования с открытым ключом. Первый алгоритм, доказавший свою устойчивость к атакам на основе адаптивно подобранного шифротекста
. Разработан Рональдом Крамером и Виктором Шоупом в 1998 году. Безопасность алгоритма основана предположении Диффи–Хеллмана о различении.  Является расширением схемы Эль-Гамаля, но в отличие от схемы Эль-Гамаля данный алгоритм неподатлив  (англ.) (рус. (взломщик не может подменить шифротекст на другой шифротекст, который бы расшифровывался в текст, связанный с исходным, т.е. являющийся некоторой функцией от него). Эта устойчивость достигается за счет использования универсальной однонаправленной хеш-функции и дополнительных вычислений, что приводит к получению зашифрованного текста, который в два раза больше, чем в схеме Эль-Гамаля.
 Криптографическая атака, при которой криптоаналитик собирает информацию о шифре путем подбора зашифрованного текста и получения его расшифровки при неизвестном ключе. Криптоаналитик может воспользоваться устройством расшифрования несколько раз для получения шифротекста в расшифрованном виде. Используя полученные данные, он может попытаться восстановить секретный ключ для расшифровки. Атака на основе подобранного шифротекста может быть адаптивной и неадаптивной.
 Было хорошо известно, что многие широко используемые криптосистемы были уязвимы для такой атаки, и в течение многих лет считалось, что атака нецелесообразна и представляет лишь теоретический интерес. Все начало меняться в конце 1990-х годов, особенно когда Даниэль Блайхенбахер продемонстрировал на практике атаку на основе подобранного шифротекста на серверы SSL с использованием формы шифрования RSA.
 При неадаптивной атаке криптоаналитик не использует результаты предыдущих расшифровок, то есть шифротексты подбираются заранее. Такие атаки называют атаками в обеденное время (lunchtime или CCA1).
 В случае адаптивной атаки криптоаналитик адаптивно подбирает шифротекст, который зависит от результатов предыдущих расшифровок (CCA2).
 Устойчивость к адаптивной атаке можно расммотреть на примере игры:
 Существует несколько эквивалентных формулировок задачи Диффи-Хеллмана о различении. Та, которую мы будем использовать, выглядит следующим образом.
 Пусть 
  
    
      
        G
      
    
    {\displaystyle G}
  
— группа порядка 
  
    
      
        q
      
    
    {\displaystyle q}
  
, где 
  
    
      
        q
      
    
    {\displaystyle q}
  
 — большое простое число. Также 
  
    
      
        
          
            Z
          
          
            q
          
        
      
    
    {\displaystyle {Z}_{q}}
  
 — 
  
    
      
        {
        0
        ,
        1
        ,
        …
        ,
        q
        −
        1
        }
      
    
    {\displaystyle \{0,1,\dots ,q-1\}}
  
. И имеется два распределения:
 Алгоритмом, который решает задачу Диффи-Хеллмана, называется такой вероятностный алгоритм 
  
    
      
        A
      
    
    {\displaystyle A}
  
, который может эффективно различить перечисленные два распределения. То есть алгоритм, принимающий на вход одно из двух рапределений, должен выдать 0 или 1, а также 
  
    
      
        P
        (
        A
        (
        x
        )
        =
        1
        
          |
        
        x
        ∈
        R
        )
        −
        P
        (
        A
        (
        x
        )
        =
        1
        
          |
        
        x
        ∈
        D
        )
      
    
    {\displaystyle P(A(x)=1|x\in R)-P(A(x)=1|x\in D)}
  
 стремится к 0.
 Задача Диффи-Хеллмана о различении трудна, если такого полиномиального вероятностного алгоритма не существует.
 Пусть у нас есть группа 
  
    
      
        G
      
    
    {\displaystyle G}
  
 порядка 
  
    
      
        q
      
    
    {\displaystyle q}
  
, где 
  
    
      
        q
      
    
    {\displaystyle q}
  
 — большое простое число. Сообщения — это элементы 
  
    
      
        ∈
        G
      
    
    {\displaystyle \in G}
  
. Также мы используем универсальное семейство односторонних хеш-функций, которое отображает длинные битовые строчки в элементы 
  
    
      
        
          
            Z
          
          
            q
          
        
      
    
    {\displaystyle {Z}_{q}}
  
, где 
  
    
      
        
          
            Z
          
          
            q
          
        
      
    
    {\displaystyle {Z}_{q}}
  
 — 
  
    
      
        {
        0
        ,
        1
        ,
        …
        ,
        q
        −
        1
        }
      
    
    {\displaystyle \{0,1,\dots ,q-1\}}
  
.
 Алгоритм генерации ключей работает следующим образом:
 Дано сообщение 
  
    
      
        m
        ∈
        G
      
    
    {\displaystyle m\in G}
  
. Алгоритм шифрования работает следующим образом
 Получив зашифрованный текст 
  
    
      
        (
        
          u
          
            1
          
        
        ,
        
          u
          
            2
          
        
        ,
        e
        ,
        v
        )
      
    
    {\displaystyle (u_{1},u_{2},e,v)}
  
 и используя закрытый ключ 
  
    
      
        (
        
          x
          
            1
          
        
        ,
        
          x
          
            2
          
        
        ,
        
          y
          
            1
          
        
        ,
        
          y
          
            2
          
        
        ,
        z
        )
      
    
    {\displaystyle (x_{1},x_{2},y_{1},y_{2},z)}
  
:
 Проверим корректность шифровальной схемы (расшифровка зашифрованного сообщения выдает это самое сообщение). Учитывая, что 
  
    
      
        
          
            u
          
          
            1
          
        
        =
        
          
            g
          
          
            1
          
          
            r
          
        
      
    
    {\displaystyle {u}_{1}={g}_{1}^{r}}
  
 и 
  
    
      
        
          
            u
          
          
            2
          
        
        =
        
          
            g
          
          
            2
          
          
            r
          
        
      
    
    {\displaystyle {u}_{2}={g}_{2}^{r}}
  
, имеем 
  
    
      
        
          
            u
          
          
            1
          
          
            
              x
              
                1
              
            
          
        
        
          u
          
            2
          
          
            
              x
              
                2
              
            
          
        
        =
        
          
            g
          
          
            1
          
          
            
              
                x
              
              
                1
              
            
            
              r
            
          
        
        
          
            g
          
          
            2
          
          
            
              
                x
              
              
                2
              
            
            
              r
            
          
        
        =
        
          
            c
          
          
            r
          
        
      
    
    {\displaystyle {u}_{1}^{x_{1}}u_{2}^{x_{2}}={g}_{1}^{{x}_{1}{r}}{g}_{2}^{{x}_{2}{r}}={c}^{r}}
  
. Также 
  
    
      
        
          
            u
          
          
            1
          
          
            
              y
              
                1
              
            
          
        
        
          
            u
          
          
            2
          
          
            
              y
              
                2
              
            
          
        
        =
        
          
            d
          
          
            r
          
        
      
    
    {\displaystyle {u}_{1}^{y_{1}}{u}_{2}^{y_{2}}={d}^{r}}
  
 и 
  
    
      
        
          
            u
          
          
            1
          
          
            z
          
        
        =
        
          
            h
          
          
            z
          
        
      
    
    {\displaystyle {u}_{1}^{z}={h}^{z}}
  
. Поэтому проверка дешифрования проходит успешно и выводится исходное сообщение 
  
    
      
        m
        =
        e
        
          /
        
        
          
            u
          
          
            1
          
          
            z
          
        
      
    
    {\displaystyle m=e/{u}_{1}^{z}}
  
.
 Для достижения безопасности к неадаптивным атакам (и только им) можно значительно упростить протокол, не использовав 
  
    
      
        d
        ,
        
          
            y
            
              1
            
          
        
        ,
        
          
            y
            
              2
            
          
        
        ,
        H
        (
        )
      
    
    {\displaystyle d,{y_{1}},{y_{2}},H()}
  
. При шифровании мы используем 
  
    
      
        v
        =
        
          
            c
          
          
            k
          
        
      
    
    {\displaystyle v={c}^{k}}
  
, а при дешифровании проверяем, что 
  
    
      
        v
        =
        
          
            
              u
              
                1
              
            
          
          
            
              x
              
                1
              
            
          
        
        
          
            
              u
              
                2
              
            
          
          
            
              x
              
                2
              
            
          
        
      
    
    {\displaystyle v={u_{1}}^{x_{1}}{u_{2}}^{x_{2}}}
  
.
 Пусть у нас есть группа 
  
    
      
        G
      
    
    {\displaystyle G}
  
 порядка 
  
    
      
        q
        =
        13
      
    
    {\displaystyle q=13}
  
. Соответственно 
  
    
      
        
          
            Z
          
          
            13
          
        
      
    
    {\displaystyle {Z}_{13}}
  
 — 
  
    
      
        {
        0
        ,
        1
        ,
        …
        ,
        12
        }
      
    
    {\displaystyle \{0,1,\dots ,12\}}
  
.
 Алгоритм генерации ключей работает следующим образом:
 Дано сообщение 
  
    
      
        3
        ∈
        G
      
    
    {\displaystyle 3\in G}
  
. Алгоритм шифрования работает следующим образом
 Получив зашифрованный текст 
  
    
      
        (
        
          5
          
            5
          
        
        ,
        
          7
          
            5
          
        
        ,
        (
        
          5
          
            9
          
        
        
          )
          
            5
          
        
        ∗
        3
        ,
        (
        
          5
          
            9
          
        
        
          )
          
            5
          
        
        ∗
        3
        )
      
    
    {\displaystyle (5^{5},7^{5},(5^{9})^{5}*3,(5^{9})^{5}*3)}
  
 и используя закрытый ключ 
  
    
      
        (
        8
        ,
        4
        ,
        9
        )
      
    
    {\displaystyle (8,4,9)}
  
:
 Криптосистема Крамера-Шоупа устойчива к атакам на основе адаптивно подобранного шифротекста при выполнении следующих условий:
 Доказательство: чтобы доказать теорему, мы предположим, что существует противник, который может взломать протокол, и покажем, что при выполнении условия на хеш-функцию получается противоречие с условием на задачу Диффи-Хеллмана. На вход нашему вероятностному алгоритму подается 
  
    
      
        (
        
          
            g
          
          
            1
          
        
        ,
        
          
            g
          
          
            2
          
        
        ,
        
          
            u
          
          
            1
          
        
        ,
        
          
            u
          
          
            2
          
        
        )
      
    
    {\displaystyle ({g}_{1},{g}_{2},{u}_{1},{u}_{2})}
  
 из распределения 
  
    
      
        R
      
    
    {\displaystyle R}
  
 или 
  
    
      
        D
      
    
    {\displaystyle D}
  
. На поверхностном уровне конструкция будет выглядеть следующим образом: мы построим симулятор, который будет выдавать совместное распределение, состоящее из видения взломщиком криптосистемы после серии атак и скрытого бита b, генерируемого оракулом генерации (не входит в видение взломщика, скрыто от него). Идея доказательства: мы покажем, что если на вход подается распределение из 
  
    
      
        D
      
    
    {\displaystyle D}
  
, то симуляция пройдет успешно, а противник будет иметь нетривиальное превосходство в угадывании случайного бита b. Также мы покажем, что если на вход подается распределение из 
  
    
      
        R
      
    
    {\displaystyle R}
  
, то видение противника не зависит от 
  
    
      
        b
      
    
    {\displaystyle b}
  
и 
  
    
      
        a
      
    
    {\displaystyle a}
  
, и, значит, превосходство противника будет ничтожно мало (меньше обратного полинома). Отсюда можно построить различитель распределений 
  
    
      
        R
      
    
    {\displaystyle R}
  
 и 
  
    
      
        D
      
    
    {\displaystyle D}
  
: запускаем симулятор криптосистемы (выводит 
  
    
      
        b
      
    
    {\displaystyle b}
  
) и взломщика (выводит 
  
    
      
        
          
            b
          
          
            1
          
        
      
    
    {\displaystyle {b}_{1}}
  
) одновременно и выдаем 
  
    
      
        1
      
    
    {\displaystyle 1}
  
, если 
  
    
      
        b
        =
        
          
            b
          
          
            1
          
        
      
    
    {\displaystyle b={b}_{1}}
  
 и 
  
    
      
        0
      
    
    {\displaystyle 0}
  
в противном случае.
 Схема симуляции генерации ключа выглядит следующим образом:
 Можно заметить, что генерация ключа симулятора отличается от генерации ключа в протоколе (там 
  
    
      
        
          
            z
          
          
            2
          
        
        =
        0
      
    
    {\displaystyle {z}_{2}=0}
  
).
 Симуляция дешифрования. Происходит так же, как и в протоколе, с той разницей, что 
  
    
      
        m
        =
        e
        
          /
        
        (
        
          
            u
          
          
            1
          
          
            
              
                z
              
              
                1
              
            
          
        
        +
        
          
            u
          
          
            2
          
          
            
              
                z
              
              
                2
              
            
          
        
        )
      
    
    {\displaystyle m=e/({u}_{1}^{{z}_{1}}+{u}_{2}^{{z}_{2}})}
  

 Симуляция шифрования. Получая на вход 
  
    
      
        
          
            m
          
          
            0
          
        
        ,
        
          
            m
          
          
            1
          
        
      
    
    {\displaystyle {m}_{0},{m}_{1}}
  
, симулятор выбирает случайное значение 
  
    
      
        b
        ∈
        
          0
          ,
          1
        
      
    
    {\displaystyle b\in {0,1}}
  
, вычисляет 
  
    
      
        e
        =
        
          
            u
          
          
            1
          
          
            
              
                z
              
              
                1
              
            
          
        
        
          
            u
          
          
            2
          
          
            
              
                z
              
              
                2
              
            
          
        
        
          
            m
          
          
            b
          
        
        ,
        α
        =
        H
        (
        
          
            u
          
          
            1
          
        
        ,
        
          
            u
          
          
            2
          
        
        ,
        e
        ,
        v
        )
        ,
        v
        =
        
          
            u
          
          
            1
          
          
            
              
                x
              
              
                1
              
            
            +
            
              
                y
              
              
                1
              
            
            α
          
        
        
          
            u
          
          
            2
          
          
            
              
                x
              
              
                2
              
            
            +
            
              
                y
              
              
                2
              
            
            α
          
        
      
    
    {\displaystyle e={u}_{1}^{{z}_{1}}{u}_{2}^{{z}_{2}}{m}_{b},\alpha =H({u}_{1},{u}_{2},e,v),v={u}_{1}^{{x}_{1}+{y}_{1}\alpha }{u}_{2}^{{x}_{2}+{y}_{2}\alpha }}
  
и выводит 
  
    
      
        (
        
          
            u
          
          
            1
          
        
        ,
        
          
            u
          
          
            2
          
        
        ,
        v
        ,
        e
        )
      
    
    {\displaystyle ({u}_{1},{u}_{2},v,e)}
  
. Теперь доказательство теоремы будет следовать из следующих двух лемм.
 Лемма 1. Если на вход симулятору подается распределение из 
  
    
      
        D
      
    
    {\displaystyle D}
  
, то совместное распределение видения взломщиком криптосистемы и скрытого бита 
  
    
      
        b
      
    
    {\displaystyle b}
  
 статистически неразличимо от настоящей атаки криптосистемы.
 Лемма 2. Если на вход симулятору подается распределение из 
  
    
      
        R
      
    
    {\displaystyle R}
  
, то распределение скрытого бита 
  
    
      
        b
      
    
    {\displaystyle b}
  
 не зависит от распределения видения взломщика.