5: 暗号解読に挑戦(i)ichiji/cs-19/cs1-5.pdfres = x while y>0: res += 1 y -= 1 return res...
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/1.jpg)
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/2.jpg)
本日の講義内容
宿題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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/3.jpg)
宿題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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/4.jpg)
宿題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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/5.jpg)
宿題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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/6.jpg)
暗号通信
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/7.jpg)
シーザー暗号
歴史
‣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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/8.jpg)
暗号通信
暗号方式 (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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/9.jpg)
関数とサブルーチン
![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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/10.jpg)
暗号に戻ると
暗号関数
復号関数
例)
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/11.jpg)
関数
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/12.jpg)
関数
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/13.jpg)
関数
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/14.jpg)
掛算を±=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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/15.jpg)
関数?数学 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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/16.jpg)
宿題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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/17.jpg)
宿題
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/18.jpg)
宿題
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/19.jpg)
暗号・複合・解読
プロジェクト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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/20.jpg)
暗号解読に挑戦
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/21.jpg)
暗号解読に挑戦
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/22.jpg)
現代の暗号通信方式
![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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/23.jpg)
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/24.jpg)
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/25.jpg)
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/26.jpg)
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:](https://reader033.vdocuments.mx/reader033/viewer/2022060500/5f1a20d99caaad2eee49719b/html5/thumbnails/27.jpg)
もう少し知りたい...
28
暗号解読by
The Code Book
Simon SinghAug. 2000
日本語版
Kindle版
英語版
シーザー暗号
量子暗号