暗号技術 ~JAVAプログラム③~ (7週目)

Slides:



Advertisements
Similar presentations
独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
Advertisements

山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
プログラミング第5回 1 while ループ 文字列の操作
第11回Javaゼミ 11.1 ファイルとディレクト リ 11.2 文字ストリーム 11.3 バッファ付き文字スト リーム 2006/06/28 神津 健太.
プログラミング実習 1 ・ 2 ク ラス 第 2 週目 担当教員 : 渡邊 直樹. 課題 2 ● 2 × 2型行列の固有値, 固有ベクトルを求め る EigMatrix.java というプログラムを作成せ よ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示.
アルゴリズムとデータ構造 2012年6月27日
黒澤 馨 (茨城大学) 情報セキュリティ特論(4) 黒澤 馨 (茨城大学) 2017/3/4 confidential.
プログラミング基礎I(再) 山元進.
IO - 入出力 小西 亨.
プログラミング基礎I(再) 山元進.
Applet 岡部 祐典 鈴木 敬幸.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング基礎I(再) 山元進.
プログラミング基礎I(再) 山元進.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
独習Java ・ 10.6  Hashtableクラス ・ 10.7  String Tokenizerクラス  12月12日    小笠原 一恵.
独習Java ・ 12.1  インターネットアドレス ・ 12.2  サーバーソケットとソケット  12月 19日    小笠原 一恵.
String - 文字列 2009年10月9日 7ADD2116 佐藤洋輔.
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
数 学 の か た ち 第3講 暗号を作ろう 早苗 雅史 数学とソフトウエア
繰り返し プログラミング 第4回 繰り返し プログラミング第4回.
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
Bridge Pattern
アルゴリズムとデータ構造 2011年6月20日
情報処理技法 (Javaプログラミング)2 第2回 前期の復習(2)
JAVA入門② 変数と型 式と演算子 制御文.
暗号技術 ~公開鍵暗号方式の仕組み~ (3週目)
第10回 情報セキュリティ 伊藤 高廣 計算機リテラシーM 第10回 情報セキュリティ 伊藤 高廣
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
8.1 例外処理 8.2 catchブロックの検索 8.3 throwステートメント 8.4 例外とエラークラス 8.6 独自の例外
変数のスコープ クラス クラス変数 すべてのメソッドの外側でstaticで定義
数学のかたち 暗号を作ろう Masashi Sanae.
JAVA入門.
サブゼミ第9回 実装編③ 永続化とjava.ioパッケージ.
UDPマルチキャストチャット                    空川幸司.
独習Java ・ 8.1  例外処理 ・ 8.2  catch ブロックの検索  12月 5日    小笠原 一恵.
例外処理 と ファイル入出力 情報システム学科 平塚 聖敏.
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
リファレンスの復習と例外処理 2005年6月14日 海谷 治彦.
リファレンス,配列,例外処理 その他演習に役立つこと
第6回 2007年6月1日 応用Java (Java/XML).
EclipseでWekaのAPIを呼び出す
アルゴリズムとプログラミング (Algorithms and Programming)
暗号技術 ~JAVAプログラム①~ (5週目)
アルゴリズムとデータ構造演習(7月8日) 入出力ストリーム 2019/1/18.
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
5.RSA暗号 素因数分解の困難性を利用した暗号.
ソフトウェア制作論 平成30年11月21日.
「情報セキュリティ論」 2-4 公開鍵暗号の原理とRSA暗号
アルゴリズムとデータ構造 2011年6月23日
オブジェクト プログラミング 第2回 プログラムの基本.
アルゴリズムとプログラミング (Algorithms and Programming)
Diffie-Hellman 鍵共有 ElGamal 暗号 楕円曲線暗号,量子コンピュータ
暗号技術 ~JAVAプログラム②~ (6週目)
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
ソフトウェア制作論 平成30年11月14日.
アルゴリズムとデータ構造 2012年6月25日
さまざまなプログラミング言語, オンライン開発環境
JAVA入門⑥ クラスとインスタンス.
アルゴリズムとデータ構造 2012年6月21日
暗号技術・セキュリティ 情報工学科  04A1004 石川 真悟.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
アルゴリズムとデータ構造1 2007年7月6日
ねらい 数値積分を例題に、擬似コードのアルゴリズムをプログラムにする。
第6章 インターネットアプリケーション 6.1 インターネットアプリケーション 6.2 Javaによるネットワーク処理 6.3 電子メール
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
情報処理技法(Javaプログラミング)1 第8回 同じ処理を何回も繰り返すには?
Presentation transcript:

