この 章の 目標
共通鍵暗号の 鍵配送問題と、公開鍵暗号・ デジタル署名が 何を 解決するのかを 説明できる
RSA 暗号と RSA 署名の 正しさを(平文が n n n と 互いに 素でない 場合も 含めて)証明し、秘密鍵から n n n が 素因数分解できる ことを 示せる
教科書的 RSA の 危険(準同型性、小さい 指数と 同報攻撃、共通法)を 小さい 数で 実演し、パディングの 役割を 説明できる
ディフィー–ヘルマン鍵共有・エルガマル暗号・DSA の 正しさを 証明し、安全性が どの 計算問題に 依存するかを 述べられる
中間者攻撃と 公開鍵基盤の 役割、安全性の 定義(一方 向性・識別不 可能性)の 考え方を 説明できる
前提 :第1章 、04-algebra 第1章 (中国剰余定理・原始根・ オイラーの 規準)、 04-algebra 第2章 (巡回群・元の 位数)。
初めて 訪れる 通販サイトに カード番号を 送る とき、その 通信は 暗号化されている。しかし、サイトと あなたは 事前に 秘密の 鍵を 打ち合わせていない。見知らぬ 相手と、盗聴されている 通信路の 上で、どうやって 秘密を 共有するのか―― これが 公開鍵暗号の 解いた 問題である。
本章では、RSA 暗号、ディフィー–ヘルマン鍵共有、エルガマル暗号、DSA の 仕組みを 扱う。それぞれに ついて、 証明できる こと (正しく 復号・検証できる こと、ある 計算が できれば別の 計算も できると いう 帰着)と、 仮定している こと (素因数分解や 離散対数が 難しい こと)を 区別する。また、教科書に 載っている 素朴な 形(教科書的 RSA)が 実際には どう 破れるか、規格が それを どう 防いで いるかを、小さい 数で 確かめる。
2.1 共通鍵暗号と 鍵配送問題
送信者と 受信者が 同じ 鍵 k k k を 共有し、暗号化 c = E k ( m ) c = E_k(m) c = E k ( m ) と 復号 m = D k ( c ) m = D_k(c) m = D k ( c ) に 使う 方式を 共通鍵暗号 (symmetric-key encryption) と いう。最も 単純な 例は、長さ ℓ \ell ℓ の ビット列 m m m と 鍵 k k k の ビットごとの 排他的論理和 c = m ⊕ k c = m \oplus k c = m ⊕ k である。
命題 2.1 (ワンタイムパッド, one-time pad)鍵 K K K を { 0 , 1 } ℓ \lbrace 0, 1 \rbrace^\ell { 0 , 1 } ℓ から 一様に、平文 M M M と 独立に 選び、 C = M ⊕ K C = M \oplus K C = M ⊕ K と する。この とき C C C は { 0 , 1 } ℓ \lbrace 0, 1 \rbrace^\ell { 0 , 1 } ℓ 上の 一様 分布に 従い、 M M M と 独立である。
証明. 任意の m , c m, c m , c に ついて P ( C = c , M = m ) = P ( K = c ⊕ m , M = m ) = 2 − ℓ P ( M = m ) P(C = c, M = m) = P(K = c \oplus m, M = m) = 2^{-\ell}P(M = m) P ( C = c , M = m ) = P ( K = c ⊕ m , M = m ) = 2 − ℓ P ( M = m ) 。m m m に ついて 和を とると P ( C = c ) = 2 − ℓ P(C = c) = 2^{-\ell} P ( C = c ) = 2 − ℓ なので、P ( C = c , M = m ) = P ( C = c ) P ( M = m ) P(C = c, M = m) = P(C = c)P(M = m) P ( C = c , M = m ) = P ( C = c ) P ( M = m ) 。□ \square □
つまり 暗号文からは 平文に ついて 何の 情報も 得られない(シャノンの 完全秘匿性)。ただし鍵は 平文と 同じ 長さが 必要で、一度しか 使えない。同じ鍵で 2 つの 平文を 暗号化すると c 1 ⊕ c 2 = m 1 ⊕ m 2 c_1 \oplus c_2 = m_1 \oplus m_2 c 1 ⊕ c 2 = m 1 ⊕ m 2 と なり、平文の 関係が 漏れる。実用の 共通鍵暗号は AES(FIPS 197、鍵は 128・192・256 ビット)などで、安全性は 証明されていないが、長年の 解析に 耐えてきた ことが 根拠である。
共通鍵暗号の 弱点は、鍵を 事前に 安全に 共有しなければならない ことである( 鍵配送問題 )。N N N 人が 互いに 通信するには N ( N − 1 ) / 2 N(N - 1)/2 N ( N − 1 ) /2 個の 鍵が 必要に なる。1976 年に ディフィーと ヘルマンは、暗号化の 鍵を 公開してしまう 公開鍵暗号 (public-key cryptography) の 考え方を 示し、翌 1977 年に リベスト・シャミア・エーデルマンが RSA 暗号を 発表した(英国の 政府通信本部では それ以前に 同様の 方式が 考案されていた ことが 1997 年に 公表されている)。実際の 通信では、公開鍵暗号や 鍵共有で 共通鍵を 共有し、データ本体は 高速な 共通鍵暗号で 暗号化する(ハイブリッド暗号)。
2.2 一方 向性関数と 落とし戸
定義 2.2 (一方 向性関数と 落とし戸, 非形式的)多項式時間で 計算できる 関数 f f f で、ランダムな x x x に 対して f ( x ) f(x) f ( x ) だけから f ( y ) = f ( x ) f(y) = f(x) f ( y ) = f ( x ) と なる y y y を 求める ことが、どんな 多項式時間の アルゴリズムでも 無視できる 確率(2.10 節)でしかできない ものを 一方 向性関数 (one-way function) と いう。ある 秘密の 情報( 落とし戸 , trapdoor)を 知っていれば 逆算が 易しくなる ものを、落と し戸つき一方 向性関数と いう。
候補は、( p , q ) ↦ p q (p, q) \mapsto pq ( p , q ) ↦ pq (逆算は 素因数分解)、 x ↦ g x m o d p x \mapsto g^x \bmod p x ↦ g x mod p (逆算は 離散対数)、 x ↦ x e m o d n x \mapsto x^e \bmod n x ↦ x e mod n (落とし戸は n n n の 素因数分解)などである。
一方 向性関数の 存在は 証明されていない(存在を 証明すれば P ≠ NP も 証明される ことになる)。公開鍵暗号の 安全性は、「数十年に わたって 多くの 研究者が 攻撃を 試みても、効率的な 逆算法が 見つかっていない」と いう 経験的な 根拠に 支えられた 仮定である。たとえば 2020 年に、829 ビット(10 進 250 桁)の RSA の 法(RSA-250)が 数体ふる い法で 分解されている( 第3章 )。
2.3 RSA 暗号
n = p q n = pq n = pq (p , q p, q p , q は 相異なる 素数)に 対し、 λ ( n ) = lcm ( p − 1 , q − 1 ) \lambda(n) = \operatorname{lcm}(p - 1, q - 1) λ ( n ) = lcm ( p − 1 , q − 1 ) と おく( カーマイケル関数 )。
定義 2.3 (RSA 暗号)
鍵生成:相異なる 大きな 素数 p , q p, q p , q を ランダムに 選び(第1章 1.8 節)、 n = p q n = pq n = pq と する。 gcd ( e , λ ( n ) ) = 1 \gcd(e, \lambda(n)) = 1 g cd( e , λ ( n )) = 1 と なる e e e (65537 65537 65537 が よく 使われる)を 選び、 d = e − 1 m o d λ ( n ) d = e^{-1} \bmod \lambda(n) d = e − 1 mod λ ( n ) を 拡張ユークリッドの 互除法で 求める。 公開鍵 は ( n , e ) (n, e) ( n , e ) 、秘密鍵 は d d d (と p , q p, q p , q )である。
暗号化:平文 m ∈ { 0 , 1 , … , n − 1 } m \in \lbrace 0, 1, \dots, n - 1 \rbrace m ∈ { 0 , 1 , … , n − 1 } に 対し c = m e m o d n c = m^e \bmod n c = m e mod n 。
復号:m = c d m o d n m = c^d \bmod n m = c d mod n 。
定理 2.4 (RSA 暗号の 正しさ) p , q p, q p , q を 相異なる 素数、 n = p q n = pq n = pq とし、正の 整数 e , d e, d e , d が e d ≡ 1 ( m o d λ ( n ) ) ed \equiv 1 \pmod{\lambda(n)} e d ≡ 1 ( mod λ ( n )) を みたすと する。この とき 任意の 整数 m m m に ついて m e d ≡ m ( m o d n ) m^{ed} \equiv m \pmod{n} m e d ≡ m ( mod n ) である。特に x ↦ x e m o d n x \mapsto x^e \bmod n x ↦ x e mod n は Z / n Z \mathbb{Z}/n\mathbb{Z} Z / n Z 上の 全単射で、その 逆写像は x ↦ x d m o d n x \mapsto x^d \bmod n x ↦ x d mod n である。
証明. e d ≥ 1 ed \geq 1 e d ≥ 1 と e d ≡ 1 ed \equiv 1 e d ≡ 1 より e d = 1 + k λ ( n ) ed = 1 + k\lambda(n) e d = 1 + k λ ( n ) (k ≥ 0 k \geq 0 k ≥ 0 )と 書ける。法 p p p で 考える。 p ∤ m p \nmid m p ∤ m なら、フェルマーの 小定理と p − 1 ∣ λ ( n ) p - 1 \mid \lambda(n) p − 1 ∣ λ ( n ) より
m e d = m ⋅ ( m p − 1 ) k λ ( n ) / ( p − 1 ) ≡ m ( m o d p ) m^{ed} = m \cdot \left(m^{p-1}\right)^{k\lambda(n)/(p-1)} \equiv m \pmod{p} m e d = m ⋅ ( m p − 1 ) k λ ( n ) / ( p − 1 ) ≡ m ( mod p )
p ∣ m p \mid m p ∣ m なら e d ≥ 1 ed \geq 1 e d ≥ 1 より 両辺とも 0 0 0 と 合同である。同様に m e d ≡ m ( m o d q ) m^{ed} \equiv m \pmod{q} m e d ≡ m ( mod q ) 。p ≠ q p \neq q p = q なので 中国剰余定理( 04-algebra 第1章 定理 1.28)より m e d ≡ m ( m o d n ) m^{ed} \equiv m \pmod{n} m e d ≡ m ( mod n ) 。最後の 主張は、 x ↦ x e x \mapsto x^e x ↦ x e と x ↦ x d x \mapsto x^d x ↦ x d の 合成が どちらの 順でも 恒等写像に なる ことから 従う。 □ \square □
λ ( n ) \lambda(n) λ ( n ) は φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi(n) = (p - 1)(q - 1) φ ( n ) = ( p − 1 ) ( q − 1 ) を 割るので、 e d ≡ 1 ( m o d φ ( n ) ) ed \equiv 1 \pmod{\varphi(n)} e d ≡ 1 ( mod φ ( n )) でも よい( 04-algebra 第1章 定理 1.53)。λ ( n ) \lambda(n) λ ( n ) を 使うと d d d が 小さくなり、規格(FIPS 186-5)も λ ( n ) \lambda(n) λ ( n ) で d d d を 定めている。 gcd ( m , n ) ≠ 1 \gcd(m, n) \neq 1 g cd( m , n ) = 1 の 平文でも 正しく 復号できるが、そのような m m m の 割合は 1 / p + 1 / q − 1 / n 1/p + 1/q - 1/n 1/ p + 1/ q − 1/ n で 無視できる ほど 小さく、しかも gcd ( m , n ) \gcd(m, n) g cd( m , n ) が n n n の 素因数を 与えてしまう。な お n n n が 平方因子を もつと 定理は 成り立たない(問題 2.2)。
例 2.5 p = 61 p = 61 p = 61 , q = 53 q = 53 q = 53 , n = 3233 n = 3233 n = 3233 と すると λ ( n ) = lcm ( 60 , 52 ) = 780 \lambda(n) = \operatorname{lcm}(60, 52) = 780 λ ( n ) = lcm ( 60 , 52 ) = 780 。e = 17 e = 17 e = 17 と すると d = 17 − 1 m o d 780 = 413 d = 17^{-1} \bmod 780 = 413 d = 1 7 − 1 mod 780 = 413 (17 ⋅ 413 = 7021 = 9 ⋅ 780 + 1 17 \cdot 413 = 7021 = 9 \cdot 780 + 1 17 ⋅ 413 = 7021 = 9 ⋅ 780 + 1 )。φ ( n ) = 3120 \varphi(n) = 3120 φ ( n ) = 3120 を 使えば 第1章の 例 1.8 の d = 2753 d = 2753 d = 2753 に なり、これでも 復号できる。平文 m = 65 m = 65 m = 65 は c = 65 17 m o d 3233 = 2790 c = 65^{17} \bmod 3233 = 2790 c = 6 5 17 mod 3233 = 2790 に 暗号化され、 2790 413 ≡ 2790 2753 ≡ 65 2790^{413} \equiv 2790^{2753} \equiv 65 279 0 413 ≡ 279 0 2753 ≡ 65 と 復号される(第1章の 例 1.10 は 中国剰余定理に よる この 計算である)。 n n n と 互いに 素でない m = 122 = 2 ⋅ 61 m = 122 = 2 \cdot 61 m = 122 = 2 ⋅ 61 も、c = 1830 c = 1830 c = 1830 から 1830 413 ≡ 122 1830^{413} \equiv 122 183 0 413 ≡ 122 と 正しく 戻る(すべて 計算機で 確認した)。
公開鍵だけから c c c を 復号する 問題( RSA 問題 )は、n n n を 素因数分解できれば λ ( n ) \lambda(n) λ ( n ) と d d d が 計算できるので 解ける。逆に RSA 問題が 素因数分解と 同じ くらい 難しいか どうかは 未解決である。一方、 秘密鍵 d d d を 求める ことは 素因数分解と 同じ くらい 難しい ことが 証明できる。
定理 2.6 (秘密鍵から 素因数分解へ) n = p q n = pq n = pq (p , q p, q p , q は 相異なる 奇素数)とし、 λ ( n ) \lambda(n) λ ( n ) の 正の 倍数 k k k (たとえば k = e d − 1 k = ed - 1 k = e d − 1 )が 与えられたとする。 k = 2 s t k = 2^s t k = 2 s t (t t t は 奇数)と 書く。 a ∈ { 1 , … , n − 1 } a \in \lbrace 1, \dots, n - 1 \rbrace a ∈ { 1 , … , n − 1 } を 一様に 選ぶと、確率 1 / 2 1/2 1/2 以上で「gcd ( a , n ) > 1 \gcd(a, n) > 1 g cd( a , n ) > 1 である」か「列 a t , a 2 t , … , a 2 s t ( m o d n ) a^t, a^{2t}, \dots, a^{2^s t} \pmod{n} a t , a 2 t , … , a 2 s t ( mod n ) に、x ≢ ± 1 x \not\equiv \pm 1 x ≡ ± 1 , x 2 ≡ 1 x^2 \equiv 1 x 2 ≡ 1 と なる 項 x x x が 現れる」の どちらかが 起こり、どちらの 場合も n n n の 素因数が 得られる。
証明. gcd ( a , n ) > 1 \gcd(a, n) > 1 g cd( a , n ) > 1 なら gcd ( a , n ) \gcd(a, n) g cd( a , n ) が 素因数である。後者の 場合は 第1章の 補題 1.19 より gcd ( x − 1 , n ) \gcd(x - 1, n) g cd( x − 1 , n ) が 素因数である。以下 a a a が 単元の とき、後者が 確率 1 / 2 1/2 1/2 以上で 起こる ことを 示せばよい。中国剰余定理より、 a a a が 単元全体を 一様に 動く とき、 a p = a m o d p a_p = a \bmod p a p = a mod p と a q = a m o d q a_q = a \bmod q a q = a mod q は 独立に それぞれの 単元群を 一様に 動く。 p − 1 ∣ k p - 1 \mid k p − 1 ∣ k より ( a p t ) 2 s = 1 (a_p^t)^{2^s} = 1 ( a p t ) 2 s = 1 なので、a p t a_p^t a p t の 位数は 2 α 2^\alpha 2 α (0 ≤ α ≤ s 0 \leq \alpha \leq s 0 ≤ α ≤ s )の 形で、同様に a q t a_q^t a q t の 位数を 2 β 2^\beta 2 β と する。
α > β \alpha > \beta α > β なら、x = a 2 α − 1 t x = a^{2^{\alpha - 1}t} x = a 2 α − 1 t は 法 p p p で 位数 2 の 元、すな わち − 1 -1 − 1 である(巡回群 ( Z / p Z ) × (\mathbb{Z}/p\mathbb{Z})^\times ( Z / p Z ) × で 位数 2 の 元は − 1 -1 − 1 だけ)。また 2 β ∣ 2 α − 1 2^\beta \mid 2^{\alpha - 1} 2 β ∣ 2 α − 1 より x ≡ 1 ( m o d q ) x \equiv 1 \pmod{q} x ≡ 1 ( mod q ) 。よって x ≢ ± 1 x \not\equiv \pm 1 x ≡ ± 1 , x 2 ≡ 1 ( m o d n ) x^2 \equiv 1 \pmod{n} x 2 ≡ 1 ( mod n ) と なる。 α < β \alpha < \beta α < β でも 同様である。したがって P ( α ≠ β ) ≥ 1 / 2 P(\alpha \neq \beta) \geq 1/2 P ( α = β ) ≥ 1/2 を 示せばよい。
法 p p p の 原始根 g g g を とり a p = g j a_p = g^j a p = g j と 書くと、 j j j は { 0 , … , p − 2 } \lbrace 0, \dots, p - 2 \rbrace { 0 , … , p − 2 } を 一様に 動く。 p − 1 = 2 v w p - 1 = 2^v w p − 1 = 2 v w (w w w は 奇数)と すると、 p − 1 ∣ k p - 1 \mid k p − 1 ∣ k より w ∣ t w \mid t w ∣ t で、t / w t/w t / w は 奇数である。 04-algebra 第2章 の 命題 2.19(3) より g j t g^{jt} g j t の 位数は ( p − 1 ) / gcd ( p − 1 , j t ) = 2 v / gcd ( 2 v , j ) (p - 1)/\gcd(p - 1, jt) = 2^v/\gcd(2^v, j) ( p − 1 ) / g cd( p − 1 , j t ) = 2 v / g cd( 2 v , j ) 。よって α = v \alpha = v α = v と なるのは j j j が 奇数の ときに 限り、その 確率は ちょうど 1 / 2 1/2 1/2 である。ゆえに どの 値 c c c に ついても P ( α = c ) ≤ 1 / 2 P(\alpha = c) \leq 1/2 P ( α = c ) ≤ 1/2 で、独立性より
P ( α = β ) = ∑ c P ( α = c ) P ( β = c ) ≤ 1 2 ∑ c P ( β = c ) = 1 2 P(\alpha = \beta) = \sum_c P(\alpha = c)P(\beta = c) \leq \frac{1}{2}\sum_c P(\beta = c) = \frac{1}{2} P ( α = β ) = c ∑ P ( α = c ) P ( β = c ) ≤ 2 1 c ∑ P ( β = c ) = 2 1
□ \square □
この 手順を 繰り返せば、 r r r 回で 失敗する 確率は 2 − r 2^{-r} 2 − r 以下である。逆に 素因数分解が できれば d d d は 計算できるので、 d d d を 知ることと 素因数分解を 知ることは(確率的多項式時間で)同値である。
例 2.7 n = 3233 n = 3233 n = 3233 , e = 17 e = 17 e = 17 , d = 2753 d = 2753 d = 2753 では k = 46800 = 2 4 ⋅ 2925 k = 46800 = 2^4 \cdot 2925 k = 46800 = 2 4 ⋅ 2925 。a = 2 a = 2 a = 2 では 列が 1514 , 3232 , 1 , 1 , 1 1514, 3232, 1, 1, 1 1514 , 3232 , 1 , 1 , 1 と なり、 − 1 ≡ 3232 -1 \equiv 3232 − 1 ≡ 3232 を 経て 1 1 1 に なるので 失敗する。 a = 3 a = 3 a = 3 では 2256 , 794 , 1 , 1 , 1 2256, 794, 1, 1, 1 2256 , 794 , 1 , 1 , 1 で、x = 794 x = 794 x = 794 は 1 1 1 の 非自明な 平方根であり、 gcd ( 793 , 3233 ) = 61 \gcd(793, 3233) = 61 g cd( 793 , 3233 ) = 61 を 得る。
import math
import random
def factor_from_d(n, e, d, rng):
"""RSA の公開鍵 (n, e) と秘密鍵 d から n の素因数を 1 つ求める。"""
k = e * d - 1 # λ(n) の倍数
s, t = 0, k
while t % 2 == 0:
s, t = s + 1, t // 2
while True:
a = rng.randrange(2, n - 1)
g = math.gcd(a, n)
if g > 1:
return g # a がたまたま n と共通因数をもった
x = pow(a, t, n)
for _ in range(s):
y = x * x % n
if y == 1 and x != 1 and x != n - 1:
return math.gcd(x - 1, n) # 1 の非自明な平方根 x から因数を得る
x = y
rng = random.Random(0)
p = factor_from_d(3233, 17, 2753, rng)
print(p, 3233 // p)
実行結果は 53 61 である。2048 ビットの n n n でも 一瞬で 終わる。
鍵の 長さに ついて、米国の NIST SP 800-57 Part 1 Rev. 5(2020 年)は、既知の 最良の 攻撃( 第3章 の 数体 ふる い 法)の 計算量を もとに 次の 対応を 示している(表 2 の 一部。全体は 第3章 3.11 節)。
安全性の 強さ
共通鍵暗号
RSA の 法( 有限体の DH の 法 p p p )
112 ビット
3TDEA(2024 年以降は 暗号化に 使えない)
2048 ビット
128 ビット
AES-128
3072 ビット
192 ビット
AES-192
7680 ビット
256 ビット
AES-256
15360 ビット
注意
推奨鍵長は、計算機の 性能や アルゴリズムの 進歩、規格の 改訂に よって 変わる。本書の 数値は 執筆時点の ものであり、実際に 使う ときは 最新の 規格(NIST の SP 800-57 など。日本では CRYPTREC の 暗号リスト)を 確認する こと。また、大規模な 量子計算機が 実現すると、ショアの アルゴリズムに より RSA も 以下の ディフィー–ヘルマンも 多項式時間で 破られ、鍵長を 大きくしても 防げない( 第7章 )。
2.4 RSA 署名
公開鍵暗号の 役割を 入れ替えると、 デジタル署名 が できる。秘密鍵の 持ち主だけが 作れて、誰でも 公開鍵で 検証できる データである。
定義 2.8 (RSA 署名)鍵は RSA 暗号と 同じと する。メッセージ(の ハッシュ値を 符号化した 整数) m m m に 対し、 署名 を s = m d m o d n s = m^d \bmod n s = m d mod n と する。検証者は s e ≡ m ( m o d n ) s^e \equiv m \pmod{n} s e ≡ m ( mod n ) が 成り立てば受理する。
正しい 署名が 受理される ことは 定理 2.4 から 従う。しかし、ハッシュ関数を 通さない 教科書的 RSA 署名は 偽造できる。
例 2.9 (1) 好きな s s s を 選んで m = s e m o d n m = s^e \bmod n m = s e mod n と おけば、 ( m , s ) (m, s) ( m , s ) は 正しい 署名つきメッセージに なる( n = 3233 n = 3233 n = 3233 , e = 17 e = 17 e = 17 で s = 1000 s = 1000 s = 1000 なら m = 175 m = 175 m = 175 )。攻撃者が m m m を 自由に 選べない「存在的偽造」だが、2.10 節の 安全性の 定義は 満たさない。(2) s 1 , s 2 s_1, s_2 s 1 , s 2 が m 1 , m 2 m_1, m_2 m 1 , m 2 の 署名なら、 s 1 s 2 m o d n s_1 s_2 \bmod n s 1 s 2 mod n は m 1 m 2 m o d n m_1 m_2 \bmod n m 1 m 2 mod n の 署名である。
実際の RSA 署名では、メッセージを ハッシュ関数で 固定長の 値にし、乱数を 混ぜて n n n と ほぼ 同じ 長さに 符号化してから d d d 乗する(RSA-PSS。2.5 節)。
2.5 教科書的 RSA の 危険と パディング
定義 2.3 の ままの RSA( 教科書的 RSA , textbook RSA)には、次の 弱点が ある。
(1) 決定的である . 同じ 平文は いつも 同じ 暗号文に なる。平文の 候補が 少なければ(「賛成」か「反対」など)、攻撃者は 候補を すべて 公開鍵で 暗号化して 比べればよい(問題 2.8)。
(2) 準同型性. ( m 1 m 2 ) e = m 1 e m 2 e (m_1 m_2)^e = m_1^e m_2^e ( m 1 m 2 ) e = m 1 e m 2 e より、暗号文の 積は 平文の 積の 暗号文である。これを 使うと、「 c c c その もの 以外なら 何でも 復号して返す」サーバーから c c c の 平文を 引き出せる( 選択暗号文攻撃 )。
例 2.10 n = 3233 n = 3233 n = 3233 , e = 17 e = 17 e = 17 で c = 2790 c = 2790 c = 2790 を 解読したい。乱数 r = 1000 r = 1000 r = 1000 を 選び、 c ′ = c ⋅ r 17 m o d n = 2790 ⋅ 175 m o d 3233 = 67 c' = c \cdot r^{17} \bmod n = 2790 \cdot 175 \bmod 3233 = 67 c ′ = c ⋅ r 17 mod n = 2790 ⋅ 175 mod 3233 = 67 を 復号させると、 m ′ = 340 m' = 340 m ′ = 340 が 返る。 m ′ ≡ m r m' \equiv mr m ′ ≡ m r なので、r − 1 m o d 3233 = 333 r^{-1} \bmod 3233 = 333 r − 1 mod 3233 = 333 を 掛けて m = 340 ⋅ 333 m o d 3233 = 65 m = 340 \cdot 333 \bmod 3233 = 65 m = 340 ⋅ 333 mod 3233 = 65 を 得る。サーバーには c c c と 無関係に 見える 67 67 67 しか 見えていない。
(3) 小さい 指数. e = 3 e = 3 e = 3 で m < n 1 / 3 m < n^{1/3} m < n 1/3 なら m 3 < n m^3 < n m 3 < n なので、c = m 3 c = m^3 c = m 3 は 整数と して 成り立ち、 c c c の 整数の 3 乗根で m m m が 求まる( n = 7387 n = 7387 n = 7387 で m = 19 m = 19 m = 19 なら c = 6859 = 19 3 c = 6859 = 19^3 c = 6859 = 1 9 3 )。e = 3 e = 3 e = 3 で 2048 ビットの n n n を 使い、128 ビットの 共通鍵を そのまま 暗号化すると、まさに この 状況に なる(署名の 規格 FIPS 186-5 は e e e を 2 16 < e < 2 256 2^{16} < e < 2^{256} 2 16 < e < 2 256 の 奇数に 限っているが、本質的な 対策は 後で 述べる パディングである)。
命題 2.11 (ハスタッドの 同報攻撃, Håstad's broadcast attack)同じ 平文 m m m を、公開指数 e e e が 共通で どの 2 つも 互いに 素な e e e 個の 法 n 1 , … , n e n_1, \dots, n_e n 1 , … , n e で 暗号化した 暗号文 c i = m e m o d n i c_i = m^e \bmod n_i c i = m e mod n i が 得られたとする( 0 ≤ m < min i n i 0 \leq m < \min_i n_i 0 ≤ m < min i n i )。中国剰余定理で x ≡ c i ( m o d n i ) x \equiv c_i \pmod{n_i} x ≡ c i ( mod n i ) (0 ≤ x < N = n 1 ⋯ n e 0 \leq x < N = n_1 \cdots n_e 0 ≤ x < N = n 1 ⋯ n e )を 求めると x = m e x = m^e x = m e であり、m m m は x x x の 整数の e e e 乗根と して 求まる。
証明. m e ≡ c i ( m o d n i ) m^e \equiv c_i \pmod{n_i} m e ≡ c i ( mod n i ) が すべての i i i で 成り立ち、 0 ≤ m e < n 1 ⋯ n e = N 0 \leq m^e < n_1 \cdots n_e = N 0 ≤ m e < n 1 ⋯ n e = N なので、中国剰余定理の 一意性より x = m e x = m^e x = m e 。□ \square □
例 2.12 e = 3 e = 3 e = 3 、法を n 1 = 47 ⋅ 59 = 2773 n_1 = 47 \cdot 59 = 2773 n 1 = 47 ⋅ 59 = 2773 , n 2 = 53 ⋅ 71 = 3763 n_2 = 53 \cdot 71 = 3763 n 2 = 53 ⋅ 71 = 3763 , n 3 = 83 ⋅ 89 = 7387 n_3 = 83 \cdot 89 = 7387 n 3 = 83 ⋅ 89 = 7387 (どれも 3 ∤ φ ( n i ) 3 \nmid \varphi(n_i) 3 ∤ φ ( n i ) )とし、同じ m = 2026 m = 2026 m = 2026 を 送る。
def crt(residues, moduli):
"""法がどの 2 つも互いに素なときの中国剰余定理。0 以上 N 未満の解と N を返す。"""
N = 1
for m in moduli:
N *= m
x = 0
for r, m in zip(residues, moduli):
Ni = N // m
x += r * Ni * pow(Ni, -1, m)
return x % N, N
def iroot(k, x):
"""k 乗が x 以下になる最大の整数を二分探索で求める。"""
lo, hi = 0, 1 << (x.bit_length() // k + 1)
while lo < hi:
mid = (lo + hi + 1) // 2
if mid ** k <= x:
lo = mid
else:
hi = mid - 1
return lo
ns = [47 * 59, 53 * 71, 83 * 89] # 3 人の受信者の法(公開指数はどれも e = 3)
cs = [pow(2026, 3, n) for n in ns] # 盗聴者が集めた 3 つの暗号文
x, N = crt(cs, ns)
print(cs, x, iroot(3, x))
実行結果は [1864, 1622, 3199] 8316073576 2026 で、x = 2026 3 x = 2026^3 x = 202 6 3 から 平文が 復元される。素因数分解は 一切していない。
(4) 共通法. 同じ n n n を 複数の 利用者で 共有し、公開指数 e 1 , e 2 e_1, e_2 e 1 , e 2 だけを 変えるのは 危険である。定理 2.6 に より、自分の ( e 1 , d 1 ) (e_1, d_1) ( e 1 , d 1 ) を 知る 利用者は n n n を 素因数分解でき、他人の d 2 d_2 d 2 も 計算できる。外部の 攻撃者でも、同じ m m m が gcd ( e 1 , e 2 ) = 1 \gcd(e_1, e_2) = 1 g cd( e 1 , e 2 ) = 1 の 2 つの 指数で 暗号化されていれば、 u e 1 + v e 2 = 1 ue_1 + ve_2 = 1 u e 1 + v e 2 = 1 と なる 整数 u , v u, v u , v を とって c 1 u c 2 v ≡ m u e 1 + v e 2 = m c_1^u c_2^v \equiv m^{ue_1 + ve_2} = m c 1 u c 2 v ≡ m u e 1 + v e 2 = m と 平文を 得る(負の 指数は 法 n n n の 逆元で 計算する。問題 2.3)。
これらの 弱点を 防ぐのが パディング(平文の 符号化)である。 OAEP (ベラーレ–ロガウェイ、1994 年)の 考え方を 示す。ハッシュ関数 G , H G, H G , H と 乱数 r r r を 使い、
X = ( m ∥ 0 k 1 ) ⊕ G ( r ) , Y = r ⊕ H ( X ) X = (m \mathbin{\Vert} 0^{k_1}) \oplus G(r), \qquad Y = r \oplus H(X) X = ( m ∥ 0 k 1 ) ⊕ G ( r ) , Y = r ⊕ H ( X )
と して、ビット列 X ∥ Y X \mathbin{\Vert} Y X ∥ Y (∥ \mathbin{\Vert} ∥ は 連結)を 整数と みて e e e 乗する。復号では X , Y X, Y X , Y から r = Y ⊕ H ( X ) r = Y \oplus H(X) r = Y ⊕ H ( X ) 、m ∥ z = X ⊕ G ( r ) m \mathbin{\Vert} z = X \oplus G(r) m ∥ z = X ⊕ G ( r ) を 計算し、 z = 0 k 1 z = 0^{k_1} z = 0 k 1 でなければ 拒否する。乱数 r r r に より 暗号化は 確率的に なり((1) の 対策)、符号化は n n n と ほぼ 同じ 長さに なり((3) の 対策)、でたらめに 作った 暗号文は ほぼ確実に 拒否されるので 積の 関係も 使えない((2) の 対策)。RSA-OAEP は、ハッシュ関数を 理想化した モデル(ランダムオラクルモデル)のもとで、RSA 問題が 難しいと 仮定すれば 選択暗号文攻撃に 対して 安全であることが 証明されている。署名用には、乱数(ソルト)と ハッシュ値から 符号化を 作る PSS が 同様の 役割を 果たす。細部は PKCS #1(RFC 8017)で 規定されている。
ヒント
実務では
RSA を 自分で 実装したり、教科書的 RSA を 使ったりしてはいけない。暗号化には RSA-OAEP、署名には RSA-PSS を、実績の ある ライブラリで 使う。古い PKCS #1 v1.5 形式の 暗号化パディングは、復号時の 形式チェックの 成否が 外部から 観測できると、それを 手が かりに 暗号文を 解読される(1998 年の ブライヒェンバッハーの 攻撃)。この 種の 攻撃は 実装の 細部から 何度も 再発しており、TLS 1.3 では RSA で 鍵を 暗号化して 送る 方式自体が 廃止され、RSA は 署名にだけ 使われる。
2.6 ディフィー–ヘルマン鍵共有
公開の 通信路だけで 共通鍵を 作る 方法である。以下、 p p p を 素数、 q q q を p − 1 p - 1 p − 1 を 割る 素数、 g ∈ ( Z / p Z ) × g \in (\mathbb{Z}/p\mathbb{Z})^\times g ∈ ( Z / p Z ) × を 位数 q q q の 元とし、 G = ⟨ g ⟩ G = \langle g \rangle G = ⟨ g ⟩ と おく(群 G G G の 位数は q q q )。
定義 2.13 (ディフィー–ヘルマン鍵共有, Diffie–Hellman key exchange)( p , q , g ) (p, q, g) ( p , q , g ) は 公開されていると する。アリスは a ∈ { 1 , … , q − 1 } a \in \lbrace 1, \dots, q - 1 \rbrace a ∈ { 1 , … , q − 1 } を ランダムに 選んで A = g a m o d p A = g^a \bmod p A = g a mod p を、ボブは b b b を 選んで B = g b m o d p B = g^b \bmod p B = g b mod p を 送る。アリスは K = B a m o d p K = B^a \bmod p K = B a mod p 、ボブは K = A b m o d p K = A^b \bmod p K = A b mod p を 計算する。
B a = g a b = A b B^a = g^{ab} = A^b B a = g ab = A b なので、2 人は 同じ K K K を 得る。盗聴者が 見るのは p , q , g , A , B p, q, g, A, B p , q , g , A , B だけである。
例 2.14 p = 467 = 2 ⋅ 233 + 1 p = 467 = 2 \cdot 233 + 1 p = 467 = 2 ⋅ 233 + 1 , q = 233 q = 233 q = 233 (素数), g = 4 = 2 2 g = 4 = 2^2 g = 4 = 2 2 (位数 233 233 233 )と する。 a = 153 a = 153 a = 153 , b = 197 b = 197 b = 197 なら A = 207 A = 207 A = 207 , B = 97 B = 97 B = 97 で、K = 97 153 ≡ 207 197 ≡ 193 ( m o d 467 ) K = 97^{153} \equiv 207^{197} \equiv 193 \pmod{467} K = 9 7 153 ≡ 20 7 197 ≡ 193 ( mod 467 ) 。
定義 2.15 (離散対数に 関する 問題) G = ⟨ g ⟩ G = \langle g \rangle G = ⟨ g ⟩ を 位数 q q q の 巡回群と する。
離散対数問題 (DLP):g x g^x g x から x m o d q x \bmod q x mod q を 求める。
計算ディフィー–ヘルマン問題 (CDH):g x , g y g^x, g^y g x , g y から g x y g^{xy} g x y を 求める。
判定ディフィー–ヘルマン問題 (DDH):( g x , g y , g x y ) (g^x, g^y, g^{xy}) ( g x , g y , g x y ) と ( g x , g y , g z ) (g^x, g^y, g^z) ( g x , g y , g z ) (x , y , z x, y, z x , y , z は 一様ランダム)を 見分ける。
DLP が 解ければ CDH が 解け( x x x を 求めて ( g y ) x (g^y)^x ( g y ) x )、CDH が 解ければ DDH が 解ける。逆向きは 一般には 知られていない。DH 鍵共有を 盗聴から 守るには 少なくとも CDH が 難しくなければならず、共有した K K K を「ランダムな 値と 見分けが つかない」鍵と して 使うには DDH の 困難さが 要る。群の 選び方は 重要である。
命題 2.16 p p p を 奇素数、 g g g を 法 p p p の 原始根と する( G = ( Z / p Z ) × G = (\mathbb{Z}/p\mathbb{Z})^\times G = ( Z / p Z ) × 全体)。この とき g a , g b g^a, g^b g a , g b から g a b g^{ab} g ab の ルジャンドル記号が 計算でき、DDH は 易しい。
証明. オイラーの 規準( 04-algebra 第1章 定理 1.49)と g ( p − 1 ) / 2 ≡ − 1 g^{(p-1)/2} \equiv -1 g ( p − 1 ) /2 ≡ − 1 (g g g の 位数が p − 1 p - 1 p − 1 だから)より、( g x p ) ≡ g x ( p − 1 ) / 2 ≡ ( − 1 ) x \left(\frac{g^x}{p}\right) \equiv g^{x(p-1)/2} \equiv (-1)^x ( p g x ) ≡ g x ( p − 1 ) /2 ≡ ( − 1 ) x 。よって ( g a b p ) = ( − 1 ) a b \left(\frac{g^{ab}}{p}\right) = (-1)^{ab} ( p g ab ) = ( − 1 ) ab は、( g a p ) = ( g b p ) = − 1 \left(\frac{g^a}{p}\right) = \left(\frac{g^b}{p}\right) = -1 ( p g a ) = ( p g b ) = − 1 の ときだけ − 1 -1 − 1 である。ルジャンドル記号は 反復二乗法で 計算できる。3 つ目の 成分の ルジャンドル記号が この 予測と 一致するかを 調べれば、本物の 組は 必ず 一致し、ランダムな g z g^z g z は 確率 1 / 2 1/2 1/2 でしか 一致しないので、見分けられる。 □ \square □
そこで 実用では、 q q q が 十分 大きい 素数と なる 部分群(例 2.14 のように 安全素数 p = 2 q + 1 p = 2q + 1 p = 2 q + 1 の 平方剰余の 群など)を 使う。群の 位数が 小さい 素因数だけの 積だと、離散対数は ポーリッヒ–ヘルマン法で 易しくなる( 第3章 )。SP 800-57 は、112 ビットの 安全性に p p p を 2048 ビット、q q q を 224 ビットと する 組を 対応させている。
2.7 エルガマル暗号
DH 鍵共有の 片方を 固定の 公開鍵に すると、公開鍵暗号が できる(エルガマル、1985 年)。
定義 2.17 (エルガマル暗号, ElGamal encryption)群 G = ⟨ g ⟩ G = \langle g \rangle G = ⟨ g ⟩ (位数 q q q )は 2.6 節の とおりと する。秘密鍵は x ∈ { 1 , … , q − 1 } x \in \lbrace 1, \dots, q - 1 \rbrace x ∈ { 1 , … , q − 1 } 、公開鍵は h = g x h = g^x h = g x 。平文 m ∈ G m \in G m ∈ G に 対し、 k ∈ { 1 , … , q − 1 } k \in \lbrace 1, \dots, q - 1 \rbrace k ∈ { 1 , … , q − 1 } を 暗号化の たびに ランダムに 選び、暗号文を ( c 1 , c 2 ) = ( g k , m h k ) (c_1, c_2) = (g^k, mh^k) ( c 1 , c 2 ) = ( g k , m h k ) と する。復号は m = c 2 ( c 1 x ) − 1 m = c_2 (c_1^x)^{-1} m = c 2 ( c 1 x ) − 1 。
命題 2.18 (1) エルガマル暗号は 正しく 復号できる。(2) 公開鍵と 暗号文から 平文を つねに 求める アルゴリズムと、CDH を つねに 解く アルゴリズムは、一方から 他方を 多項式時間で 構成できる。
証明. (1) c 1 x = g k x = h k c_1^x = g^{kx} = h^k c 1 x = g k x = h k なので c 2 ( c 1 x ) − 1 = m c_2(c_1^x)^{-1} = m c 2 ( c 1 x ) − 1 = m 。(2) CDH が 解ければ、 h = g x h = g^x h = g x と c 1 = g k c_1 = g^k c 1 = g k から h k = g x k h^k = g^{xk} h k = g x k を 求めて m = c 2 ( h k ) − 1 m = c_2(h^k)^{-1} m = c 2 ( h k ) − 1 。逆に 復号アルゴリズムが あれば、 g x , g y g^x, g^y g x , g y に 対し公開鍵 h = g x h = g^x h = g x 、暗号文 ( g y , 1 ) (g^y, 1) ( g y , 1 ) を 与えると m = ( g x y ) − 1 m = (g^{xy})^{-1} m = ( g x y ) − 1 が 返るので、 g x y = m − 1 g^{xy} = m^{-1} g x y = m − 1 。□ \square □
例 2.19 例 2.14 の 群で x = 127 x = 127 x = 127 と すると h = 4 127 m o d 467 = 145 h = 4^{127} \bmod 467 = 145 h = 4 127 mod 467 = 145 。m = 100 = 10 2 m = 100 = 10^2 m = 100 = 1 0 2 (平方剰余なので G G G の 元)を k = 213 k = 213 k = 213 で 暗号化すると ( c 1 , c 2 ) = ( 374 , 122 ) (c_1, c_2) = (374, 122) ( c 1 , c 2 ) = ( 374 , 122 ) 。復号では c 1 x = 374 127 ≡ 160 c_1^x = 374^{127} \equiv 160 c 1 x = 37 4 127 ≡ 160 で、122 ⋅ 160 − 1 ≡ 100 ( m o d 467 ) 122 \cdot 160^{-1} \equiv 100 \pmod{467} 122 ⋅ 16 0 − 1 ≡ 100 ( mod 467 ) 。
エルガマル暗号は 乱数 k k k を 使うので 確率的である。一方、 ( c 1 , t c 2 ) (c_1, tc_2) ( c 1 , t c 2 ) は t m tm t m の 暗号文に なる(準同型性)ので、選択暗号文攻撃には 弱い。また k k k を 使い回すと 平文の 比が 漏れる(問題 2.5)。実用では DH 鍵共有で 共通鍵を 作り、データは 共通鍵暗号で 暗号化する 方式が 主流である。
2.8 デジタル署名アルゴリズム(DSA)
DSA は、エルガマルの 署名方式を 素数位数の 部分群に 移して 短くした 方式で、米国の 規格 FIPS 186 と して 1994 年に 制定された。
定義 2.20 (DSA)公開パラメータを 素数 p , q p, q p , q (q ∣ p − 1 q \mid p - 1 q ∣ p − 1 )と 位数 q q q の 元 g ∈ ( Z / p Z ) × g \in (\mathbb{Z}/p\mathbb{Z})^\times g ∈ ( Z / p Z ) × と する。秘密鍵は x ∈ { 1 , … , q − 1 } x \in \lbrace 1, \dots, q - 1 \rbrace x ∈ { 1 , … , q − 1 } 、公開鍵は y = g x m o d p y = g^x \bmod p y = g x mod p 。h h h を メッセージの ハッシュ値( q q q の ビット長に 切り詰めた 整数)と する。
署名:秘密の 乱数 k ∈ { 1 , … , q − 1 } k \in \lbrace 1, \dots, q - 1 \rbrace k ∈ { 1 , … , q − 1 } を 署名の たびに 選び、 r = ( g k m o d p ) m o d q r = (g^k \bmod p) \bmod q r = ( g k mod p ) mod q , s = k − 1 ( h + x r ) m o d q s = k^{-1}(h + xr) \bmod q s = k − 1 ( h + x r ) mod q と する。 r = 0 r = 0 r = 0 または s = 0 s = 0 s = 0 なら k k k を 選び直す。署名は ( r , s ) (r, s) ( r , s ) 。
検証:0 < r < q 0 < r < q 0 < r < q , 0 < s < q 0 < s < q 0 < s < q を 確かめ、 w = s − 1 m o d q w = s^{-1} \bmod q w = s − 1 mod q , u 1 = h w m o d q u_1 = hw \bmod q u 1 = h w mod q , u 2 = r w m o d q u_2 = rw \bmod q u 2 = r w mod q , v = ( g u 1 y u 2 m o d p ) m o d q v = (g^{u_1}y^{u_2} \bmod p) \bmod q v = ( g u 1 y u 2 mod p ) mod q とし、v = r v = r v = r なら 受理する。
定理 2.21 (DSA の 正しさ)正しく 作られた 署名は 受理される。
証明. s ≢ 0 s \not\equiv 0 s ≡ 0 なので w w w が 定まり、 s ≡ k − 1 ( h + x r ) s \equiv k^{-1}(h + xr) s ≡ k − 1 ( h + x r ) より h + x r ≡ s k ( m o d q ) h + xr \equiv sk \pmod q h + x r ≡ s k ( mod q ) 。よって u 1 + x u 2 ≡ w ( h + x r ) ≡ w s k ≡ k ( m o d q ) u_1 + xu_2 \equiv w(h + xr) \equiv wsk \equiv k \pmod{q} u 1 + x u 2 ≡ w ( h + x r ) ≡ w s k ≡ k ( mod q ) 。g g g の 位数は q q q なので g u 1 y u 2 = g u 1 + x u 2 = g k g^{u_1}y^{u_2} = g^{u_1 + xu_2} = g^k g u 1 y u 2 = g u 1 + x u 2 = g k が 法 p p p で 成り立ち、 v = ( g k m o d p ) m o d q = r v = (g^k \bmod p) \bmod q = r v = ( g k mod p ) mod q = r 。□ \square □
例 2.22 ( p , q , g ) = ( 467 , 233 , 4 ) (p, q, g) = (467, 233, 4) ( p , q , g ) = ( 467 , 233 , 4 ) , x = 127 x = 127 x = 127 , y = 145 y = 145 y = 145 , h = 100 h = 100 h = 100 , k = 51 k = 51 k = 51 と する。 g k m o d p = 289 g^k \bmod p = 289 g k mod p = 289 より r = 289 m o d 233 = 56 r = 289 \bmod 233 = 56 r = 289 mod 233 = 56 。k − 1 m o d 233 = 32 k^{-1} \bmod 233 = 32 k − 1 mod 233 = 32 で、s = 32 ⋅ ( 100 + 127 ⋅ 56 ) m o d 233 = 32 ⋅ 222 m o d 233 = 114 s = 32 \cdot (100 + 127 \cdot 56) \bmod 233 = 32 \cdot 222 \bmod 233 = 114 s = 32 ⋅ ( 100 + 127 ⋅ 56 ) mod 233 = 32 ⋅ 222 mod 233 = 114 。検証では w = 114 − 1 m o d 233 = 186 w = 114^{-1} \bmod 233 = 186 w = 11 4 − 1 mod 233 = 186 , u 1 = 193 u_1 = 193 u 1 = 193 , u 2 = 164 u_2 = 164 u 2 = 164 で、4 193 ⋅ 145 164 ≡ 243 ⋅ 55 ≡ 289 ( m o d 467 ) 4^{193} \cdot 145^{164} \equiv 243 \cdot 55 \equiv 289 \pmod{467} 4 193 ⋅ 14 5 164 ≡ 243 ⋅ 55 ≡ 289 ( mod 467 ) より v = 56 = r v = 56 = r v = 56 = r 。
k k k が 漏れたり、2 つの 署名で 同じ k k k を 使ったりすると、秘密鍵 x x x が 計算されてしまう(問題 2.6。楕円曲線版の ECDSA での 詳しい 分析は 第4章)。な お FIPS 186-5(2023 年 2 月)では、DSA は 署名の 生成には 承認されなくなり(この 規格の 実施日より 前に 作られた 署名の 検証には 使える)、承認される 署名方式は RSA・ECDSA・EdDSA の 3 つに なった。
2.9 中間者攻撃と 公開鍵基盤
DH 鍵共有の A , B A, B A , B には「誰が 送ったか」の 情報が ない。通信路を 書き換えられる 攻撃者マロリーは、アリスの A A A を 自分の Z = g z Z = g^z Z = g z に すり 替えて ボブに 渡し、ボブの B B B も Z Z Z に すり 替えて アリスに 渡す。アリスは g a z g^{az} g a z を、ボブは g b z g^{bz} g b z を「共有した 鍵」と 思い込むが、マロリーは 両方を 計算でき、2 人の 通信を 復号・ 改ざんして 中継できる( 中間者攻撃 , man-in-the-middle attack。問題 2.4)。数学的には どの 計算問題も 解いていない。
防ぐには、受け取った 公開鍵が 本当に 相手の ものかを 確かめる 必要が ある。 公開鍵基盤 (PKI) では、認証局 (CA) が「この 公開鍵は この ドメイン名の 持ち主の もの」と いう 文書( 証明書 )に デジタル署名する。ブラウザや OS は 少数の ルート認証局の 公開鍵を あらかじめ信頼しており、証明書の 署名の 連鎖を たどって 検証する。TLS 1.3 では、サーバーは 使い捨ての DH(または 楕円曲線 DH)の 値を 送り、証明書の 秘密鍵で それまでの やりとり全体に 署名する。すり 替えれば 署名の 検証に 失敗する。使い捨ての DH 鍵を 使うので、後で サーバーの 秘密鍵が 漏れても 過去の 通信は 解読されない( 前方秘匿性 , forward secrecy)。
ヒント
実務では
暗号の 多くの 事故は、数学ではなく「鍵が 本物か」の 確認の 不備から 起こる。証明書の 検証を 無効に する 設定(テストの ために 入れて 本番に 残るなど)は、中間者攻撃を そのまま 許す。逆に、認証局が 誤って 発行した 証明書は 信頼の 連鎖 その ものを 壊すので、失効の 仕組みや、発行された すべての 証明書を 公開記録する 証明書透明性(Certificate Transparency)などの 運用上の 対策が 重ねられている。
2.10 安全性の 定義
「安全」を 数学的に 定義すると、証明できる ことと できない ことがはっきりする。攻撃者は 確率的多項式時間の アルゴリズムとし、鍵の 長さを 表す セキュリティパラメータ κ \kappa κ (カーマイケル関数 λ ( n ) \lambda(n) λ ( n ) と 区別する ため κ \kappa κ と 書く)に ついて、任意の 多項式の 逆数より 速く 0 0 0 に 近づく 関数を 無視できる (negligible) と いう。
一方 向性 (OW-CPA):公開鍵と ランダムな 平文の 暗号文から、平文全体を 求められる 確率が 無視できる。
識別不 可能性 (IND-CPA):次の ゲームで 攻撃者が 勝つ確率と 1 / 2 1/2 1/2 の 差( 優位 )が 無視できる。(i) 鍵を 生成し、攻撃者に 公開鍵を 渡す。(ii) 攻撃者が 同じ 長さの 平文 m 0 , m 1 m_0, m_1 m 0 , m 1 を 選ぶ。(iii) 一様ランダムな b ∈ { 0 , 1 } b \in \lbrace 0, 1 \rbrace b ∈ { 0 , 1 } に ついて m b m_b m b の 暗号文を 渡す。(iv) 攻撃者は b b b を 当てれば 勝ち。
IND-CCA2 :IND-CPA の ゲームで、攻撃者は (iii) の 暗号文以外なら 何でも 復号して もらえる。
IND-CPA は「暗号文から 平文の 部分的な 情報(偶奇や 大小関係など)さえ 漏れない」ことを 表す、一方 向性より ずっと 強い 要求である。
命題 2.23 暗号化が 決定的な(乱数を 使わない)公開鍵暗号は、IND-CPA 安全ではない。
証明. 攻撃者は 相異なる m 0 , m 1 m_0, m_1 m 0 , m 1 を 選び、受け取った 暗号文 c c c と、自分で 公開鍵を 使って 計算した m 0 m_0 m 0 の 暗号文を 比べ、一致すれば b = 0 b = 0 b = 0 、しなければ b = 1 b = 1 b = 1 と 答える。復号できる 方式では m 0 ≠ m 1 m_0 \neq m_1 m 0 = m 1 の 暗号文は 異なるので、つねに 勝つ。 □ \square □
したがって 教科書的 RSA は IND-CPA 安全で ない。準同型性を もつ 方式(教科書的 RSA、エルガマル暗号)は、例 2.10 のように 問題の 暗号文を 変形して 復号して もらえるので IND-CCA2 安全で ない。一方、次の ことが 仮定のもとで 証明されている(本書では 主張のみ):素数位数の 群での エルガマル暗号は DDH 仮定のもとで IND-CPA 安全である。RSA-OAEP は ランダムオラクルモデルと RSA 仮定のもとで IND-CCA2 安全である。署名に ついては「好きな メッセージに 署名して もらえても、新しい メッセージの 署名を 作れない」(EUF-CMA)が 標準的な 定義で、教科書的 RSA 署名は 例 2.9 に より 満たさないが、RSA-PSS は ランダムオラクルモデルと RSA 仮定のもとで 満たす。
これらの 証明は どれも「攻撃者が いれば、仮定した 難しい 問題を 解く アルゴリズムが 作れる」と いう 帰着の 形を している。証明された 安全性とは、仮定が 正しい 限りでの 安全性である。
まとめ
共通鍵暗号には 鍵配送問題が ある。ワンタイムパッドは 完全秘匿だが、鍵の 使い回しで 破れる。
公開鍵暗号の 安全性は、一方 向性関数の 存在と いう 未証明の 仮定と、長年の 解析と いう 経験的根拠に 依存する。
RSA の 正しさ m e d ≡ m ( m o d p q ) m^{ed} \equiv m \pmod{pq} m e d ≡ m ( mod pq ) (e d ≡ 1 m o d λ ( n ) ed \equiv 1 \bmod \lambda(n) e d ≡ 1 mod λ ( n ) )は、gcd ( m , n ) ≠ 1 \gcd(m, n) \neq 1 g cd( m , n ) = 1 の 場合も 含めて 成り立つ。秘密鍵 d d d を 知れば n n n は 確率的に 素因数分解できる。
教科書的 RSA は 決定的で 準同型性を もち、小さい 指数・同報・共通法の 攻撃に 弱い。OAEP・PSS の パディングで 防ぐ。
DH 鍵共有・エルガマル暗号・DSA は 素数位数の 部分群で 使う。DH と エルガマルの 安全性は CDH・DDH の 困難さに、DSA は 少なくとも 離散対数の 困難さに 依存する。原始根で 生成される 群全体では ルジャンドル記号が 漏れる。
DSA の 秘密の 乱数 k k k の 再利用は 秘密鍵を 漏らす。
認証の ない 鍵共有は 中間者攻撃に 弱く、証明書と 公開鍵基盤で 公開鍵の 持ち主を 保証する。
安全性の 定義(OW-CPA, IND-CPA, IND-CCA2, EUF-CMA)と 帰着に よる 証明は、仮定のもとでの 安全性を 与える。推奨鍵長は 規格とともに 変わる。
演習問題
問題 2.1 ★ p = 67 p = 67 p = 67 , q = 79 q = 79 q = 79 , e = 5 e = 5 e = 5 で RSA の 鍵を 作る。 n n n , λ ( n ) \lambda(n) λ ( n ) , d = e − 1 m o d λ ( n ) d = e^{-1} \bmod \lambda(n) d = e − 1 mod λ ( n ) を 求め、平文 m = 2026 m = 2026 m = 2026 を 暗号化せよ。さらに 中国剰余定理(第1章 命題 1.9)を 使って 復号せよ(冪剰余の 計算には 計算機を 使って よい)。
解答
n = 5293 n = 5293 n = 5293 , λ ( n ) = lcm ( 66 , 78 ) = 858 \lambda(n) = \operatorname{lcm}(66, 78) = 858 λ ( n ) = lcm ( 66 , 78 ) = 858 。互除法 858 = 171 ⋅ 5 + 3 858 = 171 \cdot 5 + 3 858 = 171 ⋅ 5 + 3 , 5 = 3 + 2 5 = 3 + 2 5 = 3 + 2 , 3 = 2 + 1 3 = 2 + 1 3 = 2 + 1 を 逆に たどると 1 = 2 ⋅ 858 − 343 ⋅ 5 1 = 2 \cdot 858 - 343 \cdot 5 1 = 2 ⋅ 858 − 343 ⋅ 5 なので、d = − 343 m o d 858 = 515 d = -343 \bmod 858 = 515 d = − 343 mod 858 = 515 。暗号化:2026 2 ≡ 2601 2026^2 \equiv 2601 202 6 2 ≡ 2601 , 2026 4 ≡ 2601 2 ≡ 747 2026^4 \equiv 2601^2 \equiv 747 202 6 4 ≡ 260 1 2 ≡ 747 , c = 2026 5 ≡ 747 ⋅ 2026 ≡ 4917 ( m o d 5293 ) c = 2026^5 \equiv 747 \cdot 2026 \equiv 4917 \pmod{5293} c = 202 6 5 ≡ 747 ⋅ 2026 ≡ 4917 ( mod 5293 ) 。復号:d p = 515 m o d 66 = 53 d_p = 515 \bmod 66 = 53 d p = 515 mod 66 = 53 , d q = 515 m o d 78 = 47 d_q = 515 \bmod 78 = 47 d q = 515 mod 78 = 47 , c m o d 67 = 26 c \bmod 67 = 26 c mod 67 = 26 , c m o d 79 = 19 c \bmod 79 = 19 c mod 79 = 19 から m p = 26 53 m o d 67 = 16 m_p = 26^{53} \bmod 67 = 16 m p = 2 6 53 mod 67 = 16 , m q = 19 47 m o d 79 = 51 m_q = 19^{47} \bmod 79 = 51 m q = 1 9 47 mod 79 = 51 。79 − 1 m o d 67 = 28 79^{-1} \bmod 67 = 28 7 9 − 1 mod 67 = 28 より h = ( 16 − 51 ) ⋅ 28 m o d 67 = 25 h = (16 - 51) \cdot 28 \bmod 67 = 25 h = ( 16 − 51 ) ⋅ 28 mod 67 = 25 、m = 51 + 79 ⋅ 25 = 2026 m = 51 + 79 \cdot 25 = 2026 m = 51 + 79 ⋅ 25 = 2026 。(2026 m o d 67 = 16 2026 \bmod 67 = 16 2026 mod 67 = 16 , 2026 m o d 79 = 51 2026 \bmod 79 = 51 2026 mod 79 = 51 で、m p , m q m_p, m_q m p , m q が 平文の 剰余に なっている ことも 確かめられる。)
問題 2.2 ★ ★ (1) n = 45 = 3 2 ⋅ 5 n = 45 = 3^2 \cdot 5 n = 45 = 3 2 ⋅ 5 , e = d = 5 e = d = 5 e = d = 5 と すると e d ≡ 1 ( m o d φ ( n ) ) ed \equiv 1 \pmod{\varphi(n)} e d ≡ 1 ( mod φ ( n )) だが、m = 3 m = 3 m = 3 に ついて m e d ≢ m ( m o d 45 ) m^{ed} \not\equiv m \pmod{45} m e d ≡ m ( mod 45 ) と なる ことを 確かめよ。(2) 一般に、素数 p p p に ついて p 2 ∣ n p^2 \mid n p 2 ∣ n ならば、e ≥ 2 e \geq 2 e ≥ 2 の とき x ↦ x e m o d n x \mapsto x^e \bmod n x ↦ x e mod n は 単射でない ことを 示せ。RSA の n n n が 平方因子を もってはいけない 理由を 説明せよ。
解答
(1) φ ( 45 ) = 24 \varphi(45) = 24 φ ( 45 ) = 24 で 25 ≡ 1 25 \equiv 1 25 ≡ 1 。3 25 3^{25} 3 25 は 9 9 9 の 倍数で、法 5 5 5 では フェルマーの 小定理より 3 25 = 3 ⋅ ( 3 4 ) 6 ≡ 3 3^{25} = 3 \cdot (3^4)^6 \equiv 3 3 25 = 3 ⋅ ( 3 4 ) 6 ≡ 3 。よって 3 25 m o d 45 3^{25} \bmod 45 3 25 mod 45 は x ≡ 0 ( m o d 9 ) x \equiv 0 \pmod 9 x ≡ 0 ( mod 9 ) , x ≡ 3 ( m o d 5 ) x \equiv 3 \pmod 5 x ≡ 3 ( mod 5 ) の 解 18 18 18 であり、3 3 3 に 戻らない。
(2) u = n / p u = n/p u = n / p と おくと u ≢ 0 ( m o d n ) u \not\equiv 0 \pmod{n} u ≡ 0 ( mod n ) だが、u 2 = n ⋅ ( n / p 2 ) u^2 = n \cdot (n/p^2) u 2 = n ⋅ ( n / p 2 ) は n n n の 倍数なので u e ≡ 0 = 0 e ( m o d n ) u^e \equiv 0 = 0^e \pmod{n} u e ≡ 0 = 0 e ( mod n ) 。異なる 2 元 u , 0 u, 0 u , 0 が 同じ値に 写るので 単射でない。したがって どんな d d d を 選んでも u u u と 0 0 0 の 両方を 正しく 復号する ことは できない。定理 2.4 の 証明では、 p ∣ m p \mid m p ∣ m の とき 両辺が 法 p p p で 0 0 0 に なる ことを 使ったが、法 p 2 p^2 p 2 では この 議論が 成り立たない。
問題 2.3 ★ ★ (共通法攻撃)同じ 法 n = 3233 n = 3233 n = 3233 で、公開指数 e 1 = 17 e_1 = 17 e 1 = 17 と e 2 = 7 e_2 = 7 e 2 = 7 の 2 人に 同じ 平文 m m m が 送られ、暗号文 c 1 = 2183 c_1 = 2183 c 1 = 2183 , c 2 = 1844 c_2 = 1844 c 2 = 1844 が 盗聴された。 m m m を 求めよ。
解答
gcd ( 17 , 7 ) = 1 \gcd(17, 7) = 1 g cd( 17 , 7 ) = 1 で、17 = 2 ⋅ 7 + 3 17 = 2 \cdot 7 + 3 17 = 2 ⋅ 7 + 3 , 7 = 2 ⋅ 3 + 1 7 = 2 \cdot 3 + 1 7 = 2 ⋅ 3 + 1 を 逆に たどると 1 = 7 − 2 ⋅ 3 = 7 − 2 ( 17 − 2 ⋅ 7 ) = 5 ⋅ 7 − 2 ⋅ 17 1 = 7 - 2 \cdot 3 = 7 - 2(17 - 2 \cdot 7) = 5 \cdot 7 - 2 \cdot 17 1 = 7 − 2 ⋅ 3 = 7 − 2 ( 17 − 2 ⋅ 7 ) = 5 ⋅ 7 − 2 ⋅ 17 。よって m = m − 2 ⋅ 17 + 5 ⋅ 7 ≡ c 1 − 2 c 2 5 ( m o d n ) m = m^{-2 \cdot 17 + 5 \cdot 7} \equiv c_1^{-2}c_2^5 \pmod{n} m = m − 2 ⋅ 17 + 5 ⋅ 7 ≡ c 1 − 2 c 2 5 ( mod n ) 。gcd ( c 1 , n ) = 1 \gcd(c_1, n) = 1 g cd( c 1 , n ) = 1 で、c 1 − 1 m o d 3233 = 2454 c_1^{-1} \bmod 3233 = 2454 c 1 − 1 mod 3233 = 2454 , c 1 − 2 ≡ 2454 2 ≡ 2270 c_1^{-2} \equiv 2454^2 \equiv 2270 c 1 − 2 ≡ 245 4 2 ≡ 2270 , c 2 5 ≡ 3037 c_2^5 \equiv 3037 c 2 5 ≡ 3037 より、m ≡ 2270 ⋅ 3037 ≡ 1234 m \equiv 2270 \cdot 3037 \equiv 1234 m ≡ 2270 ⋅ 3037 ≡ 1234 。実際 1234 17 ≡ 2183 1234^{17} \equiv 2183 123 4 17 ≡ 2183 , 1234 7 ≡ 1844 ( m o d 3233 ) 1234^7 \equiv 1844 \pmod{3233} 123 4 7 ≡ 1844 ( mod 3233 ) である。
問題 2.4 ★ p = 23 p = 23 p = 23 , g = 4 g = 4 g = 4 (位数 11 11 11 )で DH 鍵共有を 行う。(1) a = 3 a = 3 a = 3 , b = 7 b = 7 b = 7 の とき A , B A, B A , B と 共有鍵 K K K を 求めよ。(2) マロリーが z = 5 z = 5 z = 5 で 中間者攻撃を する とき、アリスと ボブが それぞれ計算する 鍵と、マロリーが それらを 計算できる ことを 確かめよ。
解答
(1) A = 4 3 = 64 ≡ 18 A = 4^3 = 64 \equiv 18 A = 4 3 = 64 ≡ 18 , B = 4 7 ≡ 8 ( m o d 23 ) B = 4^7 \equiv 8 \pmod{23} B = 4 7 ≡ 8 ( mod 23 ) (4 2 = 16 4^2 = 16 4 2 = 16 , 4 4 ≡ 3 4^4 \equiv 3 4 4 ≡ 3 , 4 7 = 4 4 ⋅ 4 2 ⋅ 4 ≡ 192 ≡ 8 4^7 = 4^4 \cdot 4^2 \cdot 4 \equiv 192 \equiv 8 4 7 = 4 4 ⋅ 4 2 ⋅ 4 ≡ 192 ≡ 8 )。K = B a = 8 3 = 512 ≡ 6 K = B^a = 8^3 = 512 \equiv 6 K = B a = 8 3 = 512 ≡ 6 。確かに A b = 18 7 ≡ 6 A^b = 18^7 \equiv 6 A b = 1 8 7 ≡ 6 でもある。
(2) Z = 4 5 = 1024 ≡ 12 Z = 4^5 = 1024 \equiv 12 Z = 4 5 = 1024 ≡ 12 。アリスは Z a = 12 3 = 1728 ≡ 3 Z^a = 12^3 = 1728 \equiv 3 Z a = 1 2 3 = 1728 ≡ 3 、ボブは Z b = 12 7 ≡ 16 Z^b = 12^7 \equiv 16 Z b = 1 2 7 ≡ 16 を 鍵と する。マロリーは A z = 18 5 ≡ 3 A^z = 18^5 \equiv 3 A z = 1 8 5 ≡ 3 , B z = 8 5 ≡ 16 B^z = 8^5 \equiv 16 B z = 8 5 ≡ 16 を 計算でき、両方の 鍵を 知る。アリスと ボブの 鍵は 一致しないが、マロリーが 一方の 鍵で 復号して 他方の 鍵で 暗号化し直して 中継すれば、2 人は 気づかない。
問題 2.5 ★ ★ (ナンスの 再利用)例 2.19 の 公開鍵 h = 145 h = 145 h = 145 (p = 467 p = 467 p = 467 , g = 4 g = 4 g = 4 )で、ある 装置が 同じ 乱数 k k k を 使い回した。平文 m 1 = 100 m_1 = 100 m 1 = 100 の 暗号文が ( 374 , 122 ) (374, 122) ( 374 , 122 ) である ことを 攻撃者は 知っている。同じ 装置の 別の 暗号文 ( 374 , 3 ) (374, 3) ( 374 , 3 ) の 平文を 求めよ。
解答
c 1 c_1 c 1 が 同じなので k k k が 同じで、 c 2 = m 1 h k c_2 = m_1 h^k c 2 = m 1 h k , c 2 ′ = m 2 h k c_2' = m_2 h^k c 2 ′ = m 2 h k より m 2 = c 2 ′ c 2 − 1 m 1 m_2 = c_2' c_2^{-1} m_1 m 2 = c 2 ′ c 2 − 1 m 1 。122 − 1 m o d 467 = 356 122^{-1} \bmod 467 = 356 12 2 − 1 mod 467 = 356 なので m 2 = 3 ⋅ 356 ⋅ 100 m o d 467 = 324 m_2 = 3 \cdot 356 \cdot 100 \bmod 467 = 324 m 2 = 3 ⋅ 356 ⋅ 100 mod 467 = 324 (= 18 2 = 18^2 = 1 8 2 )。秘密鍵を 知らなくても、既知の 平文が 1 つ あれば 同じ k k k の 暗号文は すべて 解読される。 k k k は 暗号化の たびに CSPRNG で 新しく 選ばなければならない。
問題 2.6 ★ ★ (DSA の 乱数の 再利用)例 2.22 の パラメータで、同じ k k k を 使った 2 つの 署名 ( r , s 1 ) = ( 56 , 114 ) (r, s_1) = (56, 114) ( r , s 1 ) = ( 56 , 114 ) (ハッシュ値 h 1 = 100 h_1 = 100 h 1 = 100 )と ( r , s 2 ) = ( 56 , 195 ) (r, s_2) = (56, 195) ( r , s 2 ) = ( 56 , 195 ) (h 2 = 37 h_2 = 37 h 2 = 37 )が 見つかった。 k k k と 秘密鍵 x x x を 求めよ。
解答
s i ≡ k − 1 ( h i + x r ) s_i \equiv k^{-1}(h_i + xr) s i ≡ k − 1 ( h i + x r ) より s 1 − s 2 ≡ k − 1 ( h 1 − h 2 ) ( m o d q ) s_1 - s_2 \equiv k^{-1}(h_1 - h_2) \pmod{q} s 1 − s 2 ≡ k − 1 ( h 1 − h 2 ) ( mod q ) なので、k ≡ ( h 1 − h 2 ) ( s 1 − s 2 ) − 1 k \equiv (h_1 - h_2)(s_1 - s_2)^{-1} k ≡ ( h 1 − h 2 ) ( s 1 − s 2 ) − 1 。s 1 − s 2 ≡ − 81 ≡ 152 s_1 - s_2 \equiv -81 \equiv 152 s 1 − s 2 ≡ − 81 ≡ 152 , 152 − 1 m o d 233 = 23 152^{-1} \bmod 233 = 23 15 2 − 1 mod 233 = 23 より k ≡ 63 ⋅ 23 = 1449 ≡ 51 k \equiv 63 \cdot 23 = 1449 \equiv 51 k ≡ 63 ⋅ 23 = 1449 ≡ 51 。次に x ≡ ( s 1 k − h 1 ) r − 1 x \equiv (s_1 k - h_1)r^{-1} x ≡ ( s 1 k − h 1 ) r − 1 で、s 1 k − h 1 = 5714 ≡ 122 s_1 k - h_1 = 5714 \equiv 122 s 1 k − h 1 = 5714 ≡ 122 , 56 − 1 m o d 233 = 129 56^{-1} \bmod 233 = 129 5 6 − 1 mod 233 = 129 より x ≡ 122 ⋅ 129 ≡ 127 ( m o d 233 ) x \equiv 122 \cdot 129 \equiv 127 \pmod{233} x ≡ 122 ⋅ 129 ≡ 127 ( mod 233 ) 。検算:4 127 ≡ 145 = y ( m o d 467 ) 4^{127} \equiv 145 = y \pmod{467} 4 127 ≡ 145 = y ( mod 467 ) 。
問題 2.7 ★ ★ 素数 p p p と 原始根 g g g で、群 ( Z / p Z ) × (\mathbb{Z}/p\mathbb{Z})^\times ( Z / p Z ) × 全体を そのまま 使って エルガマル暗号を 作る(公開鍵 h = g x h = g^x h = g x )。平文 m 0 m_0 m 0 を 平方剰余、 m 1 m_1 m 1 を 平方非剰余に 選ぶ攻撃者は、IND-CPA の ゲームで つねに 勝てる ことを 示せ。
解答
暗号文 ( c 1 , c 2 ) = ( g k , m b h k ) (c_1, c_2) = (g^k, m_b h^k) ( c 1 , c 2 ) = ( g k , m b h k ) に ついて、命題 2.16 の 証明と 同じく ( c 1 p ) = ( − 1 ) k \left(\frac{c_1}{p}\right) = (-1)^k ( p c 1 ) = ( − 1 ) k , ( h p ) = ( − 1 ) x \left(\frac{h}{p}\right) = (-1)^x ( p h ) = ( − 1 ) x が 計算でき、 ( h k p ) = ( − 1 ) x k \left(\frac{h^k}{p}\right) = (-1)^{xk} ( p h k ) = ( − 1 ) x k は「( h p ) = ( c 1 p ) = − 1 \left(\frac{h}{p}\right) = \left(\frac{c_1}{p}\right) = -1 ( p h ) = ( p c 1 ) = − 1 の ときだけ − 1 -1 − 1 」と して 求まる。ルジャンドル記号は 乗法的なので ( m b p ) = ( c 2 p ) ( h k p ) \left(\frac{m_b}{p}\right) = \left(\frac{c_2}{p}\right)\left(\frac{h^k}{p}\right) ( p m b ) = ( p c 2 ) ( p h k ) が 計算でき、これが 1 1 1 なら b = 0 b = 0 b = 0 、− 1 -1 − 1 なら b = 1 b = 1 b = 1 と 答えればつねに 正しい。これが、素数位数の 部分群(平方剰余の 群など)を 使う 理由である。
問題 2.8 ★ (この 設計の どこが 危ないか)ある 社内システムは、人事評価 A〜E を 教科書的 RSA( e = 65537 e = 65537 e = 65537 , 2048 ビットの n n n )で 暗号化して データベースに 保存している。「2048 ビットの RSA なので 安全」と いう 説明の 誤りを 指摘し、改善策を 述べよ。
解答
教科書的 RSA は 決定的なので、公開鍵を 知る者は A〜E の 5 通りを すべて 暗号化して データベースの 値と 比べるだけで、すべての 評価を 読める(命題 2.23 の 攻撃 その もの)。鍵の 長さが 効くのは 素因数分解に よる 攻撃に 対してだけで、平文の 候補が 少ない ことに よる 弱さは 防が ない。さらに 同じ 評価の 人どうしは 暗号文が 一致するので、評価の 分布も 漏れる。改善策は、乱数を 含むパディング(RSA-OAEP)を 使うか、より 一般に ハイブリッド暗号(ランダムな 共通鍵を 公開鍵で 暗号化し、データは 認証つき共通鍵暗号で 暗号化する)を 実績の ある ライブラリで 使う ことである。