- PR -

JDK1.4でトリプルDESを扱う方法

投稿者投稿内容
松川(日々精進)
会議室デビュー日: 2005/01/19
投稿数: 18
投稿日時: 2005-01-19 11:30
初めて投稿させていただきます。
個人情報が登録されているOracle8.1.6データベースが
ありまして、Oracle側サーバとWebサーバ上のサーブレット
間はトリプルDESで暗号化したデータをやりとりをすることに
なりました。

質問1:
サーブレット側はJDKの1.4が使えるので、標準で搭載された
暗号機能にトリプルDESが入っていると思い調べていたのです
が、トリプルDESの機能が実装されているのはJDK1.5からとい
うことがわかり、どうしようかなと悩んでいます。
GNU Cryptというパッケージを入れると、トリプルDESに限らず
色々使えるようになることはわかったのですが、商用利用時の
ライセンスが問題になりそうなのがネックになりそうなので、
それ以外でトリプルDESに対応した暗号化パッケージなどを
どなたかご存知ないでしょうか。サードパーティ製の商品でも
フリーでも結構です。

質問2:
Oracle8.1.6側の問題なのですが、JDBCドライバを調べたところ
Oracle側が正式に動作保証しているものが、JDK1.2までということ
がわかりました。もぐりで1.4のJVMで動作させるという方法も
あるかもしれませんが、責任者がNOを出しているのでデータベース
側はJDK1.2でトリプルDESを扱う必要が出てきてしまいました。
商用、フリーのどちらでもかまわないのですが、JDK1.2で動作する
トリプルDESのパッケージをどなたかご存知内でしょうか。
または、JDK1.4でOracle8.1.6を正式対応とうたっている商用また
はフリーのJDBCドライバなどをご存知ないでしょうか。
長文になってしまいましたがよろしくお願いいたします。


[ メッセージ編集済み 編集者: 松川(日々精進) 編集日時 2005-01-19 11:32 ]
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-01-19 13:54
標準として組み込まれたのは JDK 1.4 からですが、JDK 1.2.x および 1.3.x でも、オプショナルパッケージとして Java Cryptography Extension (JCE) 1.2.2 を利用できます。
詳しくは以下のページをご覧ください。
http://java.sun.com/products/jce/index-122.html

暗号化アルゴリズムはセキュリティプロバイダにより提供されますが、この中に TripleDES (DESede) が入っています。
質問 1 および質問 2 の TripleDES についてはこれで解決されると思います。

# ちなみに、上記のページによると non-commercial reference implementation ですが、
# 次の文で the release may be used royalty-free as part of commercial applications
# と説明されており、商用利用にも問題はないようです。
# (これも正確には software license リンク先をご覧ください。)

JDK 1.4 対応の Oracle 8.1.6 JDBC ドライバについては、ネットで検索したところ、以下のサイトが見つかりました。
http://www.datadirect.co.jp/products/connect/jdbc34/overview.asp

ご参考になれば幸いです。

## ちなみに、紹介したページはどちらも「TripleDES Java」「JDK 1.4 Oracle 8.1.6 JDBC」といったキーワードで見つかりますので、これも参考にしていただけるとよろしいかと思います。
松川(日々精進)
会議室デビュー日: 2005/01/19
投稿数: 18
投稿日時: 2005-01-19 14:24
ご回答どうもありがとうございました。
こちらの製品
http://www.datadirect.co.jp/products/connect/jdbc34/overview.asp
ですが、なるほどJDK1.4とOracle8.1.6の組み合わせでも使えそうです。
それよりも、関連製品に暗号化した通信を行うJDBCがあるみたいですね。
今回やりたいことはできるのではないかな?と思ってしまいました。
Sunの本家に暗号化パッケージがあったんですね。気づかずにお恥ずかしい!。
これで
JDK1.2 + 本家製Oracle8.1.6用JDBCドライバ + トリプルDES
という、構成を言われても対応できそうです。

追記:
SunのJCEのページにて、
http://java.sun.com/j2se/1.4.2/ja/download.html
 無制限強度の管轄ポリシーファイル 1.4.2
というファイルが提供されていることに気づきました。もしや、これをインストール
することでJDK1.4.2環境で使用できる暗号の種類が増えるのかな?。
と思ったのですが、現在インストールしてある素のままのJDK1.4.2_06ではどうなのかな?
と思い、

KeyGenerator kg = KeyGenerator.getInstance("DESede");
Cipher ch = Cipher.getInstance("DESede/ECB/PKCS5Padding");
SecretKey sk = kg.generateKey();
ch.init(Cipher.ENCRYPT_MODE, sk);
byte[] m = cryptString.getBytes("UTF-8");
byte[] c = ch.doFinal(m);

と試してみたところ、NoSuchAlgorithmException例外も出ず上手く暗号化
されてしまいました。ということは、無制限強度の管轄ポリシーファイルの
インストールを行わずにトリプルDESは使えるということで、
ポリシーファイルをインストールすると、暗号鍵のビット数が増えると
か他の暗号方式が使えるようになるとかなんでしょうか。


[ メッセージ編集済み 編集者: 松川(日々精進) 編集日時 2005-01-19 14:44 ]

[ メッセージ編集済み 編集者: 松川(日々精進) 編集日時 2005-01-19 15:50 ]

[ メッセージ編集済み 編集者: 松川(日々精進) 編集日時 2005-01-19 15:56 ]
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-01-19 16:16
引用:

ところで、JDK1.4にJCE1.2.2という組み合わせもいけるのでしょうか。JDK1.3へ
の対応はJCE1.2.2のページに書いてあったのですが。



