暗号技術 ~JAVAプログラム②~ (6週目) 石川 真悟
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
現時点までにできているプログラムの説明 1:import java.io.*; //ファイルへの入出力を扱う 2: import java.util.*; //ファイルを読み込む 3: 4:class FileOpen4 5:{ 6: public static void main(String[] args) throws IOException 7: { 8: BufferedReader br; //バッファからデータを取り出すために使うクラス 9: 10: br=new BufferedReader(new 11: InputStreamReader(System.in)); //キーボードから入力したバイト単位のデータを文字として読み込んで //バッファにためる為のオブジェクトを生成し、そのオブジェクトに //BufferedReader型の変数brでアクセスできるようにする 12: System.out.print(“ファイル名をタイピングしてください:"); 13: 14: String filename=br.readLine(); //filenameにキーボードから入力した文字列を格納 15: br=new BufferedReader(new FileReader(filename)); //filenameの中身をbrに持たせる
16: String str; 17: int k=0; 18: int count=0,tmp; 19: final int bit=0x0001; //finalをつけると値を変更できなくなる 20: char[] cary; //caryを2バイトの文字を表すchar型の配列で定義 21: while((str=br.readLine())!=null) //str=br.readLine()がnullになるまで繰り返す 22: { 23: System.out.println(count+":"+str); 24: 25: cary=str.toCharArray(); //与えられたString型の文字列strを1文字ずつに分けて //char型の配列caryに格納 26: System.out.print(count+":"); 27: for(int i=0;i<cary.length;i++) 28: { 29: for(int j=0;j<16;j++) 30: {
31: tmp = cary[i]&(bit<<(15-j)); //求める。<<は左に15-j動かし右から0を15-j付け足す 32: tmp >>= 15-j //>>=は15-j右にシフトする 33: if(tmp==1) 34: { 35: System.out.print("1"); 36: k = 16-j; //左から16、15、…1 37: } 38: else 39: { 40: System.out.print("0"); 41: k = 0; 42: } 43: sum += k; //16ビットで1のあるとこの数の合計 44: } 45: System.out.print("["+cary[i]+"] "); 46: System.out.println("sum="+ sum +" ");
47: System.out.println(); 48: count++; 49: } 50: br.close(); 51: 52: System.out.println("2つの素数P,Qを入力してください。"); 53: br=new BufferedReader(newInputStream Reader(System.in)); 54: System.out.print("P="); 55: String str1 = br.readLine(); 56: System.out.print("Q="); 57: String str2 = br.readLine(); 58: System.out.println("P="+ str1 + ",Q="+ str2); 59: int p, q, n; 60: p = Integer.parseInt(str1); 61: q = Integer.parseInt(str2); 62: n = p * q; 63: System.out.println("N="+ n); 64: int f, m, a, b; 65: a = p-1; 66: b = q-1;
67: int d=1, l; 68: if(p>q) 69: { 70: f = a % b; 71: if(f==0) 72: { 73: l = a; 74: System.out.println("L="+ l); 75: } 76: else 77: { 78: do 79: { 80: d++; 81: l = a * d; 82: f = l % b; 83: 84: }while(f!=0); 85: System.out.println("L="+ l); 86: } 87: }
88: else if(p<q) 89: { 90: m = b % a; 91: if(m==0) 92: { 93: l = b; 94: System.out.println("L="+ l); 95: } 96: else 97: { 98: do 99: { 100: d++; 101: l = b * d; 102: m = l % a; 103: }while(m!=0); 104: System.out.println("L="+ l); 105: } 106: }
107: else if(p==q) 108: { 109: l = a; 110: System.out.println("L="+ l); 111: } 112: else 113: System.out.println("エラーです。"); 114: } 115:}
実行例