DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DES暗号化処理で「既知の弱いキー・・・」

環境/言語:[VB.NET]
分類:[.NET]

文字列を暗号化するを参考にさせて頂き
(http://dobon.net/vb/dotnet/string/encryptstring.html)
暗号化・復号化を作成させて頂いたのですが
Keyに"1111111111111111"や"0000000000000000"を指定した場合
「指定されたキーは、'DES' の既知の弱いキーなので使用できません。」となり
エラーとなってしまいます。

これはエラーとならずに処理を続行させる事はできないでしょうか?
■No25613に返信(たらさんの記事)
> 文字列を暗号化するを参考にさせて頂き
> (http://dobon.net/vb/dotnet/string/encryptstring.html)
> 暗号化・復号化を作成させて頂いたのですが
> Keyに"1111111111111111"や"0000000000000000"を指定した場合
> 「指定されたキーは、'DES' の既知の弱いキーなので使用できません。」となり
> エラーとなってしまいます。
>
> これはエラーとならずに処理を続行させる事はできないでしょうか?

スルーされたらだめでしょうか?
■No25614に返信(ともさんの記事)
> ■No25613に返信(たらさんの記事)
>>文字列を暗号化するを参考にさせて頂き
>>(http://dobon.net/vb/dotnet/string/encryptstring.html)
>>暗号化・復号化を作成させて頂いたのですが
>>Keyに"1111111111111111"や"0000000000000000"を指定した場合
>>「指定されたキーは、'DES' の既知の弱いキーなので使用できません。」となり
>>エラーとなってしまいます。
>>
>>これはエラーとならずに処理を続行させる事はできないでしょうか?
>
> スルーされたらだめでしょうか?

ご回答ありがとうございます。

すみません、スルーとは
On Error Resume Nextの一文を加えてみるという事でしょうか?
> すみません、スルーとは
> On Error Resume Nextの一文を加えてみるという事でしょうか?

Try Catch 文 の Catch ブロック内で例外をキャッチし、何もせずにスルーすることです。

例:

Try
    Dim value As String = EncryptString("テストです。", key)

    MessageBox.Show(value)
    MessageBox.Show(DecryptString(value, key))
Catch ex As CryptographicException
    ' 何もしない
End Try

しかし今回のケースだと、そもそも脆弱キーを指定していること自体が問題なので、
(同一文字を16個並べたキーは、簡単に解読できる脆弱キー!)
脆弱キーを使わせないよう、IsWeakKey メソッドで事前に判定させ弾くようにした方がいいと思います。

http://msdn.microsoft.com/ja-jp/library/system.security.cryptography.des.isweakkey(VS.85).aspx
えー、一応念のため。
脆弱キー・半脆弱キーを Key に設定したことによって例外が出たとき、その設定は無視されます(多分、GenerateKey で作り直されています)。
結局、脆弱キー・半脆弱キーは設定不可能です。
ひらぽん様、Hongliang様

ご回答ありがとうございます。
なるほど。という事は、とりあえず何でもOKで暗号化・復号化できる
処理を作ろうと思ったら、はなから自分で作らないといけないんですね。
いえ、別にそんなことはありませんが。
キーが IsWeakKey とか IsSemiWeakKey だったらそのキーの MD5 ハッシュ(の一部)をキーとして用いるとかでも十分ですし。
// ただし暗号化と復号をそれぞれ別のアプリケーションがやる場合、こういう小細工は問題があります。
DES/TripleDES 以外の暗号化アルゴリズムを使うことも考えられます。
■No25634に返信(たらさんの記事)
> なるほど。という事は、とりあえず何でもOKで暗号化・復号化できる
> 処理を作ろうと思ったら、はなから自分で作らないといけないんですね。

セキュリティのガイドラインか、もしくは暗号関連の記事だったか忘れましたが、
独自の暗号化処理を作成するのは非推奨だと MSDN で見た覚えが・・・
Rfc2898DeriveBytesだったか辺りのキー派生関数を使うのが常道です。

わかりにくければ単にハッシュするのでもいいですが、
本来は単なるハッシュは余り良くはありません。とはいえ、現状よりはましにはなります。

まあ暗号アルゴリズム自体もRjindael辺りにしとく方がいいと思います。
単なるハッシュだと非常に運が悪いと同じ問題が起こる可能性はありますので。
皆様ありがとうございました。
インフルエンザで寝込んでおりました。。。

皆様の助言を参考に
いろいろやってみたいと思います。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板