JDK 1.4 以降では JCE 1.2.2 とほぼ同じものが標準でバンドルされています。
JDK 1.2.x, 1.3.x では JCE 1.2.2 を個別にインストールする必要があるが、JDK 1.4 以降ではインストール不要という違いだけでしょう。
絶対にという保証はできませんが、プログラム互換性の点では大丈夫だと思いますよ。
(ちらっと覗いてみたところ、JDK 1.4.2 では JCE 1.2.2 になかったクラスとインタフェースが一つずつ増えています。API の違いまでは確認していませんが、その他のクラスやインタフェースは、少なくとも名前やパッケージに違いはありませんでした。)

「無制限強度の管轄ポリシーファイル 1.4.2」についてですが、JDK 1.4.2 の jre/lib/security/local_policy.jar は、アメリカ合衆国外に暗号キーを輸出する場合のキー長制限を定義しています。
(DES の場合 64 ビット(パリティを除いて 56 ビット)以上は輸出禁止など)
# 内容は jar に含まれる default_local.policy ファイルに記述されていますが、置き換える際は jar ごと換えてください。

いくつかの国家を除いては輸出制限が緩和されたので、緩和対象国(日本を含む)では件のリンクからダウンロードできるポリシーファイルに置き換えて欲しいという意味だと思います。

引用:

ポリシーファイルをインストールすると、暗号鍵のビット数が増えると
か他の暗号方式が使えるようになるとかなんでしょうか。


厳密に書くと制限されていたキー長が使えるようになったとか輸出禁止だったアルゴリズムが使えるようになったとかですが、この理解で正しいと思います

[ メッセージ編集済み 編集者: Gio 編集日時 2005-01-19 16:21 ]
松川(日々精進)
会議室デビュー日: 2005/01/19
投稿数: 18
投稿日時: 2005-01-20 16:12
Gioさん、お礼が遅くなって申し訳ありませんでした。
JavaでトリプルDESを扱う方法がよくわかりましたので、担当者に
説明したいと思います。
さて、最後に一つだけ質問があります。
 Cipher.getInstance("アルゴリズム/モード/パディング")
で指定する引数ですが、最初のアルゴリズムはDESなどの暗号方式
というのはわかるのですが、モードとパディングの考え方が今ひとつ
しっくりしません。
下のようなコードを作り、どの組み合わせが使えるのかを調べては
みたので、突っ込んだ話になったときにどの組み合わせが使用できる
かを提示することはできると思うのですが、せめてモードとパディング
のことだけでも理解したいと思いました。
最後の質問、どうぞよろしくおねがいします!。

コード:

String[] alg = { "DES", "DESede", "AES", "Blowfish",
"PBEWithMD5AndDES", "PBEWithMD5AndTripleDES",
"Diffie-Hellman", "HmacMD5", "HmacSHA1" };
String[] mode = { "NONE", "CBC", "CFB", "ECB", "OFB", "PCBC" };
String[] padding = { "NoPadding", "OAEPWith", "PKCS5Padding",
"SSL3Padding" };

Cipher ch = null;
for (int x = 0; x < alg.length; x++) {
for (int y = 0; y < mode.length; y++) {
for (int z = 0; z < padding.length; z++) {
try {
String code = alg[x] + "/" + mode[y] + "/"
+ padding[z];
System.out.print(code + " ");
ch = Cipher.getInstance(code);
System.out.println("設定有り");
} catch (Exception e) {
System.out.println(e.getClass().getName());
}
}
}
}






[ メッセージ編集済み 編集者: 松川(日々精進) 編集日時 2005-01-20 16:12 ]

[ メッセージ編集済み 編集者: 松川(日々精進) 編集日時 2005-01-20 16:14 ]
na2fusi
会議室デビュー日: 2003/06/08
投稿数: 16
投稿日時: 2005-01-20 19:31
@「モード」と「パディング」の意味するところがよく分からない。
ASunのJCEで利用できる暗号とモードとパディングの組み合わせが分からない。

どちらですか?
松川(日々精進)
会議室デビュー日: 2005/01/19
投稿数: 18
投稿日時: 2005-01-21 09:45
引用:

na2fusiさんの書き込み (2005-01-20 19:31) より:
@「モード」と「パディング」の意味するところがよく分からない。
ASunのJCEで利用できる暗号とモードとパディングの組み合わせが分からない。

どちらですか?




1の方です。2の方はコードのような方法でシラミ潰しに調べることは
できたのですが、1の方を理解したいなと思いまして。
よろしくお願いいたします。



na2fusi
会議室デビュー日: 2003/06/08
投稿数: 16
投稿日時: 2005-01-21 10:12
DESやBlowfish、AESは共通鍵暗号のうちブロック暗号と呼ばれます。
ブロック暗号とは平文をサイズごとに区切ってそのブロックごとに暗号化していくやり方です。
DESなら8バイトずつです。先頭から8バイトずづ暗号化していきます。

モードというのは「ブロックにどのように暗号を適用するか」です。
EBCモード:各ブロックに単純に暗号を適用する。
CBCモード:
 先頭ブロック:イニシャルベクター(初期ベクトル)と呼ばれるバイト列と
        ブロックのXORを取りその結果に暗号を適用する。
 n番目のブロック:暗号化された(n-1)番目のブロックとXORを取り
        その結果に暗号を適用する。
などなどいろいろあります。

パディングというのは「サイズで区切ったとき最後の余りをどう処理するか」です。
足りない分のバイト列のおぎないかたでいろいろな種類があります。


もっと詳しく知りたければ
http://www.ecom.or.jp/qecom/about_wg/wg05/cr-swg/code2-1.html

等を参考にするとよいでしょう

スキルアップ/キャリアアップ(JOB@IT)