暗号技術 ~JAVAプログラム③~ (7週目) 石川 真悟

RSAの暗号化処理(公開鍵暗号) 平文の値を「E」回掛け合わせ、この結果の値を「N」で割り、余りの 値を求める。この計算結果が暗号文になる。「E」と「N」は公開鍵の 値になる。 暗号文=平文 mod N E 例)平文12、E=5、N=221 暗号文=12 mod 221 暗号文=207 平文 公開鍵 5 E N 暗号化処理 暗号文=平文 mod N E 暗号化処理そのものは、 とてもシンプルだが、 秘密鍵の情報がわからない限り、 現実的な時間で解読するのは困難 暗号文

公開鍵と秘密鍵は対(ペア)になっている必要があり、この2つのキーのことをキーペアと呼 ぶ。 キーペアの生成手順 公開鍵と秘密鍵は対(ペア)になっている必要があり、この2つのキーのことをキーペアと呼 ぶ。 PとQを使ってNを計算する N=PxQ L=1cm(P-1,Q-1) P-1とQ-1の最小公倍数 PとQを使ってLを計算する 1<E<L god(E,L)=1 EとLの最大公約数が1になるEを求める Lを使ってEを計算する EとLを使ってDを計算する E x D mod L =1 EとDを掛けmodLを計算した値が 1になるようにDを求める

キーペアの生成の具体例 まずPとQの2つの素数を用意(説明を簡単にするため小さい数字で行なう) P=13、Q=17 N=PxQ=13x17=221 L=1cm(P-1,Q-1)=1cm(13-1,17-1)=1cm(12,16) 12と16の最小公倍数は48なのでL=48 1<E<L  god(E,L)=1 God(E,48)=1 Eと48の最大公約数が1になるようなEを求める。 E=5,7,11,13,17,19,23,25,29,31,35,37,41,43,47 この中から素数を1つを選ぶ。ただし、25、35は素数ではないので外す。 仮に5を選ぶ。 ExD mod L=1 5xD mod 48=1 D=29

現時点までにできているプログラムの説明 import java.io.*; //ファイルへの入出力を扱う import java.util.*; //ファイルを読み込む class angouka1 { public static void main(String[] args) throws IOException BufferedReader br; //バッファからデータを取り出すために使うクラス System.out.println("どのくらいの素数を入力したいですか?"); br=new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); int sosu; sosu = Integer.parseInt(str1); int divisor; for(int i = 2; i <= sosu; i++)

divisor = 0; for(int j = 1; j <= i; j++) { if(i % j == 0) divisor++; } if(divisor == 2) int y; y = sosu % i; if(y!=0) System.out.print("素数="); System.out.println(i);

System.out.println("上の中から2つの素数P,Qを入力してください。"); br=new BufferedReader(new InputStreamReader(System.in)); System.out.print("P="); String str2 = br.readLine(); System.out.print("Q="); String str3 = br.readLine(); System.out.println("P="+ str2 + ",Q="+ str3); int p, q, n; p = Integer.parseInt(str2); q = Integer.parseInt(str3); n = p * q; System.out.println("N="+ n); int f, m, a, b; a = p-1; b = q-1; int d=1, l; if(p>q) { f = a % b; if(f==0)

{ l = a; System.out.println("L="+ l); } else do d++; l = a * d; f = l % b; }while(f!=0); else if(p<q) m = b % a; if(m==0)

