3

文字列としての鍵と、DES を使用した暗号化ファイルが与えられました。それが私が知っているすべてです。キーがどのようにエンコードされたかはわかりません。

復号化に使用できるdes.exeもあります。インターネットで見つけたのはこれだけです。-ストレージファームウェア/

des.exe を使用する場合、動作するコマンドは「-d」ではなく「-D」のみです。

私の目標は、Java を使用して同じことを行うことです。どっかからコピペした

    String key = "blah";
    DESKeySpec dks = new DESKeySpec(key.getBytes());
    SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
    SecretKey desKey = skf.generateSecret(dks);
    System.out.println(desKey);

    Cipher cipher = Cipher.getInstance("DES"); // DES/ECB/PKCS5Padding for SunJCE

    if (mode == Cipher.DECRYPT_MODE) {
        cipher.init(Cipher.DECRYPT_MODE, desKey);
        CipherOutputStream cos = new CipherOutputStream(os, cipher);
        doCopy(is, cos);
    }

そしてそれはうまくいきません。

文字列をキーに変換する際の他のオプションは何ですか?

おそらく、私は暗号化の完全な初心者です。

4

3 に答える 3

2

desの SunOS マニュアル ページ(des.exe のベースになっているようです) は、キーが次のように生成されることを示しています。

DES アルゴリズムでは、下位ビットが奇数パリティ ビットであると想定される 8 バイトのキーが必要です。ユーザーが提供する ASCII キーは、8 バイトになるようにゼロが埋め込まれ、上位ビットは奇数パリティ ビットに設定されます。次に、DES アルゴリズムは各 ASCII 文字の下位ビットを無視しますが、そのビットの情報はパリティにより上位ビットに保存されています。

また、実行しているモードに関係なく、最初の IV は常にゼロになることにも言及しています。

CBC モードの操作では、常に初期化ベクトルにすべてゼロの初期値が使用されるため、ファイルの最初の 8 バイトは、CBC モードでも ECB モードでも同じように暗号化されます。

また、使用されるパディングは、使用されるパディング バイトの数を示す、最後のバイトが常に 0 ~ 7 の値になるように記述されています。これは PKCS5Padding に似ているので、おそらくうまくいくでしょう。

DES の CBC モードと ECB モードでは 8 バイト単位で暗号化する必要があるため、des コマンドで暗号化されるファイルには 1 ~ 8 バイトが追加され、8 バイトの倍数になります。復号化された最後のバイトは、最後の 8 バイトのうち保存されるバイト数 (0 から 7) を示します。入力に追加された他のバイトは、暗号化の前にランダム化されます。

使用していることを示したオプションに基づいて、暗号に DES/CBC/PKCS5Padding を使用しているようです。

キーを実際に導出する方法を決定するだけだと思います。exampledepotでこのサンプル コードを見つけました。文字列のパスワードを 8 バイト (1 文字あたり 1 バイトなので、UTF エンコーディングはありません) に変換し、それを例のコードに挿入してキーを導出するだけでよいと思います。とにかく一見の価値があります。

于 2011-08-11T06:01:13.683 に答える
0

DES キーは 7 (明らかに SunJCE は 7 を使用しますか?) または 8 バイトです。提供された文字列が 7 バイトか 8 バイトかを確認してください。もしそうなら、それは生の鍵である可能性が高いです。そうでない場合は、何らかの方法でエンコードできます。16 進エンコーディングの見返りとして、0x のプレフィックスまたは h のサフィックスがあり、すべての文字は 0 ~ 9、AF の範囲になります。確かに自分で 16 進数から変換したり、Web 上のコードを使用したりできますが、私は通常、Apache コモンズ ライブラリ (http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex. html)。

とはいえ、これは憶測であり、キーだけの問題であるという結論に飛びつくことができるかどうかはわかりません. 主張されている暗号化アルゴリズムに関する他の情報はありますか? あなたが引用した実行可能ファイルが「-d」で動作する場合、暗号化はCBCモードのプレーンDESのようです:

-b : DES を使用して ecb 暗号化モードで暗号化します。デフォルトは cbc モードです

(複数の可能なモードがあります。http://download.oracle.com/javase/1.4.2/docs/guide/security/jce/JCERefGuide.html#AppAを参照してください)

暗号を「DES/CBC」に設定してみます。

繰り返しますが、これをどのように解釈すればよいかわかりません。

デフォルトはトリプル CBC です

このスニペットを使用して、システムで使用できる暗号を確認できる場合があります: http://www.java2s.com/Code/Java/Security/ListAllProviderAndItsAlgorithms.htm

于 2011-08-11T06:01:39.490 に答える
0

C#でも同じ問題がありました。結局解決しました。ここで私の答えを見ることができます: C# の DES 初期化ベクトル

通常、des.exe が行うことは、DES を使用してチェックサムを計算することです。したがって、各暗号化ステップは、出力配列を進めるのではなく、前の結果を使用しています。

于 2013-11-26T15:25:07.777 に答える