Document

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までの乱数が出ます