JCE ・暗号化 ・ストリーム ・メッセージダイジェスト 4adm3207 高橋龍一 4adm2122 穴澤圭二 準備 Javaフォルダに移動して…… mkdir JCE cp ~zirai/Java/JCE ./JCE cp ~kyuuri/Java/JCE/exam ./JCE JCEとは? JCEとは「java暗号化拡張機能」というものです RSAでは計算式を自分で書いていましたが、こ れは用意された関数を使ってできます 暗号化 暗号には主に共通鍵暗号と公開鍵暗号とよば れるものがあり 代表的なものとして 共通鍵: DES ・ AES 公開鍵: RSA というのがあります 共通鍵暗号 ・1つの鍵で暗号化、複合化出来る方法のこと 例にすると・・・ 文Aがあら われた! 文Aは元に 戻った! 文Aは暗号化さ れた! 鍵Aを使って 暗号化 鍵Aを使って 復号化 ※暗号化も復号化も使っている鍵は同じ 鍵ってなに? 鍵とは、具体的にデータ(文)をどのように加工するか、と いうときに使う別のデータです アルゴリズムというのは考え方なので、両者を組み合わ せることによって暗号化 (復号化) します。 たとえば・・・ ・「ある数字を暗号化したい」というとき「1桁ごとに2を加え る」という暗号化処理をするとします ・ある数字を235とすると データ:235 鍵 :2 アルゴリズム:一桁ごとに加算 となります こんな感じ 「235」を一桁ごとに「2」加算するので 2→4、3→5、5→7 に暗号化処理 暗号文は「457」 鍵データ「2」と 二つを組み合わ せて・・・ データ「235」を 一桁ごとに加算というア ルゴリズム 457に暗号化! DESとAES DESというのは共通鍵暗号の規格です。暗号化アルゴ リズムや鍵長などを定めています。 ですが、DESは解読されてしまいました ・ そこでDESに代わる共通鍵暗号の規格としてAESが作 られたのです DES.java javaを使って暗号化したい! import javax.crypto.*; 頭のimportのところに必要 秘密鍵の作り方 KeyGenerator kg = KeyGenerator.getInstance(“アルゴリズム"); 鍵のアルゴリズムを設定 SecretKey sk = kg.generateKey(); 設定した秘密鍵を生成 DES.java ・暗号化、復号化のしかた ・Cipher ch = Cipher.getInstance(“アルゴリズム/運用 モード/パディング"); 暗号化、複合化するときの アルゴリズム/運用モード/ パディング方式 を決定 ・ch.init(Cipher.ENCRYPT_MODE, sk); 鍵skで暗号化するモードに初期化 ・ch.init(Cipher.DECRYPT_MODE, sk); 鍵skで復号化するモードに初期化 DES.java byte[] m = "Hello Des World".getBytes(); “”内が平文 byte[] c = ch.doFinal(m); byte[] m2 = ch.doFinal(c); 平文を暗号化 暗号文を復号化 演習 DES.javaを改良し,AESで暗号化が出来るか試 せ. アルゴリズムの部分を変えればOKです DES.java 追加 byte[] m2=ch.doFinal(c);の後に String s1= new String(c); String s2 = new String(m2); System.out.println(“c=“+s1); System.out.println(“m2=“+s2); Stringに直して 表示します と入れると暗号化、複合化できたかどうかを表示すること ができます 鍵を指定しよう ・DESKey.javaでは鍵を指定すること ができるようになります DES.javaでは鍵を指定することはでき ません 鍵を指定できる秘密鍵をつくる 鍵データを設定 byte[] key = new byte[64/8]; 8バイトを指定しています key[0]~key[7]までの8つを使います ・for(int i =0; i < key.length; ++i){ key[i] = (byte)i; } 鍵データに使うデータを入力しています DESkey.java import javax.crypto.spec.*; import java.security.*; ・DESKeySpec= new DESKeySpec(key); ・最初の 8 バイトを DES 鍵の鍵データとして使用します (DESKey.java では、8~11行目で鍵データを設定) SecretKeyFactory:KeyGeneratorのかわり にこちらを使います DESKey.java補足 ※for(int i =0; i < key.length; ++i) System.out.println("鍵"+ i +" = "+key[i]); この一文を追加すると鍵データが表示されるようになります ・bytestr(byte b[])は、byte配列の中身をそのまま見れる ようにStringに直す関数です 演習 DESKey.javaを改良し, 鍵をランダムな数値列 にするDESKey2.javaを書け. ランダム関数を使って解いてみてください 演習のヒント ランダム関数を使うので頭に import java.util.Random; をいれる nextInt()メソッドについて Random rnd = new Random(); rnd.nextInt(int x); 0~(x-1)までの乱数をint型で返します 例:rnd.nextInt(100); 0~99までの乱数が出ます
© Copyright 2024 ExpyDoc