5: 暗号解読に挑戦(i)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res...

27
5: 暗号解読に挑戦 (I)

Upload: others

Post on 03-Jul-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

5: 暗号解読に挑戦(I)

Page 2: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

本日の講義内容

宿題2の答え

暗号通信とは

関数、サブルーチン

レポート3の説明

現代の暗号通信方

2

Page 3: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

宿題2について

Page 4: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

宿題2 問1:最大値

4

array = list(map(int, input("a = ").split()))# 以下が計算部分

max_v = -100000 # マイナス無限大と言える数

max_j = -1for j in range(len(array)):

print("max_v =", max_v)

print("max_j =", max_j)

max.py

宿題(1)

$ python max.pya = -3 8 19 -4max_v = 19max_j = 2

$

Terminal

最大値 = 𝑚𝑎𝑥(𝑎0, 𝑎1, … , 𝑎𝑛−1)

Page 5: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

宿題2 問2:英小文字のみ

5

ss = input("文字列を入力しよう: ")

aa = ss.encode("ascii")for i, code in enumerate(aa):

abcPrint.py

宿題(2)

$ python abcPrint.py文字列を入力しようIce%%creamcecream

$

英小文字のみ画面に出力するプログラムを作ろう.

ヒント:'a'のASCIIは97あるいはord('a'); 'z'は122

Page 6: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

暗号通信

6

送信者 受信者

盗聴者①

② ③

④◎

通信文を見られても,その内容がわからいように符号化して通信すること

データを保管する場合など必ずしも通信しない場合もある

暗号通信の基本的な流れ

Page 7: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

シーザー暗号

歴史

‣Julius Caesar (100BC-44BC) が使ったと言われる方式

方法

‣各文字をアルファベット上 で k字シフト換字

7

a b c d e f g h ... w x y za b c d e f g h ... w x y zalright!

d e f g h i j k ... z a b c

k = 3

douljkw!

(k 字先の文字に換えること)

例)

Page 8: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

暗号通信

暗号方式 (cipher)

‣暗号文を作る方法(暗号化,復号)(一般的:暗号通信のやり方)

暗号化 (encryption)

‣暗号文を作ること

復号 (decryption)

‣暗号文から平文に戻すこと

秘密鍵 (private key)

‣暗号化・復号に必要な鍵

8

alright! douljkw!

平文(cleartext) (ciphertext)暗号文

暗号化

復号

Page 9: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

関数とサブルーチン

Page 10: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

暗号に戻ると

暗号関数

復号関数

例)

10

字シフト換字して作った暗号文

字逆シフト換字して戻した平文

enc( 3, "Good") = "Grrg"dec( 3, "Grrg") = "Good"

Page 11: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

関数

11

x = int(input("x="))

y = int(input("y="))

prod = 0 # 積

while y > 0:

prod = prod + x

y -= 1

print("x*y->", prod)

add.py

mult.py

x = int(input("x="))

y = int(input("y="))

product = 0 # 積

while y > 0:

# product = product+x

y_prime = x

sum = product

while y_prime>0:

sum += 1

y_prime -= 1

product = sum

y -= 1

print("x*y->", product)

x = int(input("x="))

y = int(input("y="))

res = x # 和

while y>0:

res += 1

y -= 1

print("x+y=", res)

掛算を±=1 と繰り返しのみで実現する

Page 12: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

関数

12

x = int(input("x="))

y = int(input("y="))

prod = 0 # 積

while y > 0:

prod = add(prod, x)y -= 1

print("x*y->", prod)

add.py

mult.py

x = int(input("x="))

y = int(input("y="))

product = 0 # 積

while y > 0:

# product = product+x

prod = add(prod, x)

y -= 1

print("x*y->", product)

def add(x, y):res = x # 和

while y>0:

res += 1

y -= 1

return res

掛算を±=1 と繰り返しのみで実現する

Page 13: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

関数

13

def mult(x, y):prod = 0 # 積

while y > 0:

prod= add(prod,x)

y -= 1

return prod

add.py

mult.py

x = int(input("x="))

y = int(input("y="))

product = mult(x, y)

print("x*y->", product)

def add(x, y):res = x # 和

while y>0:

res += 1

y -= 1

return res

掛算を±=1 と繰り返しのみで実現する

Page 14: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

掛算を±=1 と繰り返しのみで実現する

def add(x, y):res = x

while y>0:

res += 1

y -= 1

return res

def mult(x, y):prod = 0 # 積

while y > 0:

prod= add(prod,x)

y -= 1

return prod

x = 入力データy = 入力データprint(mult(x, y))

関数def add(x, y):res = x

while y>0:

res += 1

y -= 1

return res

足算の関数の定義

IN: 2個の値 x, yOUT: x+y

def add(x, y):res = x

while y>0:

res += 1

y -= 1

return res

14

x, yは引数呼び出した時の値を持つ変数

res, x, yはローカル変数関数の計算時にしか存在ない

return文で計算終了resの値は帰り値

add(.)関数の評価/呼び出し結果はprod + x

Page 15: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

関数?数学 vs. Python

15

数学の関数 Pythonの関数

何かを何かに対応させる関係,写像を書いたもの

関数をどうやって計算するかの手順を書いたもの

別名:メソッド (method)サブルーチン (subroutine)

def double(x):

res = x # 和

while x>0:

res += 1

x -= 1

return res

01234

01234

Page 16: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

宿題3

Page 17: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

宿題

17

def enc(k, m):

msg = list(m.encode("ascii"))

c = ...return c

##### プログラム本文 #####k = 3hirabun = input("Hirabun:")angobun = enc(k, hirabun)print(angobun)

宿題 (1)

レポート

復号関数も同様にプログラム化しよう

a = list(m.encode("ascii"))

c = bytes(b).decode("ascii")

[0] [1] [2] [3] [4]

T o k y o 文字列(平文)m

84 111 107 121 111文字コートの配列a

84 114 110 98 114文字コートの配列b

T r n b r文字列(暗号文)c

各々+k だけずらす計算

Page 18: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

宿題

18

ALPHABET = range(ord('a'), ord('z')+1) # 英字文字アルファベット

bun = input("Enter a string:") # 入力文字列から改行除法

cc = list(bun.encode("ascii")) # 文字列 → 文字コードの配列

for i, moji in enumerate(bun): # mojiはbunのi文字目を得る (iは0から始まる)

code = cc[i] # その文字のコードを得る

offset = code - ALPHABET[0] # 文字 a との差分

if code in ALPHABET: # 小文字アルファベットなら

print(moji, ": ", code, ", ", offset) # 差分まで表示する

else: # そうでない時は

print(moji, ": ", code) # 差分は表示しない

(参考)

Page 19: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

暗号・複合・解読

プロジェクト3

Page 20: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

暗号解読に挑戦

20

1. 暗号解読プログラムの使い方の説明.(5)

2. 暗号解読プログラムの仕組みの説明.(10)

3. 工夫した点も書くこと (~5)

注) 採点者はソースコードは読まない,という仮定のもとに書くこと.付録:暗号化,復号,暗号解読のプログラムコード(あれば OK) (5)

レポート#3内容 (数字は配点:満点 20)

〆切OCWiの締め切り.〆切を過ぎると受け取らない場合もある.なお事前提出も可能.

レポート事前提出先: OCWi

Page 21: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

暗号解読に挑戦

21

レポート#3で作成すべきプログラム

1. 暗号化プログラム(enc) caesar.py2. 復号プログラム(dec) caesar.py3. 工夫:暗号解読プログラム kaidoku.py, hira.txthira.txtは下記の暗号文を解読した内容でファイルを作る。

暗号文は https://www.coord.c.titech.ac.jp/c/compsci/crypto/ht.txt

Page 22: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

現代の暗号通信方式

Page 23: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

4. 現代の暗号通信方式

シーザー暗号: ローマ皇帝シーザーが使ったと言われる方式エニグマ: 第二次世界大戦時にドイツ軍が使った方式DES, AES: 現在使われている代表的な暗号方式

暗号方式の進化

秘密鍵暗号方式

秘密鍵

公開鍵暗号方式

1980 年頃

公開鍵・・・皆に知らせてよい鍵,暗号化に使う

秘密鍵・・・復号に使う

Page 24: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

4. 現代の暗号通信方式

秘密鍵暗号方式

これでやりとりしようね

公開鍵暗号方式

これで送ってね

・・・

Page 25: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

4. 現代の暗号通信方式

秘密鍵暗号方式これでやりとりしようね

公開鍵暗号方式

うちにはこれで送って下さい

Page 26: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

4. 現代の暗号通信方式

公開鍵暗号方式

これで送ってね

・・・ ・・・

c平文の全候補

m1

m2

・・・ mj

・・・

どれかは当たる

暗号文 c

わしならわかる

全部調べたら100 億年かかる !!

Page 27: 5: 暗号解読に挑戦(I)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res 足算の関数の定義 IN: 2個の値x, y OUT: x+y def add(x, y): res = x while y>0:

もう少し知りたい...

28

暗号解読by

The Code Book

Simon SinghAug. 2000

日本語版

Kindle版

英語版

シーザー暗号

量子暗号