はじめに 情報セキュリティ 第04回 大久保誠也 静岡県立大学経営情報学部 はじめに 現代暗号とは 秘密鍵暗号と公開鍵暗号 秘密鍵暗号 秘密鍵暗号の構成要素例 演習:秘密鍵暗号の構成要素 演習:C言語でおこなうシフト演算 1 2/28 日常で使用されている暗号 現代暗号 日常でも、結構、暗号は使用している。 Webブラウジング ユニバーサルパスポート(Web学生支援システ ム) Webショッピング 携帯電話の通話内容 意識していなくても、機械が勝手に暗号化された通信 を行ったりしてくれる。 そういう仕組みになっている。 3/28 4/28 firefoxで見るhttps(1) firefoxで見るhttps(2) ユニバーサルパスポート(Web学生支援システム)は、 通信が暗号化されています。 大学のTOPページから、 Web学生支援システムにア クセスしてみましょう。 5/28 httpsで通信している時、FirefoxのURLバーは次のよう になります 鍵の部分をクリックしてみましょう。 6/28 firefoxで見るhttps(3) firefoxで見るhttps(4) 認証局(今回はやりませんが、安全性に密接に関係 します)等が表示されます。 詳細を表示させることも可能です。 どの程度の暗号強度なのかも表示されます。 7/28 8/28 firefoxで見るhttps(5) 暗号の目的 httpsでも、正しくない証明書の場合(つまり、安全な 通信でない場合)は、次のようになります。 平文(送りたい文)を暗号化し、暗号文にする。 この際、鍵を使用する。 平文 This is a pen. (16進数表記) 5468697320697320612070656E2E0A 鍵 test 暗号文 ;zB¥j https://trisha/ にアクセスしてみましょう (16進数表記) 883BC0A17AA746D3DCADCE425C6A10AC 10/28 9/28 シーザー暗号では弱い 暗号化されていると、 元の文章がわからない。 現代暗号の安全性の根拠 シーザー暗号 文字ずらすことで暗号化・復号 ex 暗号化:DOG → GRJ (各文字を、3文字分後にずらす) 復号 :GRJ → DOG (各文字を、3文字分前にずらす) 基本的に、どんな暗号でも、時間をかければ、いずれ 必ず解ける。 安全であるとは『実時間で解くのは難しい』ということ。 数学的な難しさに、安全性の根拠を求めることが多い この数学の問題は難しそうだ! 今使うには、欠陥が多い。 単純すぎる。 鍵が26パターンだけ。総当たりで発見できる。 等々…… 11/28 これ元にして暗号を作れば、きっと安全だ! 本当に簡単に解けないかは、証明されていない (方法を、今の人類が知らないだけの可能性も) 12/28 因数分解は難しい? 因数分解は、現在の計算機では、非常に時間がかか る問題であると考えられています。 15=3*5は簡単にわかる。 では、75462131は? 正解は、7591*9941。 このぐらいなら、計算機で解けるけど、桁数が大きくな るほど難しくなる! 公開鍵暗号と秘密鍵暗号 13/28 2種類の暗号方式 暗号と鍵 共 平文から暗号文を生成するとき、鍵を使用する。 鍵を利用して暗号化 平文 暗号文 復号するときも鍵を使用する。 適切な鍵を利用しないと、平文に戻せない。 正しい鍵で 複合 暗号文 14/28 公 正しい鍵以外では 複合できない 平文 暗号文 秘密鍵方式 暗号化も複合も、同じ鍵を使用する。 秘密鍵を使用する。鍵は秘匿しておく必要がある。 一般的に、処理が軽い。 変な 15/63 15/28 文 秘 公開鍵方式 暗号化と復号で、異なる鍵を使用する。 公開鍵と秘密鍵があり、秘密鍵は秘匿し、公開鍵 は公開しておく。 一般的に、処理が重い。 16/28 秘密鍵暗号 暗号化も復号も、同じ鍵を使用する。 共 秘密鍵 秘密鍵暗号 共 平文 共 暗号文 暗号文 平文 秘密鍵は第三者に渡してはいけない。 処理が軽いため、大きい平文を暗号化できる。 17/28 18/28 秘密鍵のイメージ 秘密鍵暗号による通信 ③ 「秘密鍵」で復号 暗号化も復号も、同じ鍵を使用する。 共 Bob ID PASSWD ① 「秘密鍵」で 暗号化 ID あsdふぁsd Jlkjぇwkf ② 送信 PASSWD 鍵を持っている人は開けることができて、 鍵を持っていない人は開けることができない 共 あsdふぁsd Jlkjぇwkf 盗聴しても、 復号できな い……。 Alice 19/28 20/28 鍵配送問題 Bob 共 ① 「秘密鍵」で 暗号化 ID 秘密鍵暗号の構成要素例 PASSWD Alice 盗聴する ぞ! 秘密鍵、持って無い! 送ってもらうわけにも いかないしなぁ 21/28 構成要素の要件 排他的論理和 暗号文は平文に戻すことができる必要がある! 2つの0,1の値が同じなら0に、 異なっていたら1になる。 記号は で書かれることが多い。 平文+鍵 → 暗号文 暗号文+鍵 → 平文 では、そのような処理はどういうものか? 少なくとも、可逆でなければならない 秘密鍵暗号方式では、 比較的単純な動作を組み合わせることで 実現していることも多い 22/28 x y x・y 0 0 1 1 0 1 0 1 0 1 1 0 ビット毎の排他的論理和の例: 00101101 ・ 10110101 10011000 23/28 10011000 ・ 10110101 00101101 もとの データと 一緒 24/28 順番の入れ替え(1) 順番の入れ替え(2) シフト ビットごとに、ある規則に従って入れ替える。 すべてのビットを右か左に、おなじだけずらす。 右と左は繋がっている。 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 1 1 0 1 逆に入れ替えると、もとに戻る。 0 0 1 0 1 1 0 1 1 0 0 1 1 1 0 0 逆向きに同じだけシフトすると、もとに戻る。 25/28 26/28 他の方法 表にしたがって入れ替える。 (表にしたがって逆に戻すと、元に戻る) ある一定の規則にしたがって、0や1を付け加える。 (ある一定の規則にしたがって、0や1を取り除くと 元に戻る) 小さいサイズに分割する。 (結合すると元に戻る) 演習:秘密鍵暗号の構成要素 等々 27/28 28/28 暗号化:順番の入れ替え(1) 暗号化:初期準備 右に3ビットシフトします。 鍵と平文を入力しておきましょう。 =G2 29/28 =H2 =F2 =I2 =B2 =C2 =D2 =E2 30/28 暗号化:順番の入れ替え(2) 暗号化:排他的論理和 25ページ目と同じような入れ替えを行います。 =D3 =C3 鍵とのビット毎の排他的論理和を行います。 =H3 =B3 =IF(B$1=B4,0,1) =G3 =F3 =I3 これらも同様 (B5をコピーすればOK) =E3 31/28 暗号化:以上を繰り返す 32/28 復号:初期準備 繰り返します 鍵と暗号文を入力しておきましょう。 コピー 最後の列が暗号文 33/28 復号:順番の入れ替え(2) 復号:排他的論理和 25ページ目の逆順の入れ替えを行います。 鍵とのビット毎の排他的論理和を行います。 =IF(B$13=B14,0,1) 34/28 これらも同様 (B15をコピーすればOK) 35/28 =D15 =C15 =G15 =B15 =H15 =F15 =E15 =I15 36/28 復号:順番の入れ替え(1) 復号:以上を繰り返す 左に3ビットシフトします。 繰り返します コピー =E16 =F16 =D16 =G16 =H16 =I16 =B16 =C16 最後の列が平文 37/28 38/28 やってみよう 課題の提出 平文は10111001、暗号文は11111111。 鍵は何でしょう? 今日のMS-Excelのファイルを経情グループウェアか ら提出する。 ファイル名は学籍番号の末尾にdをつけたものとする。 グループ名は『H26_情報セキュリティ』です。 実際の暗号では、もっと複雑な式を、もっと長 大な鍵を用いて暗号化しています。 39/28 40/28 課題の概要 演習: C言語で行うシフトと ビット演算 41/28 今回は、C言語で シフト演算 ビット演算 を行います。 42/28 C言語における シフト演算とビット演算 使用例 1: C言語では >> , << でビットシフトを実行できる #include<stdio.h> #include<stdio.h> 88 >> >> 1; 1; // // 100を右に1ビットシフトして010に 100を右に1ビットシフトして010に int int main(){ main(){ short short int int test; test; test=8; test=8; // // 0000000000000100 0000000000000100 C言語では、&, | , ~, ^ でビット毎のand, or, NOT, XORが計算できる。 88 || 1; 1; // // 100と001にのORを計算して、101になる。 100と001にのORを計算して、101になる。 }} コンパイルは gcc gcc sample08a.c sample08a.c として行う。 printf("%d printf("%d ¥n",test); ¥n",test); printf("%d printf("%d ¥n",test ¥n",test >> >> 1); 1); printf("%d ¥n",test printf("%d ¥n",test >> >> 2); 2); printf("%d ¥n",test << 1); printf("%d ¥n",test << 1); printf("%d printf("%d ¥n",test ¥n",test << << 2); 2); 43/28 44/28 使用例 1:解説 使用例 2: #include<stdio.h> #include<stdio.h> int int main(){ main(){ int int test; test; #include<stdio.h> #include<stdio.h> 8は2進数だと1000 で表される。 test=8; test=8; // // 1000 1000 }} printf("%d printf("%d ¥n",test); ¥n",test); printf("%d printf("%d ¥n",test ¥n",test >> >> 1); 1); printf("%d printf("%d ¥n",test ¥n",test >> >> 2); 2); printf("%d printf("%d ¥n",test ¥n",test << << 1); 1); printf("%d printf("%d ¥n",test ¥n",test << << 2); 2); 1000の2ビット左シフトは 100000。10進数の32。 int int main(){ main(){ コンパイルは printf("%d printf("%d ¥n", ¥n", 10 10 && 6); 6); // // 1010 1010 && 0110 0110 == 0010 0010 printf("%d 1010 || 0110 printf("%d ¥n", ¥n", 10 10 || 6); 6); // //gcc 1010sample08b.c 0110 == 1110 1110 gcc sample08b.c printf("%d printf("%d ¥n", ¥n", 10 10 ^^ 6); 6); // // 1010 1010 || 0110 0110 == 1100 1100 として行う。 }} 1000の1ビット右シフトは 100。10進数の4。 1000の2ビット右シフトは10。 10進数の2。 1000の3ビット右シフトは1。 10進数の1。 45/28 46/28 使用例 3: #include<stdio.h> #include<stdio.h> int int main(){ main(){ int int i; i; int int test; test; 課題の提出 コンパイルは gcc gcc sample08c.c sample08c.c として行う。 test=6; test=6; // // 110 110 }} 使用例1~3の実行結果と、2と3がどのような計算を してそのような出力をしたかの説明をつけて、提出す る。 ファイル名は学籍番号の末尾にeをつけたものとする。 グループ名は『H26_情報セキュリティ』です。 for(i=0;i<=3;i++){ for(i=0;i<=3;i++){ printf("------i=%d printf("------i=%d ¥n",i); ¥n",i); printf("%d printf("%d ¥n",test ¥n",test && ii ); ); printf("%d printf("%d ¥n",test ¥n",test || ii ); ); printf("%d printf("%d ¥n",test ¥n",test ^^ ii ); ); }} 47/28 48/28
© Copyright 2024 ExpyDoc