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

Post on 03-Jul-2020

6 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

本日の講義内容

宿題2の答え

暗号通信とは

関数、サブルーチン

レポート3の説明

現代の暗号通信方

2

宿題2について

宿題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)

宿題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

暗号通信

6

送信者 受信者

盗聴者①

② ③

④◎

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

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

暗号通信の基本的な流れ

シーザー暗号

歴史

‣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 字先の文字に換えること)

例)

暗号通信

暗号方式 (cipher)

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

暗号化 (encryption)

‣暗号文を作ること

復号 (decryption)

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

秘密鍵 (private key)

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

8

alright! douljkw!

平文(cleartext) (ciphertext)暗号文

暗号化

復号

関数とサブルーチン

暗号に戻ると

暗号関数

復号関数

例)

10

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

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

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

関数

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 と繰り返しのみで実現する

関数

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 と繰り返しのみで実現する

関数

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 と繰り返しのみで実現する

掛算を±=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

関数?数学 vs. Python

15

数学の関数 Pythonの関数

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

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

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

def double(x):

res = x # 和

while x>0:

res += 1

x -= 1

return res

01234

01234

宿題3

宿題

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 だけずらす計算

宿題

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) # 差分は表示しない

(参考)

暗号・複合・解読

プロジェクト3

暗号解読に挑戦

20

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

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

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

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

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

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

レポート事前提出先: OCWi

暗号解読に挑戦

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

現代の暗号通信方式

4. 現代の暗号通信方式

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

暗号方式の進化

秘密鍵暗号方式

秘密鍵

公開鍵暗号方式

1980 年頃

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

秘密鍵・・・復号に使う

4. 現代の暗号通信方式

秘密鍵暗号方式

これでやりとりしようね

公開鍵暗号方式

これで送ってね

・・・

4. 現代の暗号通信方式

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

公開鍵暗号方式

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

4. 現代の暗号通信方式

公開鍵暗号方式

これで送ってね

・・・ ・・・

c平文の全候補

m1

m2

・・・ mj

・・・

どれかは当たる

暗号文 c

わしならわかる

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

もう少し知りたい...

28

暗号解読by

The Code Book

Simon SinghAug. 2000

日本語版

Kindle版

英語版

シーザー暗号

量子暗号

top related