- Unit Goals
- Background
- Definitions
- 年表
- Kinds of Ciphers
- Secret Key Cryptography
- Caesar Cipher
- Monoalphabetic Substitution
- Homophonic Substitution
- 単純ヴィジェネール
- Auto-Key Vigenère
- Modern Auto-Key Ciphers
- One Time Pad
- Playfair
- Four-square
- Simple Block Transposition
- Columnar Transposition
- Rail Fence
- Combining Substitution and Transposition
- Bifid
- Trifid
- Enigma
- Modern Cryptographic Methods
- DES
- IDEA
- RC4
- RC6
- Blowfish
- Twofish
- AES
- Key Exchange
- Public Key Cryptography
- RSA Cryptosystem
- Cryptographic Hashing
- Message Authentication Codes
- Digital Signatures
- RSA for Digital Signatures
- DSA
- Cryptanalysis
- Programming Examples
- JavaScript Examples
- Python Examples
- Java Examples
Unit Goals
Background
Alice and Bobは人でありながらクライアントやサーバー、ピアコンピュータ、データストア、ネットワークルーターなどでもあり得るのです。 Mallory は参加者の 1 人になりすまし、実際のメッセージを追加、変更、削除し、接続をハイジャックし、サービス拒否を行い、マルウェアを注入することができます。
Goals:
- Confidentiality: m$ の価値よりも、$m$ を回復するために Eve がより多くのコストを負担しなければならない。 認証: ボブは$m$を送ったのがアリスであることを確認できるはずである。 ボブは$m$が改竄されていないことを確認できること。
- 否認不可。 872>
最高の暗号システムは、EveとMalloryが$E$, $D$, $c$を知り、$k_e \neq k_d$なら、$k_e$も知っていると仮定している。 ほとんどの暗号システムは、アルゴリズムを秘密にすることに依存していません。
- 秘密のアルゴリズムが侵害された場合 (誰かがグループを抜ける可能性がある)、それを変更しなければならず、それは単に鍵を変更するよりもはるかに困難です。
- 公開アルゴリズムは、欠陥を探す数千人の専門家に従うことができるので、精査に耐えるものにはある程度の信頼性があります。
Further reading:Security Through Obscurity, Kerchoff’s Principle andthis discussion.
暗号学には、各種暗号の設計、暗号解読法(攻撃)、鍵交換、鍵認証、暗号ハッシュ、電子署名、社会問題(法律、政治など)などが含まれます。 Wikipedia の暗号学のトピックを参照してください。
DON’T DO THIS STUFF ON OWN IN REAL APPLICATIONS
確かに、家で遊ぶのは良いですが、実際のものに自分で暗号を仕掛けるのは絶対にやめてください。 プロに任せましょう。
Definitions
Words to know:
Cryptography 暗号を作る芸術と科学。 つまり、$c$、$E$、$D$、そして場合によっては$k_e$が与えられたときに$m$を抽出することです。 暗号学 暗号と暗号解読を研究する学問。 ステガノグラフィについて調べてみよう。
暗号システム 暗号化、復号化、鍵生成のための特定のアルゴリズムとプロトコルの組合せ。 例 例:Cramer-Shoup暗号システム、Rabin暗号システム、Benaloh暗号システム、RSA暗号システム。 暗号システム 暗号を利用するシステム。 5614>演習:「暗号」と「コード」はどう違うのか? 暗号よりコードの方が安全ですか? 混乱 平文、暗号文、鍵の関係が複雑で、暗号解読者にとって使い物にならない性質。 Diffusion 平文に含まれる統計的なパターンが暗号文に広く行き渡る性質。
年表
歴史が好きなら…
- Wikipedia の暗号の歴史記事
- Wikipedia の年表
- Carl Ellison の年表
Kinds of Ciphers
ここで役立つ暗号のカテゴリがいくつか紹介されます。 特定の暗号がこれらのカテゴリのうちの1つ以上に属している場合があることに注意してください。 手で実行できるほど簡単な暗号で、通常は文字ベース。 手動とも呼ばれる。
Secret Key Cryptography
Secret Key (a.k.a. symmetric key) ciphers are much fast than public key ciphers, but key management can be a huge problem.秘密鍵暗号は公開鍵暗号よりもはるかに高速ですが、鍵の管理は大きな問題になることがあります。
- グループ内の $n$ 人が通信する必要がある場合、 $frac{n(n-1)}{2}$ 鍵が必要です。
- 鍵は安全に(秘密裏に)配布する必要があります。
- 鍵は安全に保管されなければならない。
- 鍵は頻繁に変更されるべきで、それは配布の頭痛の種にフィードバックされる。
NOTE
以下の文字ベースの例では、(一般性を損なうことなく)26シンボルのアルファベットを仮定します (
A..Z
)。
Caesar Cipher
現代の標準では完全に哀れで安全でない暗号です。 暗号鍵$k_e$は小さな整数で、$k_d = k_e$とする。 暗号化するには平文の各文字に$k_e$を足し、復号化するには引きます。
ATTACKATDAWN
は FYYFHPFYIFBS
クラックするのは簡単で、$k_e$ を推測すればよい。
Monoalphabetic Substitution
各文字に単に固定オフセットを加える代わりに、アルファベットのランダムな並べ替えを発生させて置換表を事前計算することが可能である。 例えば、
ABCDEFGHIJKLMNOPQRSTUVWXYZ MQHPSVJYCURFTBILAKWNGZDOEX
Now ATTACKATDAWN
is now MNNMHRMNPMDB
.
キーを推測してもこれは解読できませんが(可能なキーは $n!$ ある)、周波数分析によって、メッセージが十分長ければどんなモノラルアルファベット置換暗号も解読することができます。
キーが順列である技術について、キーを覚えやすくする一つの方法は、フレーズを選び、そのユニークな文字を並べ、欠けている文字を順番に埋めていくことです。 例えば、PREMATURE OPTIMIZATION IS THE ROOT OF ALL EVIL
は次のような置換マッピングになります:
PREMATUOIZNSHFLVBCDGJKQWXY
Homophonic Substitution
平文の各文字は暗号文の1つ以上のシンボルにマッピングされます。 対象の数はその頻度に比例する必要がある(周波数解析を打ち負かすため)。 例:
A 12 15 36 50 56 70 81 95 B 51 84 C 16 44 65 D 04 06 48 82 E 01 17 19 34 47 49 58 60 67 77 85 90 F 13 27 G 09 28 H 26 42 53 59 68 71 I 35 73 76 86 91 96 J 18 K 07 L 29 40 54 87 M 25 30 N 21 61 62 69 74 94 O 02 03 08 10 57 75 93 P 41 98 Q 97 R 32 38 43 45 80 83 S 14 22 39 79 89 99 T 00 20 23 33 46 52 72 78 88 U 11 64 66 V 37 W 63 92 X 31 Y 24 55 Z 05
暗号化するには、可能性の中からランダムに選択する。 例:ATTACKATDAWN
の暗号化の可能性の1つは
56 78 20 95 65 07 12 72 06 50 92 61
単純ヴィジェネール
単純シフトヴィジェネール暗号として知られている暗号はヴィジェネールが全く発明していない…ジョバン・バティスタ・ベラソが最初に記述したようである。 鍵は平文にモジュール式加算で追加する文字列で、この例のように (A=0, B=1, C=2, …, Z=25):
Plaintext: TAKEACOPYOFYOURPOLICYTONORMAWILCOXONTHETHIRDFLOOR Key: QUARKQUARKQUARKQUARKQUARKQUARKQUARKQUARKQUARKQUAR Ciphertext: JUKVKSIPPYVSOLBFILZMONOEYHGANSBWOOYDNHVDXCRUPBIOI
暗号文を手で生成するには、コードホイールやタブラ・レクタを使用することができます。 鍵の長さを決定することができれば、暗号解読者は複数の周波数分析(鍵の各シフト値について1つ)を行うことができます。 鍵の長さを決定する方法として、カイジスキー法とフリードマンテストがある。
バイナリデータ(つまりビット列)に対するモジュラー加算base-2は、単純なxorに過ぎない。 例:
Plaintext: 0110000101010000111101001010101010010000001111101 Key: 0000011100000111000001110000011100000111000001110 Ciphertext: 0110011001010111111100111010110110010111001110011
Auto-Key Vigenère
Vigenère は実際にオートキー暗号を作ったが、これは鍵が決して繰り返されないのでより強力である。 その代わり、「鍵」はキーフレーズと平文で構成され、次のようになります:
Plaintext: TAKEACOPYOFYOURPOLICYTONORMAWILCOXONTHETHIRDFLOOR Key: QUARKTAKEACOPYOFYOURPOLICYTONORMAWILCOXONTHETHIRD Ciphertext: JUKVKVOZCOHMDSFUMZCTNHZVQPFOJWCOOTWYVVBHUBYHYSWFU
この暗号は平文を鍵の一部として使用しています。 また、暗号文も使用することができる。
Modern Auto-Key Ciphers
鍵にテキストが含まれているため、頻度の高い文字が含まれる可能性が高いので、言語分析によってオートキー・ビジェネール暗号を解読することができます。 最近の自動鍵暗号は、乱数発生器を用いてシフト値を生成します。 鍵は生成器の種となる。
One Time Pad
鍵が:
- 暗号化されるメッセージと同じかより長い
- 本当にランダムに生成される
- 一度だけ使う
なら、ワンタイムパッドという証明できる安全な暗号があることになります。 実際のアルゴリズムは、上記の3つの基準を満たす限り、多倍長文字の置換や、キーとメッセージの単純な交差を使用することも可能です。
Playfair
これはポリグラフ置換暗号の一例で、文字のペアを置き換えます。 鍵は{A..I,K..Z}の順列で、例えば:
Z C B M L G D A Q E T U O K H F S X V N P I Y R W
暗号化するには、平文(スペースや句読点なし)を書き出し、2文字の間と必要なら末尾にXをつけて、テキストの長さを均等にしてください。
- 最初の文字の行と列を $(a,b)$ とし、次の文字の行と列を $(c,d)$ とする。
- $a = c$ なら $(a,(b+1) \bmod 5)(c,(d+1) \bmod 5)$.
- $b = d$ なら $((a+1) \bmod 5,b)((c+1) \bmod 5,d)$.
THEN ATTACK FROM THE EAST
⇒ TH EN AT XT AC KF RO MT HE XE AS TX
⇒ UT HW GO FO DB TV YK ZK NH NA DX OF
⇒ UTHWGOFODBTVYKZKNHNADXOF
復号はルールを逆に実行します。 138>
Four-square
プレイフェア暗号と同様にダイグラフを暗号化するが、2文字を許容し、平文ダイグラフの反転に対して暗号文ダイグラフの反転を行わないので若干強い。 例
a b c d e G I V E M f g h i k L B R T Y l m n o p O D A H C q r s t u F K N P Q v w x y z S U W X Z P R E M A a b c d e T U O I Z f g h i k N S H F L l m n o p V B C D G q r s t u K Q W X Y v w x y z
THEN ATTACK FROM THE EAST
⇒ TH EN AT TA CK FR OM TH EE AS TX
⇒ NI VL EV FM MO BV DF NI MA VV NX
さて、Playfairより少し強いですが、だから何ですか? 138>
Simple Block Transposition
The simplest transposition cipher breaks up the message into blocks of size n, then scrambles each block according to a permutation of $(1..n)$
Columnar Transposition
格子状に行ごとにメッセージを書き出し、それを列ごとに読み出す。 まったくもって安全ではない。 鍵は行数だけ。
Rail Fence
レールフェンスは、前作より面白みが増しただけで、良くはない。 鍵はレールの数で、そこに平文を上下に書き、レールを1本ずつ読んで暗号文を生成します。
例。 例: "fill out and file a WS2475 form"
を4本のレールで暗号化する場合:
f t l 4 m i u a i e 2 7 r l o n f a s 5 o l d w f
そして暗号文 "ftl4miuaie27rlonfas5oldwf"
を読み出す。 これを解読するのは簡単だ。 138>
Combining Substitution and Transposition
Transposition 単独では非常に弱く、Substitutionも弱く、組み合わせるのが良い。 古典的な置換暗号の多くに様々な転置を混ぜたり、bifidのような特殊な組み合わせの暗号を使ったりすることができます。 138>
Bifid
これは文字を格子状の座標に置き換えて、その座標に列方向の転置を行うものです。 例:
Z C B M L G D A Q E T U O K H F S X V N P I Y R W
平文の各文字の下に(行、列)座標を書き込む(例:. 「A “は1行目、2列目、”T “は2行目、0列目、など):
ATTACKATDAWN 122102121143 200213201244
次に行単位で読み上げ、2つずつグループ化して暗号文の文字を調べる:
122102121143200213201244 A U B A D R T B Q T A W
Trifid
Bifid と同様だが、キューブにある場合。 例:
Z C B M L F V N P G D A Q E X I R W T U O K H S Y . J
暗号化するには、まず座標を書く:
ATTACKATDAWN 000001000022 122102121110 200210201221
000001000022122102121110200210201221 Z C Z O S F H Q V I N .
Enigma
エニグマは第二次世界大戦中のドイツの有名な回転機械(実際は機械のファミリー)です。ほとんどのバージョンでは16900の周期とスクランブル(転置)用のプラグボードで多漢字置換暗号が実装されています。 鍵はローターの順番、各ローターの開始位置、リングの設定、プラグボードの設定(約1.6×1020通り)で構成されていた。 138>
連合国は設計上のいくつかの弱点のおかげでこれを解読することができた…。
- どんな文字もそれ自身には暗号化されない
- 自己回帰性は、スクランブラー設定の可能性が少ないということ
…but もっと重要なのは、それが使われた方法における多くの弱点…
- クリブは本当に簡単に見つけられたんだ。 ほとんどのメッセージは天気予報で始まりました。
- 初期の頃、メッセージキーは2回続けて現れました。
…and by obtaining codebook from captured vessels.
Modern Cryptographic Methods
シャノンの情報理論、非常に強力なコンピュータ、何世紀もの理論と実践がある今、最も現代的な技術である。
- 文字列ではなく、ビット列で動作する
- 平文のパターンや冗長性を完全に隠すように注意する
- ランダムキーを使用(再利用可能)
- 平文における非常に小さな変化が暗号文の大部分に影響する(逆もしかり)ことを保証すること。
さらに、暗号が次のようなものであることが望ましいです:
- efficient
- fault-tolerant
ほとんどの暗号はブロック暗号またはストリーム暗号のどちらかです。 ブロック暗号はパディングを必要とし、さまざまなモードで動作することができる(Schnierの本やWikipediaの記事を参照。)
- ECB – 電子コードブック
- CBC – 暗号ブロック連鎖
- CFB – 暗号フィードバック
- OFB – 出力フィードバックCTR – カウンタ
- BC – ブロック連鎖
- PCBC – 伝搬型暗号ブロック連鎖
- CBCC – チェックサム付き暗号ブロック連鎖
DES
Wikipediaにて
IDEA
Wikipediaにて
RC4
Wikipediaにて
RC6
Wikipediaにて
Blowfish
Wikipediaにて
Twofish
Wikipediaにて
AES
Wikipediaにて
AES は新しい標準である。 DESに代わるもの。 2001年にRijndaelという名前で提出されたコンペティションでは、RC6、Serpent、MARS、Twofishを抑えて優勝している。
Key Exchange
Diffie and Hellman (the 2015 Turing Award Winners) and their friendMerkle was showed it possible for two people toexchange a secret key without having to actually meet in secret in the secret (1976 年):
- アリスは素数$n$を選び、これを平文でボブに送る
- アリスは$g$というprimitiveroot mod $n$(見つけ方)を選び、これを平文でボブに送る
- アリスは秘密の整数$a$を選び出す。 で、$g^a \bmod n$をクリアでボブに送る
- Bobは秘密の整数$b$を選び、$g^b \bmod n$をクリアでアリスに送る
- アリスは ($g^b \bmod n)^a \bmod n$、ボブは ($g^a \bmod n)^b \bmod n$と計算する。 これが鍵だ!(It’s $g^{ab} \bmod n$)
これは、$n$が非常に大きく、$frac{n-1}{2}$も素数なら安全でしょう。イブは$g$、$n$、$g^a \bmod n$、$g^b \b$を知っていますが、ここから$a$や$b$を得る効率の良い方法は知られていないのだからです。これが離散対数問題です。
小さい$n$の例:
- Alice picks $n=208799$ and $g=13$ and sends these to Bob
- Alice picks $a=152335$ and Bob picks $b=98113$
- Alice sends Bob $13^{152335}. \bmod 208799 = 73033$
- Bob sends Alice $13^{98133}. \bmod 208799 = 147540$
- Alice computes $147540^{152335}. \bmod 208799 = 8435$
- Bob computes $73033^{98133}.
$n$の小さい値で実際にやってはいけない。
一般に、何らかの認定を受けない限り、自分で現実世界のシステムを安全にしようとしないこと。 しかし、もちろん、先に進み、アルゴリズムを学び、今はコーディングの練習をしましょう。
Public Key Cryptography
公開鍵暗号は、秘密鍵暗号の鍵管理の悪夢を解決しますが、その代償としてスピードが犠牲になります。 138>
RSA Cryptosystem
Diffie-Hellman は暗号化を行わず、鍵を交換するだけですが、RSAは暗号化と復号化が可能です。 その方法を説明します。 各人
- 2つの大きな素数$p$と$q$を生成する。
- 自分の公開鍵$(N,e)$($N = pq$)を公開する。
- d$=$e$のモジュラー・インバース $(p-1)(q-1)$ に対して計算、秘密にしておく。
- $p$と$q$を破棄する。
ここで調べてみましょう。
- アリスがボブへメッセージ$m$を送るには、$c = m^e \bmod N$を送る。
- ボブはこれを$m = c^d N$なので簡単に復号する。
練習問題です。 RSAの背後にある数学について調べなさい。 なぜうまくいくのか、詳しく教えてください。 pq$が素数のとき、$(p-1)(q-1)$にどのように還元されるかなど、オイラーの総和関数の基礎となる定理を答えなさい。 ディフィー・ヘルマン(DH)は、鍵交換を扱うものであり、それ自体は暗号化アルゴリズムではないにもかかわらず、公開鍵暗号の一部とみなされることがあります。 では、なぜ公開鍵暗号と考える人がいるのでしょうか。 (簡単な例:
警告!
この例は説明のためだけのものです。 決して独自の暗号アルゴリズムを実装しないでください。 また、このような小さな鍵では、公開鍵暗号がいかにひどいものであるかを理解しておいてください。16ビットのキーを使ってみましょう(実際にはやらないでください)。 ランダムな8ビット素数を2つ生成:
$p = 163Θq = 173$
エンコード指数用に16ビット素数を生成:
$e = 64013$
さて、次は。
$n = pq = 28199 \d = \mathsf{modInverse}(e, (p-1)(q-1)) = 6797$
文字列
¿Dónde está ud.?
をエンコードしてみましょう。 UTF-8では次のようになります:c2 bf 44 c3 b3 6e 64 65 20 65 73 74 c3 a1 20 75 64 2e 3f
10進数では次のようになります:
194 191 68 195 179 110 100 101 32 101 115 116 195 161 32 117 100 46 63
それでは、それぞれにエンコーディング関数を適用してみましょう:
$194^{64013} です。 \ʕ-̫͡-ʔ̫͡-ʔ \ʕ-̫͡-ʔʔ \ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ \bmod 28199 = 18384$
暗号文は:
15626 19445 27982 22746 2679 7739 16824 23107 9054 23107 8378 16412 22746 5566 9054 881 16824 17864 18384
解読するには、
$15626^{6797}である。 \ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ \⑭27982^{6797} ⑯191$
$27982^{6797 \ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ \bmod 28199 = 63$元のメッセージを取り戻す!
ところで
対称型暗号は非常に高速なので、まず秘密鍵を生成して、公開鍵暗号で保護した回線で送信するとよいでしょう。 2450>Cryptographic Hashing
ハッシュ、別名フィンガープリント、チェックサム、メッセージダイジェストは、暗号化ハッシュ関数によってメッセージから生成されるビットパターン(通常約160ビット)です。 ハッシュが安全であるためには、
- ある値にハッシュするメッセージを見つけること(一方通行性)
- 同じ値にハッシュする二つのメッセージを見つけること(耐衝突性)
数学的には、暗号ハッシュ関数$H$はメッセージからハッシュを生成する。 H(m) = c$で、$c$から$m$を効率的に決定できず、$H(m_1) = H(m_2)$ となる $m_1 \ m_2$ を効率的に求められない。
通常、メッセージ中のたった1ビットを変更するだけで、ダイジェストは全く異なるものになる。
Steve Friedl’s Illustrated Guide to Cryptpgraphic Has を参照してください。
Message Authentication Codes
Hash がメッセージそのものを使用するのに対し、これらは秘密鍵を使用することを除いて暗号ハッシュと似ています。
$MAC(m, k) = c$
詳細:
- MACs vs. MACs (英語):MACs vs. MACs (英語):MACs。 Hashes at StackOverflow
- Digital Signatures at Wikpedia
- MACs at Wikipedia
Digital Signatures
Bob はメッセージがアリスから来たことをどうやって確認できるのですか?アリスがそれに署名してくれることによって、それが方法です。 実際には、メッセージ全体ではなく、ハッシュに署名するのが普通です。
RSA for Digital Signatures
アリスがボブにメッセージを送信する場合。
- アリスはmを自分の秘密鍵で暗号化する
- アリスはボブの公開鍵で暗号化する
- ボブは自分の秘密鍵で復号する
- ボブは復号する際に アリスの公開鍵
$m = A(B'(A'(m)))$
DSA
Wikipediaにて
Cryptanalysis
これは大きなテーマなのでここでは取り上げません。 その代わりに、テクニックのリストを紹介します。
- Frequency Analysis
- Known plaintext attack
- Known ciphertext attack
- Chosen plaintext attack
- Chosen key attack
- Linear cryptanalysis
- Differential cryptanalysis
- Theft
Bribery
- Blackmail
Programming Examples
Heh, we are not going to show how to roll your own crypto.暗号解読について独習するか、楽しいオンライン講座を見つけること。
IPネットワーク上でデータを送信していますか?
TLSを使用してください。
いくつかの楽しい暗号ライブラリを使用したい場合は、読んでください。
JavaScript Examples
Reference: Node crypto
.
Python Examples
Reference:Python cryptographic libraries -Python hashlib
-Python secrets