{ l = b; System.out.println("L="+ l); } else do d++; l = b * d; m = l % a; }while(m!=0); else if(p==q) l = a;

else System.out.println("エラーです。"); System.out.println("Lの値を入力してください。"); br=new BufferedReader(new InputStreamReader(System.in)); System.out.print("L="); String str4 = br.readLine(); int z; z = Integer.parseInt(str4); for(int i = 2; i <= z; i++) { divisor = 0; for(int j = 1; j <= i; j++) if(i % j == 0) divisor++; } if(divisor == 2)

int y; y = z % i; if(y!=0) { System.out.print("E="); System.out.println(i); } System.out.println("上のEの値から好きなEの値を1つ入力してください。"); br=new BufferedReader(new InputStreamReader(System.in)); String str5 = br.readLine(); int x; x = Integer.parseInt(str5); int angou; System.out.print("ファイル名をタイピングしてください:"); String filename=br.readLine(); br=new BufferedReader(new FileReader(filename));

String str; int k=0; int count=0,tmp; final int bit=0x0001; char[] cary; try{ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("暗号化.txt"))); while((str=br.readLine())!=null) { System.out.println(count+":"+str); cary=str.toCharArray(); System.out.print(count+":"); for(int i=0;i<cary.length;i++) int sum=0; for(int j=0;j<16;j++) tmp = cary[i]&(bit<<(15-j)); tmp >>= 15-j;

if(tmp==1) { System.out.print("1"); k = 16-j; } else System.out.print("0"); k = 0; sum += k; System.out.println("["+cary[i]+"] "); System.out.println("sum="+ sum +" "); angou = sum % n; //mod計算(冪乗法) for(int w = 1; w <= x-1; w++) angou *= sum; angou = angou % n;

if(w==x-1) { System.out.println("暗号化した文  字の数値は"+ angou +"です。");  字は"+(char)angou+"です。"); pw.println(angou); } System.out.println(); count++; br.close(); pw.close(); catch(IOException e){ System.out.println("入出力エラーです。");

実行例

実行例

問題点の発見 バイナリ表示をしてkで足し算をしてsumを 計算していたが sumの値で複数の解が得られるため (例) sum=30だった場合、 30=15+13+2という解や 30=14+13+3という解が得られる

import java.io.*; //ファイルへの入出力を扱う import java.util.*; //ファイルを読み込む class angouka { public static void main(String[] args) throws IOException BufferedReader br; //バッファからデータを取り出すために使うクラス System.out.println("どのくらいの素数を入力したいですか?"); br=new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); int sosu; sosu = Integer.parseInt(str1); int divisor; for(int i = 2; i <= sosu; i++) divisor = 0; for(int j = 1; j <= i; j++)

if(i % j == 0) { divisor++; } if(divisor == 2) int y; y = sosu % i; if(y!=0) System.out.print("素数="); System.out.println(i); System.out.println("上の中から2つの素数P,Qを入力してください。"); br=new BufferedReader(new InputStreamReader(System.in)); System.out.print("P="); String str2 = br.readLine(); System.out.print("Q=");

String str3 = br.readLine(); System.out.println("P="+ str2 + ",Q="+ str3); int p, q, n; p = Integer.parseInt(str2); q = Integer.parseInt(str3); n = p * q; System.out.println("N="+ n); int f, m, a, b; a = p-1; b = q-1; int d=1, l; if(p>q) { f = a % b; if(f==0) l = a; System.out.println("L="+ l); } else

do { d++; l = a * d; f = l % b; }while(f!=0); System.out.println("L="+ l); } else if(p<q) m = b % a; if(m==0) l = b; else

{ d++; l = b * d; m = l % a; }while(m!=0); System.out.println("L="+ l); } else if(p==q) l = a; else System.out.println("エラーです。"); System.out.println("Lの値を入力してください。"); br=new BufferedReader(new InputStreamReader(System.in)); System.out.print("L="); String str4 = br.readLine(); int z;

