情報セキュリティ第 3 回 大久保誠也 静岡県立大学経営情報学部 はじめに 情報セキュリティの技術 暗号 古典的な暗号 演習 : シーザー暗号 演習の解説 今日の資料は http://flute.u-shizuoka-ken.ac.jp/~s-okubo/ の 授業関係 から取ることができます 2/39 近頃のニュース等 LINE Amazon 楽天 で検索 偽セキュリティソフト で検索 情報セキュリティの技術 3/39 4/39 情報理論と暗号 この授業で出てくる内容 情報理論の応用 情報圧縮 画像や音楽のデジタルデータを圧縮.... が 個,が2 個 誤り訂正 通信路上で誤りが起きたとき 検出 訂正 ---- 通信 間違いを検出 訂正 暗号今回の話 5/39 基礎的な部分 2 進数と計算 ( 他の科目でやっているはず ) 6 進数 一方向関数とハッシュ値 疑似乱数 応用的な部分 暗号技術 認証技術 実際の通信で何が行われているか 6/39
進数とは " ブロック " 個で ( 違う大きさの ) " ブロック " となる 45 の意味することは 4 5 2 進数とは " ブロック "2 個で ( 違う大きさの ) " ブロック " となる 2 の意味することは 2 個のブロックが 個のブロックが集まったもの が4つ 個集まったもの がつ 2 4 個のブロック が 5 つ 5 7/39 2 個のブロックが 2 個集まったブロックが 2 個集まったブロック がつ 2 3 2 個のブロックが 2 個集まったブロック が つ 2 2 個のブロック 個のブロックががつ 2 個集まった 2 ブロック がつ 2 8/39 6 進数とは " ブロック "6 個で ( 違う大きさの ) " ブロック " となる ~9とA~Fまでの6 個の記号で表現する 6 進数 進数 6 進数 進数 6 進数 進数 5 5 A 6 6 B 2 2 7 7 2 C 3 3 8 8 3 D 4 4 9 9 4 E 5 F 9/39 6 進数への変換 6 進数から 進数 : 2 進数から 進数と同様 進数から6 進数 : 2 進数から 進数と同様 6 進数から2 進数 : 右の表のようになる 6 進数 2 進数から6 進数 : D 4 桁毎に区切って E 右の表 F 2 進数 6 進数 2 3 4 5 6 7 8 9 A B C 2 進数 /39 排他的論理和 2つの値のうち 片方のみがのときに 両方がもしくはのときには となる計算 XOR EORともいう x 記号は y x y /39 暗号技術 2/39 2
電子メールは非常に便利 からメールが来た 電子メールは危険な場合も () からメールが来た にメールを 早い 安い 簡単 情報化社会に欠かせないツールに 3/39 盗聴 覗き見してやろう Eve 盗聴 A:> 文章がそのまま流れるので 悪い人に情報が漏れる! 4/39 電子メールは危険な場合も (2) なりすまし の名を語ってメールをだ! Eve A:> からメールが来た 他人を語ってメールを投げられる! 本当に本人から来たのか? 5/39 電子メールの危険な部分 - まとめ 盗聴の危険性 文章内容がそのままネット上を流れる! 間に悪意のある人がいると 情報が覗かれる! なりすましの危険性 他人になりすますことが容易! 本当に その人からメールが来たのか 確認できない! 暗号の技術で すべて解決! 6/39 暗号の目的 平文 ( 送りたい文 ) を暗号化し 暗号文にする この際 鍵を使用する 平文 This is a pen. (6 進数表記 ) 54686973269732627656E2EA 鍵 test 暗号文 ;zb j 暗号化されていると 元の文章がわからない (6 進数表記 ) 883BCA7AA746D3DCADCE425C6AAC 7/39 対策 : 暗号化 あ! 送り間違えた! 極秘 暗号化することで機密性を保てる 暗号化されていて よくわからんなぁ 極秘 暗号化 : 第三者が見てもわからないように変換すること 8/39 3
暗号の歴史 () シーザー暗号文字ずらすことで暗号化 復号 ex 暗号化 :DOG GRJ ( 各文字を 3 文字分後にずらす ) 復号 :GRJ DOG ( 各文字を 3 文字分前にずらす ) 単純換字暗号文字を置き換える表に従って暗号化 復号 ex 表 :a v, b d, c a 暗号化 :abc vda ( テーブルの対応に従って各文字を置き換え ) 復号 :vda abc 暗号の歴史 (2) 多表式換字暗号文字を置き換える表を複数使用する 転置式暗号文字の並ぶ順番を入れ替える ex: 文字目を3 文字目に 2 文字目を 文字目に 3 文字目を4 文字目に 4 文字目を2 文字目に置く 暗号化 :cats asct 復号 :asct cats スーパー暗号これらの方式を組み合わせた物 現代暗号へ ( テーブルの対応に従って各文字を置き換え ) 9/39 2/39 演習 : シーザー暗号 シーザー暗号で行いたいこと シーザー暗号文字ずらすことで暗号化 復号 ex 暗号化 :DOG GRJ ( 各文字を 3 文字分後にずらす ) 復号 :GRJ DOG ( 各文字を 3 文字分前にずらす ) 文字を 3 文字ずらす処理を, MS-Excel で行えれば良い 2/39 22/39 文字と文字コード 各文字は文字コードというコードにより 計算機内部では扱われている さまざまなコードの割り当て方が存在している SHIFT_JIS :94 4c ISO-222-JP(JIS) :47 2d EUC-JP :c7 ad UTF-8 :e7 8c ab 猫 という文字は このように表現 23/39 出てくる Excel の関数 CODE(x) ( 文字列 x の先頭文字の ) 文字コードを返す CHAR(x) コード番号 x に対応した文字を返す MOD(x, y) x を y で除算した余りを返す 24/39 4
演習 : シーザー暗号 () 演習 : シーザー暗号 () 何文字分ずらすか 3 a 3 a 平文 ( 暗号化したい文字 ) =CHAR(B5) 25/39 =CHAR(B5) 26/39 演習 : シーザー暗号 () B3にある文字の文字コードを求める 3 aは97 eは bは98 ac は 99 dは zは22 演習 : シーザー暗号 () B2の文字数ずらした文字を求める B4-97 : B4の文字がaから何文字あとかを計算 B4-97+3: 3 文字ずらす MOD( 3 略, 26): zの次はaにする必要があるので 26のあまりを求める a MOD( 略 )+97: a の文字コード (97) を足す =CHAR(B5) 27/39 =CHAR(B5) 28/39 演習 : シーザー暗号 () 演習 : シーザー暗号 (2) 3 a 文字コードを =CHAR(B5) 文字にする 29/39 セルの内容を右のセルにもコピー 3/39 5
演習 : シーザー暗号 (3) 演習 : シーザー暗号 (4) 文字を 文字ずつ入力してみよう 値を変えてみましょう 3 文字ずれた暗号文が生成されたか確認しよう 3/39 さっきとは異なった暗号文が生成されたか確認しよう 32/39 Visual Studio で ( 前半 ) Visual Studio で ( 後半 ) その/2: #include<stdio.h> 2 2 3 3 int main(){ 4 4 int i,key; 5 5 char plain_text[2],cipher_text[2]; 6 6 7 7 printf(" 文字列してください n"); 8 8 scanf("%s",plain_text); 9 9 printf(" ずらす文字数してください n"); scanf("%d",&key); 33/39 その2/2: for(i=;i<strlen(plain_text);i++){ 2 2 cipher_text[i]='a'+(plain_text[i]-'a'+key)%26; 3 3 printf("%c->%c n",plain_txt[i],cipher_txt[i]); 4 4 } 5 5 cipher_text[i]=' '; 6 6 7 7 printf(" 暗号文は %s %s です n",cipher_text); 8 8 } 34/39 C 言語における文字列 () C 言語では 文字列は配列として扱うことができる 例えば 文字列 "test" が サイズの文字型の配列 stに保存されているなら st[] st[] st[2] st[3] st[4] st[5] st[6] st[7] st[8] st[9] t e s t 文字列の最後には NULL がつきます ( つきます というか つけます ) C 言語における文字列 (2) NULL がないと どうなるのか? st[] st[] st[2] st[3] st[4] st[5] st[6] st[7] st[8] st[9] t e s t g o m i この が違う文字だと st[] st[] st[2] st[3] st[4] st[5] st[6] st[7] st[8] st[9] t e s t - g o m i 計算機 計算機 文字列を扱うときには 文字列の末尾に NULL がついているかどうかが重要になる 文字列は test と 文字列は test-test と 36/39 6
解説 () 解説 (2) Excel のときと同様にして 3 文字ずらす その/2: #include<stdio.h> 2 平文と暗号文を 2 3 int main(){ 保存する配列を準備 3 4 4 int i,key; 5 5 char plain_text[2],cipher_text[2]; 6 6 7 7 printf(" 文字列してください n"); 8 8 scanf("%s",plain_text); 平文を読み込み 9 9 printf(" ずらす文字数してください n"); scanf("%d",&key); 37/39 その2/2: strlen() は 文字列の長さを返す関数 2 2 3 3 4 4 for(i=; i<strlen(plain_text); i++){ cipher_text[i]='a'+(plain_text[i]-'a'+key)%26; printf("%c->%c n",plain_txt[i],cipher_txt[i]); } 5 5 6 6 cipher_text[i]=' '; 暗号文の末尾にNULLを付加 7 7 printf(" 暗号文は %s %s です n",cipher_text); 8 8 } 38/39 課題の提出 今日の MS-Excel のファイルを経情グループウェアから提出する ファイル名は学籍番号 c.xls とすること ( 学籍番号は自分の学籍番号すること ) グループ名は H28_ 情報セキュリティ です ユーザー ID とパスワードは ユニバーサルパスポート等と同じです 39/39 7