- PR -

Java 3DES暗号化時のキーについて

1
投稿者投稿内容
アッチ
会議室デビュー日: 2006/04/23
投稿数: 3
投稿日時: 2006-04-23 20:15
初めて投稿させていただきます。
現在、Javaアプリで3DESでの暗号化/復号化を行いたいと考えております。
ここで使用するキーですが、JavaではKeyGeneratorクラスを用いて
キー生成ができると思いますが、暗号化/復号化で使うキーはこのクラスで生成することが必須なのでしょうか?
自分で好きなように作ったバイト配列(3DESの規格に合うサイズの)ではダメなのでしょうか?
今回、キーはユーザが任意に指定した文字をMD5でハッシュ化したものを用いようと思っております。一度試した限りではこの方法で暗号化/復号化できたので良いのでは?と思っているのですが、ご存知の方がいらっしゃいましたらご教授お願いいたします。
sia
常連さん
会議室デビュー日: 2004/05/02
投稿数: 38
投稿日時: 2006-04-23 22:29
こんばんは。

暗号化技術にそれほど詳しくないので、的はずれかもしれませんが、

>キーはユーザが任意に指定した文字をMD5でハッシュ化

というのは、3回ユーザさんにパスワードを入れてもらうといことですか?
もし、一度切りだとせっかくの3DESがただのDESになってしまいますが。

それと、ユーザさんがうったパスワードを暗号化鍵として使うと、
パスワードと同等の暗号化強度しか得られないように思うのですが。

もし、考慮ずみでしたらごめんなさい。
アッチ
会議室デビュー日: 2006/04/23
投稿数: 3
投稿日時: 2006-04-23 23:06
ご返答ありがとうございます。

>もし、一度切りだとせっかくの3DESがただのDESになってしまいますが。
ごめんなさい。私の勉強不足でした。
今回お伺いしたいのは
パスワードはKeygeneratorクラスで生成する必要はないか?
ということでした。

>それと、ユーザさんがうったパスワードを暗号化鍵として使うと、
>パスワードと同等の暗号化強度しか得られないように思うのですが。
内部的にはユーザが打ったパスワードをMD5で暗号化したり、
バイト配列を入れ替えたりしてそれをキーに使用しようと思っております。
このこのキー生成の処理は完全に外部(ユーザ)からは見えない処理にしようと考えております。

以上、よろしくお願いいたします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-04-24 10:56
SecretKeySpecで出来ると思いますよ。
引用:

アッチさんの書き込み (2006-04-23 23:06) より:
内部的にはユーザが打ったパスワードをMD5で暗号化したり、
バイト配列を入れ替えたりしてそれをキーに使用しようと思っております。
このこのキー生成の処理は完全に外部(ユーザ)からは見えない処理にしようと考えております。


でも、3DESな必要ないですね。鍵がDESの強度すらないのですから。
実装を隠すことは暗号学的に意味がないことはご存知ですか?
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2006-04-24 12:04
3DESの鍵は単なるデタラメな数値ではダメで、構造を持っており、「間違った鍵」というのが存在し得ます。その構造を満たさなくても暗号化復号ができるかもしれませんが、3DESとしての相互運用性はないし、暗号としての強度もなくなるでしょう。

あと、鍵を乱数でさえない情報から作るのは論外です。値域が狭くなるので破りやすくなります。

鍵は素直にKeyGeneratorで生成して、その鍵を管理するためにパスワードを使用したらいかがですか。
アッチ
会議室デビュー日: 2006/04/23
投稿数: 3
投稿日時: 2006-04-24 23:09
あしゅさん、siaさん、スフレさん、ご返答ありがとうございました。
キーに関してはやはりgeneratorを使って生成することにしました。
大変参考になりました。ありがとうございました。
Kit
会議室デビュー日: 2005/08/19
投稿数: 12
投稿日時: 2006-04-24 23:59
こんにちは。私の興味ある分野であることと私の知識の確認のためもありまして補足的に記載させていただきます。

暗号は隠すことによりセキュリティーレベルを保つものではありません。理由として暗号は必ず解読できるからです。例えば毎日ずっーーーーーーーと、すべての鍵候補を試せばいつかは暗号化に用いた暗号鍵が見つかり解読が可能となりますよね?暗号の強度の基準は現実の時間でいかに解読できないかという観点でもうけられています。つまり隠すことによる安全確保は無意味です。

また暗号学的な見地からいえばDESを使い暗号鍵にキークラスを使うのは必須ではありません。ただし、暗号鍵を作るには乱数を必ず使うべきです。乱数を使うことによって鍵の値がうまく分散しますし、鍵を推測するのが難しくなります。(暗号技術で使える乱数なら厳密には推測は不可能)また乱数にも色々と性質があり、暗号鍵に用いる乱数は予測不可能性または再現不可能性という性質をもった乱数を使わなくてはなりません。
そこでどの乱数がいいとか伝えたいですが、暗号はとてつもなく奥が深く、また特許権などの問題も発生しますし、まだまだ勉強不測で....。

私もJavaの標準ライブラリを使ったほうがよいと思います。暗号は突っ込みどころが満載の分野ですので色々突っ込まれると大変ですしね。

細かい実装規定を勉強されたいならFIPS PUB 140-2などをご覧になってはいかがでしょうか?
http://www.ipa.go.jp/security/enc/CRYPTREC/fy15/documents/SecReq0308.pdf
では、失礼します。
1

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