z = Integer.parseInt(str4); for(int i = 2; i <= z; i++) { divisor = 0; for(int j = 1; j <= i; j++) if(i % j == 0) divisor++; } if(divisor == 2) int y; y = z % i; if(y!=0) System.out.print("E="); System.out.println(i); }}

System.out.println("上のEの値から好きなEの値を1つ入力してください。"); br=new BufferedReader(new InputStreamReader(System.in)); System.out.print("E="); String str5 = br.readLine(); int x; x = Integer.parseInt(str5); int angou; System.out.print("ファイル名をタイピングしてください:"); String filename=br.readLine(); br=new BufferedReader(new FileReader(filename)); String str; int k=0,h; int count=0,tmp; final int bit=0x0001; char[] cary; try{ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("暗号化.txt"))); while((str=br.readLine())!=null) {

System.out.println(count+":"+str); cary=str.toCharArray(); System.out.print(count+":"); for(int i=0;i<cary.length;i++) { int sum=0; for(int j=0;j<16;j++) int v=0; tmp = cary[i]&(bit<<(15-j)); tmp >>= 15-j; if(tmp==1) System.out.print("1"); k = 15-j; for(h=0;h<=k;h++) if(h==0) v = 1; }

else { v *= 2; } System.out.print("0"); k = 0; sum += v; System.out.println("["+cary[i]+"] "); System.out.println(Integer.toString(sum, 16)); angou = sum % n; //mod計算(冪乗法) for(int w = 1; w <= x-1; w++) angou *= sum;

angou = angou % n; if(w==x-1) { System.out.println("暗号化した 文字の数値は"+ angou +"です。"); System.out.println("暗号化した文字    は"+(char)angou+"です。"); pw.println(angou); } System.out.println(); count++; br.close(); pw.close(); catch(IOException e){ System.out.println("入出力エラーです。"); }}}

実行例

実行例

実行例

実行例

復号化プログラム

import java.io.*; class fukugouka { public static void main(String[] args) throws IOException BufferedReader br; System.out.println("NとEの値を入力してください。"); br=new BufferedReader(new InputStreamReader(System.in)); System.out.print("N="); String str1 = br.readLine(); int n; n = Integer.parseInt(str1); System.out.print("E="); String str2 = br.readLine(); int e; e = Integer.parseInt(str2);

int p=2; int c=1; while(c!=0) { c = n % p; if(c==0) int q; q = n / p; System.out.println("P="+p+",Q="+q); int a,b,f,m; a = p-1; b = q-1; int d=1, l; if(p>q) f = a % b; if(f==0)

l = a; System.out.println("L="+ l); } else { do d++; l = a * d; f = l % b; }while(f!=0); else if(p<q) m = b % a; if(m==0)

l = b; System.out.println("L="+ l); } else { do d++; l = b * d; m = l % a; }while(m!=0); else if(p==q) l = a; p++;}

System.out.println("Lの値を入力してください。"); br=new BufferedReader(new InputStreamReader(System.in)); System.out.print("L="); String str3 = br.readLine(); int z; z = Integer.parseInt(str3); int d = 1; int l = 48; int s=0,m; while(s!=1) { m = e * d; s = m % z; if(s==1) System.out.println("Dの値は"+d); } d++;

System.out.println("Dの値を入力してください。"); br=new BufferedReader(new InputStreamReader(System.in)); System.out.print("D="); String str4 = br.readLine(); int y; y = Integer.parseInt(str4); int fukugou,g; try { FileReader in = new FileReader("暗号化.txt"); BufferedReader br1 = new BufferedReader(in); String line; while ((line = br1.readLine()) != null) System.out.println(line); g = Integer.parseInt(line); fukugou = g % n; for(int w = 1; w <= y-1; w++)

{ fukugou *= g; fukugou = fukugou % n; if(w==y-1) System.out.println("復号化した文 字の数値は"+ fukugou +"です。"); System.out.println("復号化した文 字は"+(char)fukugou+"です。"); } br1.close(); in.close(); catch (IOException er) System.out.println(er); }}}

実行例

実行例

実行例